Помогите пожалуйста написать программу "Часы" на Arduino и LCD Keypad Shield 1602 с настройкой часов и минут(это очень важно). Я пытаюсь исходить из кода программы "секундомер", но не знаю как реализовать изменение времени с помощью кнопок. Знаю, что в шильде есть резистивный делитель, и у каждой кнопки свое значение. В интернете полно примеров с "часами реального времени", но там подключено множество библиотек, поэтому я так и не смог разобраться с функцией изменения времени. P.s. Поэтому желательно без подключения других библиотек, кроме как библиотеки для дисплея, чтобы наглядно увидеть и понять код и использовать это в дальнейшем. Код (C++): int h,m,s;// переменные для часов, минут, секунд boolean z; // подключаем библиотеку индикатора #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); unsigned long previousMillis = 0; const long interval = 1000; void setup() { Serial.begin(9600); lcd.begin(16, 2); } void loop() { int keyAnalog = analogRead(A0); if (keyAnalog < 100) { // Значение меньше 100 – нажата кнопка right // Выполняем какое-то действие для кнопки вправо. } else if (keyAnalog < 200) { // Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP // Выполняем какое-то действие для кнопки вверх } unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; s++; // добавляем единицу, равносильно записи s=s+1; // секция подсчета секунд if (s>59) // если значение s больше 59 { s=0; // присваиваем значение 0 переменной s m++; // добавляем 1 к переменной m отвечающей за минуты } // секция подсчета минут if (m>59) // если значение m больше 59 { m=0; // присваиваем значение 0 переменной m h++; // добавляем 1 к переменной h отвечающей за часы } // секция подсчета часов if (h>23) // если значение h больше 23 { h=0; // присваиваем значение 0 переменной h } // секция вывода информации // вывод секунд if (s<10) //если секунд меньше 10 { lcd.setCursor(6, 0); // курсор в 6 позицию 0 строки lcd.print(0); //печатаем 0 lcd.setCursor(7, 0); //курсор в 7 позицию 0 строки lcd.print(s); //печатаем значение переменной s } else { lcd.setCursor(6, 0); //иначе курсор в 6 позицию 0 строки lcd.print(s); // печатаем значение переменной s } lcd.setCursor(5, 0); // курсор в 5 позицию 0 строки lcd.print(":"); // печатаем разделитель между секундами и минутами // вывод минут if (m<10) { lcd.setCursor(3, 0); lcd.print(0); lcd.setCursor(4, 0); lcd.print(m); } else { lcd.setCursor(3, 0); lcd.print(m); } lcd.setCursor(2, 0); // курсор в 2 позицию 0 строки lcd.print(":"); // печатаем разделитель между минутами и часами // вывод часов if (h<10) { lcd.setCursor(0, 0); lcd.print(0); lcd.setCursor(1, 0); lcd.print(h); } else { lcd.setCursor(0, 0); lcd.print(h); } } }
http://arduinolab.pw/index.php/2016/06/23/chasy-na-arduino/ вот те с RTC с без библиотек, только экранчик сменить.
Код (C++): int h,m,s;// переменные для часов, минут, секунд boolean z; // подключаем библиотеку индикатора #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7);// RS E unsigned long previousMillis = 0; const long interval = 1000; int keyAnalog; void setup() { Serial.begin(9600); lcd.begin(16, 2); } void loop() { if ((keyAnalog = analogRead(A0)) < 100) { delay(50); s = 0; m++; if (m > 59) m = 0; m = m; delay(200); } else if ((keyAnalog = analogRead(A0) < 200) && (keyAnalog = analogRead(A0) > 130)) { delay(50); s = 0; h++; if (h > 23) h = 0; h = h; delay(200); } else if ((keyAnalog = analogRead(A0) < 800) && (keyAnalog = analogRead(A0) > 600)) { delay(50); s=0; m=0; h=0; delay(200); } else if ((keyAnalog = analogRead(A0) < 600) && (keyAnalog = analogRead(A0) > 400)){ delay(50); s=0; m--; if (m < 0) m = 59; m=m; delay(200); } else if ((keyAnalog = analogRead(A0) < 400) && (keyAnalog = analogRead(A0) > 200)){ delay(50); s=0; h--; if (h < 0) h = 23; h = h; delay(200); } unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; s++; // добавляем единицу, равносильно записи s=s+1; // секция подсчета секунд if (s>59) // если значение s больше 59 { s=0; // присваиваем значение 0 переменной s m++; // добавляем 1 к переменной m отвечающей за минуты } // секция подсчета минут if (m>59) // если значение m больше 59 { m=0; // присваиваем значение 0 переменной m h++; // добавляем 1 к переменной h отвечающей за часы } // секция подсчета часов if (h>23) // если значение h больше 23 { h=0; // присваиваем значение 0 переменной h } // секция вывода информации // вывод секунд if (s<10) //если секунд меньше 10 { lcd.setCursor(6, 0); // курсор в 6 позицию 0 строки lcd.print(0); //печатаем 0 lcd.setCursor(7, 0); //курсор в 7 позицию 0 строки lcd.print(s); //печатаем значение переменной s } else { lcd.setCursor(6, 0); //иначе курсор в 6 позицию 0 строки lcd.print(s); // печатаем значение переменной s } lcd.setCursor(5, 0); // курсор в 5 позицию 0 строки lcd.print(":"); // печатаем разделитель между секундами и минутами // вывод минут if (m<10) { lcd.setCursor(3, 0); lcd.print(0); lcd.setCursor(4, 0); lcd.print(m); } else { lcd.setCursor(3, 0); lcd.print(m); } lcd.setCursor(2, 0); // курсор в 2 позицию 0 строки lcd.print(":"); // печатаем разделитель между минутами и часами // вывод часов if (h<10) { lcd.setCursor(0, 0); lcd.print(0); lcd.setCursor(1, 0); lcd.print(h); } else { lcd.setCursor(0, 0); lcd.print(h); } } }