Новичёк в Си. Залипает сенсорная кнопка.
- Войдите на сайт для отправки комментариев
Пнд, 11/07/2016 - 08:21
При подаче питания на схему запускается процедура "отключения питания" и ожидания включения (по долгому нажатию на одну из двух кнопок). После включения идёт опрос сенсорных китайских кнопок (4 шт). Так вот кнопки "залипают". Руку уже отпустил, а светодиод на кнопке еще горит (и она нажата). Время доходит до 10 секунд. Иногда даже бывают произвольные срабатывания. Однако, если процедуру "отключения питания" пропустить, а перейти сразу к опросу кнопок, то всё работает стабильно. Посмотрите, пожалуйста, скетч. Что бы тут можно было улучшить и как предотвратить "залипание"?
/***********************************************
Подпрограмма включения/выключения
***********************************************/
void Power()
{
int i = 0;
/*************************************
Выключение
**************************************/
digitalWrite(lamp1Pin, 0); // гасим светильники
digitalWrite(lamp2Pin, 0);
lFlag[0]=0;
lFlag[1]=0;
Serial.println("Power OFF (((");
if (digitalRead(ledPin)) { // если лента горела
for (i = 255; i > 0; i--) {
analogWrite(ledPin, i); // потихоноку гасим ее
delay(12); // в среднем за 3 секунды лента потухнет
}// for
}// if // а если лента не горела, то и фиг с ней
digitalWrite(ledPin, 0);
while (digitalRead(lamp1Btn) || digitalRead(lamp2Btn)) delay (100); // ждем отпускания кнопки, если она нажата
Label:
while (!digitalRead(lamp1Btn) && !digitalRead(lamp2Btn)) delay(100); // если кнопки светильников НЕ нажаты, то ждём их нажатия
previousMillis = millis(); //устанавливаем счетчик таймера в текущее значение времени
while (digitalRead(lamp1Btn) || digitalRead(lamp2Btn)) {// если кнопки светильников нажаты, ждём отпускания, или 2 секунды
if ((millis() - previousMillis) > tDush) break; // если нажати более 2 секунд, идём на включение
}//while
/*********************************
Включение
**********************************/
if ((millis() - previousMillis) > tDush) { // Включаем подсветку и систему
Serial.println("Power On!!!");
if (!digitalRead(ledPin)) { // если лента НЕ горела
for (i = 0; i <= 255; i++) {
analogWrite(ledPin, i); // потихоноку зажигаем ее
delay(12); // в среднем за 3 секунды лента засияет в полную силу
}// for
}// if
while (digitalRead(lamp1Btn) || digitalRead(lamp2Btn)) delay (100); // ждем отпускания кнопки, если она еще нажата
}
else {
Serial.println("Upss... < 2 sec.");
goto Label; // если нажатие было менее 2 секунд, то ничего не включаем, а снова ждём.
} // else
}//void
Кстати, в том месте, где идёт бесконечный цикл ожидания включения, все кнопочки тоже работают хорошо.