Новичёк в Си. Залипает сенсорная кнопка.

Нет ответов
pavelkq
Offline
Зарегистрирован: 23.10.2015

При подаче питания на схему запускается процедура "отключения питания" и ожидания включения (по долгому нажатию на одну из двух кнопок). После включения идёт опрос сенсорных китайских кнопок (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

Кстати, в том месте, где идёт бесконечный цикл ожидания включения, все кнопочки тоже работают хорошо.