Касание и частота

Тема в разделе "Arduino & Shields", создана пользователем Andrei777, 16 ноя 2015.

  1. Andrei777

    Andrei777 Нуб

    Добрый день. У меня есть скетч который выводит на LCD дисплей таймер (секунды и минуты) и строчку "errors:" с количеством ошибок. При подаче на цифровой пин 7 логической единицы (5 вольт) в строке "errors:" должна появиться цифра 1, при повторной подаче (касании) цифра 2 и т.д. Но там за счет частоты 16МГц (как мне кажется) при касании контакта пина, происходит быстрый пересчет от 0 до 255 несколько раз. Стягивающий резистор я поставил, но пересчет все ровно очень быстрый. Можно ли сделать программным кодом так, чтобы при одном касании и удержании появлялась только цифра 1, при втором цифра 2, а не этот перебор.
    Код (C++):
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    byte errCnt = 0;
    byte SEC = 0;
    byte MIN = 0;
    unsigned long prMillis = 0;
    const int intpin = 7;
    int CNT_PIN = 0;

    void setup() {
      pinMode(intpin, INPUT);
      lcd.begin(16, 2);
    }
    int isArcTouched() {
      CNT_PIN = digitalRead(intpin);
       if (CNT_PIN == HIGH){
         return 1;
       }  else {
         return 0;
       }
    }
    void increaseErrorCount() {
        errCnt++;
    }
    void showError() {
        lcd.setCursor(2,2);
        lcd.print(" Errors: ");
        lcd.print(errCnt);
        delay(4000);
    }
    void tickClock() {
        if (millis() - prMillis > 1000) {
            prMillis = millis();
            SEC++;
            if (SEC > 59) {
                SEC = 0;
                MIN++;
                if (MIN > 59) {
                    MIN = 0;
                }
            }
        }
    }
    void showClock() {
        lcd.setCursor(1,0);
        if (MIN<10) {
            lcd.print("0");
        }
        lcd.print(MIN);
        lcd.print("\xBC\xB8\xBD");
        lcd.print(" : ");
        if (SEC<10) {
            lcd.print("0");
        }
        lcd.print(SEC);
        lcd.print("ce\xBA ");
    }
    void runClock() {
        tickClock();
        showClock();
    }
    void loop() {
        if (isArcTouched()){
            increaseErrorCount();
            showError();
        } else {
            runClock();
            }
    }
     
  2. Andrei777

    Andrei777 Нуб

    Код (C++):
    void showError() {
        lcd.setCursor(2,2);
        lcd.print(" Errors: ");
        lcd.print(errCnt);
        delay(4000);
    Забыл сказать, что здесь delay(4000) замедляет и сам секундомер и поэтому это решение не подходит. В идеале нужно, чтобы секундомер не останавливался.
     
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    Прочтите любую статью по подключению кнопки.
     
  4. Andrei777

    Andrei777 Нуб

    Ура Сделал!!!
    Код (C++):
    #include <Bounce.h>
    #include <LiquidCrystal.h>

    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    Bounce bouncer = Bounce(7,5);

    byte errCnt = 0;
    byte SEC = 0;
    byte MIN = 0;
    byte cnt = 0;
    byte oldcnt = 1;
    unsigned long prMillis = 0;
    const int intpin = 7;
    int StatePin = 0;

    void setup() {
      pinMode(intpin, INPUT);
      lcd.begin(16, 2);
    }
    int isArcTouched() {
      if ( bouncer.update()) {
        if ( bouncer.read() == HIGH) {
          if (cnt==oldcnt) {
            cnt=!cnt;
            return 1;
          }
        } else {
          oldcnt=cnt;
          return 0;
        }
      }
    }
     
    void increaseErrorCount() {
        errCnt++;
      }
    void showError() {
        lcd.setCursor(2,2);
        lcd.print(" Errors: ");
        lcd.print(errCnt);
    }
    void tickClock() {
        if (millis() - prMillis > 1000) {
            prMillis = millis();
            SEC++;
            if (SEC > 59) {
                SEC = 0;
                MIN++;
                if (MIN > 59) {
                    MIN = 0;
                }
            }
        }
    }
    void showClock() {
        lcd.setCursor(1,0);
        if (MIN<10) {
            lcd.print("0");
        }
        lcd.print(MIN);
        lcd.print("\xBC\xB8\xBD");
        lcd.print(" : ");
        if (SEC<10) {
            lcd.print("0");
        }
        lcd.print(SEC);
        lcd.print("ce\xBA ");
    }
    void runClock() {
        tickClock();
        showClock();
    }
    void loop() {
        if (isArcTouched()){
            increaseErrorCount();
            showError();
        } else {
            runClock();
            }
    }