Нужно сделать часы реального времени(с модулем RTC3231) с будильником, установка будильника должна производиться через кнопки на LCD1602. Нужна помощь, скетч к будильнику готов, все работает(но установить его можно только в скетче), и возникла большая проблема-как реализовать управление будильника через кнопки( чтобы при зажатии select включался режим установки будильника, выставление через up,down,left,right; и при повторном нажатии select переход в режим часов). Сейчас на дисплей выводятся: часы, минуты, секунды, Помогите, пожалуйста, с кодом. Скетч, которые есть, ниже #include <Wire.h> #include <ds3231.h> #include <LiquidCrystal.h> #define BUFF_MAX 256 //Joystick int joyPin = 18; volatile int buttonState = 0; //LCD const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Buzzer int buzzer_pin = 27; // time when to wake up uint8_t wake_HOUR = 8; uint8_t wake_MINUTE = 5; uint8_t wake_SECOND = 33; // how often to refresh the info on stdout (ms) unsigned long prev = 1000, interval = 1000; void set_alarm(void) { // flags define what calendar component to be checked against the current time in order // to trigger the alarm - see datasheet // A1M1 (seconds) (0 to enable, 1 to disable) // A1M2 (minutes) (0 to enable, 1 to disable) // A1M3 (hour) (0 to enable, 1 to disable) // A1M4 (day) (0 to enable, 1 to disable) // DY/DT (dayofweek == 1/dayofmonth == 0) uint8_t flags[5] = { 0, 0, 0, 1, 1 }; // set Alarm1 DS3231_set_a1(wake_SECOND, wake_MINUTE, wake_HOUR, 0, flags); // activate Alarm1 DS3231_set_creg(DS3231_CONTROL_INTCN | DS3231_CONTROL_A1IE); } void setup() { lcd.begin(16, 2); pinMode(buzzer_pin, OUTPUT); Serial.begin(9600); Wire.begin(); DS3231_init(DS3231_CONTROL_INTCN); DS3231_clear_a1f(); set_alarm(); pinMode(joyPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(joyPin), joyStick, FALLING); } void loop() { Serial.println(digitalRead(joyPin)); char buff[BUFF_MAX]; unsigned long now = millis(); struct ts t; // once a while show what is going on if ((now - prev > interval) && (Serial.available() <= 0)) { DS3231_get(&t); // display current time snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d", t.year, t.mon, t.mday, t.hour, t.min, t.sec); lcd.setCursor(0, 0); lcd.print(t.hour); lcd.print(":"); lcd.print(t.min); lcd.print(":"); lcd.print(t.sec); // Serial.println(buff); // display a1 debug info DS3231_get_a1(&buff[0], 59); //Serial.println(buff); if (DS3231_triggered_a1()) { tone (buzzer_pin, 100); // INT has been pulled low lcd.setCursor(0, 1); lcd.print(" -> triggered"); Serial.println(" -> alarm1 has been triggered"); // clear a1 alarm flag and let INT go into hi-z DS3231_clear_a1f(); } prev = now; } delay(100); } void joyStick() { lcd.clear(); lcd.setCursor(0,0); lcd.print("set"); }
судя по комментам в скетче, вы его не писали, а нашли в инете и скопировали. Теперь ждете, что кто-то вам и установку времени напишет?
Половина скетча была написана самостоятельно. Я не жду, чтобы кто-то написал за меня весь скетч. Мне бы хотелось, чтобы кто-нибудь просто объяснил логику, как это сделать. Дальше могу сам.
А в чем загвоздка? Посмотрите в вики амперки есть ссылки на уроки джереми блюма есть как работать с кнопками. При нажатии на кнопки запоминает параметры в еепром в функции setup восстанавливаете
Какая именно половина? А то что-то не верится, Станиславский не даст соврать. Значения переменных поменяли, да? Пины переназначили, да?
Логика такая, есть глобальная переменная Mode. Она хранит режим работы. Переписать вывод на экран. Сделать одну функцию draw(), которая в зависимости от переменной Mode будет рисовать на экране. При нажатии на другие кнопки будут меняться параметры в зависимости от режимы
Был добавлен вывод на LCD keypad shield, добавил джойстик, бузер. Сам будильник взял с примера библиотеки
да не там никакого скетча...в 2001 году и слово такое не употреблялось. Да и архитектура не AVR. Да я и сам заплатил 700 рублев. Это в ценах 2001 года. У меня доход тогда был 5000 рублев...на сделке...