Я уже давно сделал таймер. Он работал отлично, но день назад что то произошло с секундами. нажимаю на копку иногда как и положенно добавляются секунды, а иногда добавляться куча цифр. Почему это происходить и как это исправить ? Код (C++): // Подключаем библиотеку #include <LiquidCrystal.h> // библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // библиотека для эмуляции Serial порта // она нужна для работы библиотеки GPRS_Shield_Arduino #include <SoftwareSerial.h> // номер на который будем отправлять сообщение #define PHONE_NUMBER "+79215243517" // текст сообщения, которое будем отправлять #define MESSAGE_OK "Automatic watering system was successful." #define MESSAGE_ERROR "Low water." // создаём объект класса GPRS и передаём ему скорость 9600 бод // с помощью него будем давать команды GPRS шилду GPRS gprs(9600);// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> LiquidCrystal lcd(12, 11, 7, 6, 5, 4); //переменная для хранения значений таймера long prevmicros = 0; // счетчик для полусекунд boolean counter = false; //значение секунд int s = 0; //значение минут int m = 0; //значение часов int h = 0; //время настройки помпы //значение секунд int ss = 5; //значение минут int ms = 0; //значение часов int hs = 12;//значение секунд // переменная ошибка int error = 0; //Вывод кнопки настройки текущего времени const int butSetTime = 10; //Вывод кнопки настройки текущего времени const int butSetTimePump = 13; //статус кнопки int butState = 0; int buttonState = 0; //пин помпы int pump = 8; //подсветка lcd int light = 9; //датчк освещенности на А5 const int ldr = 5; //значение для хранения освещенности int val = 0; //количество включений помпы расчитанные по формуле int pump_result; //екость в мл float ml = 100; //время работы помпы в мс float tmc = 5000; //количество включений помпы int pump_on; //аналоговый датчик температуры // конечное значеие вольт float voltage; // конечное зачение тмпературы float temp_c; void setup() { //инициализируем дисплей lcd.begin(16, 2); // pinMode(butSetTime, INPUT); pinMode(pump, OUTPUT); pinMode(light, OUTPUT); //ставим курсор в первую строку первого символа lcd.setCursor(3, 0); //включаем подсветку дисплея digitalWrite(9, HIGH); //выводим сообщение lcd.print("Autopoliv"); lcd.setCursor(3, 1); lcd.print("Download"); // включаем GPRS-шилд gprs.powerUpDown(); // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); while (!Serial) { // ждём пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе } // проверяем, есть ли связь с GPRS-устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS-устройства delay(1000); Serial.print("Init error\r\n"); lcd.setCursor(0, 0); lcd.print("Init error "); } //чистси дисплей lcd.clear(); //расчитываем количество включений помпы pump_result = (ml / tmc) * 1000; } void lcd_light() { //присваиваем val значени счиьанное с анаалогва потра val = analogRead(5); //если значение считанное с А5 < 1000 if (analogRead(ldr) < 1000) //вклюаем подсвтку analogWrite(9, 1023); else //иначе выключаем//иначе выключаем analogWrite(9, 50); } void temp() { // находим конечное знчение вольт voltage = 5.0 / 1024.0 * analogRead(2); //находим конечное значнение температуры temp_c = ( voltage - 0.5 ) * 100; lcd.setCursor(10, 1); //выводим температуру lcd.print(temp_c, 1); lcd.setCursor(14, 1); //значек градуса lcd.print("\x99"); lcd.setCursor(15, 1); //выводим C lcd.print("C"); } void loop() { //считываем значени с кнопки buttonState = digitalRead(butSetTime); //если конопка нажата if (buttonState == LOW) { //добавляем 1 число к продыдущему s++; } if (micros() - prevmicros > 500000) //принимает значение каждые полсекунды { prevmicros = micros(); counter = ! counter; if (counter == false) //переменная секунда + 1 m++; //если переменная секунда больше 59 ... if (s > 59) { //сбрасываем ее на 0 s = 0; //пишем +1 в переменную минута m++; } //если переменная минута больше 59 ... if (m > 59) { //сбрасываем ее на 0 m = 0; //пишем +1 в переменную час h++; } //если переменная час больше 12 ... if (h > 12) { //сбрасываем ее на 0 h = 1; } // //считываем значени с кнопки butState = digitalRead(butSetTimePump); //если конопка нажата if (butState == LOW) { //добавляем 1 число к продыдущему ms++; //если переменная минута больше 59 ... if (ms > 59) { //сбрасываем ее на 0 ms = 0; //пишем +1 в переменную час h++; } //если переменная час больше 12 ... if (hs > 12) { //сбрасываем ее на 0 hs = 1; } } //выводим значение часов lcd.setCursor(0, 0); //добавляем 0 if (h >= 0 && h < 10) { lcd.print("0"); lcd.print(h); }//количество часов else { lcd.print(h); } lcd.setCursor(2, 0); //выводим символ ":"между часами и минутами lcd.print(":"); //выводим значение минут lcd.setCursor(3, 0); //добавляем 0 if (m >= 0 && m < 10) { lcd.print("0"); lcd.print(m); }//количество минут else { lcd.print(m); } lcd.setCursor(5, 0); //выводим символ ":"между часами и минутами lcd.print(":"); //выводим значение минут lcd.setCursor(6, 0); //добавляем 0 if (s >= 0 && s < 10) { lcd.print("0"); lcd.print(s); }//количество секунд else { lcd.print(s); } lcd.setCursor(10, 0); lcd.print(error); lcd.setCursor(12, 0); lcd.print("/"); lcd.setCursor(13, 0); lcd.print(pump_result); // //выводим значение часов lcd.setCursor(0, 1); //добавляем 0 if (hs >= 0 && hs < 10) { lcd.print("0"); lcd.print(hs); }//количество часов else { lcd.print(hs); } lcd.setCursor(2, 1); //выводим символ ":"между часами и минутами lcd.print(":"); //выводим значение минут lcd.setCursor(3, 1); //добавляем 0 if (ms >= 0 && ms < 10) { lcd.print("0"); lcd.print(ms); }//количество минут else { lcd.print(ms); } /* lcd.setCursor(5, 1); //выводим символ ":"между часами и минутами lcd.print(":"); //выводим значение минут lcd.setCursor(6, 1); //добавляем 0 if (ss >= 0 && ss < 10) { lcd.print("0"); lcd.print(ss); }//количество минут else { lcd.print(ss); }*/ //вызываем функцию lcd_light(); temp(); //сравниваем время if (h == hs && m == ms && s == ss) { //ошибка if (error >= pump_result) { //помпа выключена digitalWrite(8, LOW); //показываем картнку lcd.setCursor(7, 0); lcd.print("\x86"); //отправляем сообшение по указанному номеру с заданным текстом // gprs.sendSMS(PHONE_NUMBER, MESSAGE_ERROR); delay(2000); } else { //если все хорошо, включаем помпу digitalWrite(8, HIGH); Serial.println("Start to send message ..."); //выводим каринку lcd.setCursor(7, 1); lcd.print("\x2A"); // отправляем сообщение по указанному номеру с заданным текстом gprs.sendSMS(PHONE_NUMBER, MESSAGE_OK); //считаем количество включений помпы error++; Serial.println(error); //время работы помпы 5 сек delay(tmc); //выключаем помпу digitalWrite(pump, LOW); //удаляем каринку lcd.setCursor(7, 1); lcd.print(" "); } } } }
На мой непросвещенный взгляд - при длительном нажатии (с точки зрения скорости работы кода) к предыдущему добавится несколько значений. Столько, сколько loop крутанется. А если еще учесть срабатывания из-за дребезга... Попробуйте нажатие использовать как начало процедуры обработки ее нажатия. При выполнении условия ее нажатия после задержки проверяете ее "отпущенность" и если она отпущена - увеличивайте значение.