Добрый день. У меня есть скетч который выводит на 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(); } }
Код (C++): void showError() { lcd.setCursor(2,2); lcd.print(" Errors: "); lcd.print(errCnt); delay(4000); Забыл сказать, что здесь delay(4000) замедляет и сам секундомер и поэтому это решение не подходит. В идеале нужно, чтобы секундомер не останавливался.
Ура Сделал!!! Спойлер: Код Код (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(); } }