Тема: Опрацювання натиснення кнопок (усунення брязкоту контактів)
Усім доброго дня! Одразу повідомлю про своє практично нульове знання c++
Попри це взявся опановувати, створюючи реальну річ.
Розробляю мікрокотролерний пристрій на базі плати Arduino, компілятор і IDE хоч теж Arduino, але побудований на основі с++.
Суть проблеми наступна.
У мене до одного аналогового входу підключено 5 кнопок, які через резисторі підключені до 5 В живлення з однієї сторони і до аналогового входу мікроконтролера - з іншої сторони.
Натискання відповідної кнопки подає на аналоговий вхід певну напругу, яку АЦП контролера опрацьовує і перетворює на int значення (від 0 до 1023).
Електроніка має таку специфіку, що, скажімо, при натисненні кнопок певний час відбуваються перехідні процеси (зміна напруги), що має назву "брязкання контактів" (bouncing). Мається на увазі, що у момент натиснення і відпускання кнопки контролер на вході отримує якийсь час купу різних значення напруги, і кожне значення напруги він опрацьовує і відповідно повертає кожен раз різне значення натиснення кнопок.
Діаграма брязкання контактів
У мене стоїть задача розробити опрацювання на подію натиснення кнопки таким чином, щоб не давати змогу контролеру реагувати на оці брязкання (Bouncing).
У моєму розумінні воно має відбуватись так:
Я натискаю кнопку, у коді є прапор натиснення кнопки, скажімо BTevent, який за дефолтом FALSE, а при натисненні стає TRUE.
Потім має відбуватись затримка зчитування значення кнопки, щоб уникнути зчитувань помилкових значень при брязканні. Скажімо, брязкання при натисненні відбувається 20 мілісекунд. Відповідно, оцих 20 мілісекунд контролер не повинен зчитувати значення кнопки. Через 20 мілісекунд відбувається зчитування, і як тільки воно відбулось, зчитування припиняється до відпускання кнопки.
Тепер те саме, але у коді.
Перед цим - голосарій
analogRead(0) - функція, яка повертає значення від 0 до 1023 на вході контролера 0.
1023 - жодна кнопка не натиснута
millis() - функція яка повертає час у мілісекундах від початку запуску контролера
BTtime - змінна, у яку ми записуємо час коли відбулось натиснення кнопки
BTevent - прапор. 0 - кнопка не була натиснута, 1 - кнопка була натиснута
BTread - значення кнопки зчитано? 1 - так, 0 - ні
BTvalue - сюди записуємо значення кнопки
unsigned long BTtime = 0;
int BTevent = 0;
int BTread = 0;
int BTvalue = 0;
void loop {
if (analogRead(0)>1000) //якщо не натиснута
{BTevent = 0; // події не відбувається
BTvalue=analogRead(0);} // просто зчитуємо значення з порта при ненатиснутих кнопках
if (analogRead(0)<1000) // якщо натиснуто
{BTevent = 1; // подія відбулась
BTtime = millis();} // точка початку відліку від початку події
if ( (BTtime + 30) < millis() && BTevent == 1) // чекаємо 30 мс від події і перевіряємо чи відбулась подія
{BTread = 1; // позначаємо, що ми зчитали значення кнопки
BTvalue = analogRead(0);} // записуємо значення кнопки у змінну
if (BTread == 1) // якщо ми зчитали значення, то скидуємо всі прапори
{BTevent = 0;
BTread = 0;}
}
Далі ми маємо опрацювати BTvalue, але то інша справа. Наразі оцей код адекватно не працює можливо, хтось допоможе розмусолити цю тему?
У мережі купа інформації по усуненню брязкоту контаків на цифрових входах, але зовсім немає інформації по усуненню цієї проблеми на аналогових входах при навішаних кількох кнопках....