Новичёк в Си. Залипает сенсорная кнопка.
- Войдите на сайт для отправки комментариев
Пнд, 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
Кстати, в том месте, где идёт бесконечный цикл ожидания включения, все кнопочки тоже работают хорошо.