Всем привет. Пытаюсь реализовать настроку часов кнопками (для примера пока использую только 1 кнопку). Вот код. Как правильно реализовать задуманное??? Считал время во временные переменные, по нажатию кнопки сменил часы - а как теперь записать??? #include <Wire.h> #include "DS1307.h" //Переменные для сохранения данных часов int hr_00 =0; //часы int mn_00 =0; //минуты int sc_00 =0; //секунды const int buttonPin = 2; // Кнопка настройки времени int buttonState = 0; DS1307 clock;//define a object of DS1307 class void setup() { Serial.begin(9600); clock.begin(); //clock.fillByYMD(2013,1,19);//Jan 19,2013 //clock.fillByHMS(15,28,30);//15:28 30" //clock.fillDayOfWeek(SAT);//Saturday //clock.setTime();//write time to the RTC chip pinMode(buttonPin, INPUT); } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { hr_00=clock.hour+1; } printTime(); } void read_rtc1307() //чтение времени в переменные { clock.getTime(); hr_00=clock.hour; mn_00=clock.minute; sc_00=clock.second; } void set_time() { } /*Function: Display time on the serial monitor*/ void printTime() { read_rtc1307(); clock.getTime(); Serial.print(clock.hour, DEC); Serial.print(":"); Serial.print(clock.minute, DEC); Serial.print(":"); Serial.print(clock.second, DEC); Serial.println(" "); }
мой код для DS3231, может найдете что полезное. Код (Text): #include <DI.h> #include <Meander.h> #include <Timer_P.h> #include <DS3231.h> #include <Wire.h> #include <EEPROM.h> #include "TM1637.h" //Массив, содержащий время компиляции char compileTime[] = __TIME__; char compileDate[] = __DATE__; #define DISPLAY_CLK_PIN 11 #define DISPLAY_DIO_PIN 12 #define MODE_KEY_PIN 5 #define PLUS_KEY_PIN 6 #define MINUS_KEY_PIN 7 TM1637 display(DISPLAY_CLK_PIN, DISPLAY_DIO_PIN); DS3231 Clock(SDA, SCL); Time RTC_Time; DI ModeKey(MODE_KEY_PIN, 10), PlusKey(PLUS_KEY_PIN, 10), MinusKey(MINUS_KEY_PIN, 10); Timer_P DisplayPeriod, AutoID_Timer, SecsSetted; Meander P_s; int Mode=0, HourToSet, MinuteToSet, OutPeriod=200; boolean ModeKey_old, PlusKey_old, MinusKey_old, Mode2_old, Mode3_old, SecsSetted_old; void setup() { //Serial.begin(115200); // Start the I2C interface Clock.begin(); //Включаем и настраиваем индикатор display.set(); display.init(); //Получаем число из строки, зная номер первого символа byte hour = getInt(compileTime, 0); byte minute = getInt(compileTime, 3); byte second = getInt(compileTime, 6); unsigned int hash = hour * 60 * 60 + minute * 60 + second; if (EEPROMReadInt(0) != hash) { //Сохраняем новый хэш EEPROMWriteInt(0, hash); Clock.adjust(compileDate, compileTime); } pinMode(13, OUTPUT); } void loop() { //Запускаем меандр P_s.MeanderV(OutPeriod*2, OutPeriod); ModeKey.DI_Refresh(); PlusKey.DI_Refresh(); MinusKey.DI_Refresh(); DisplayPeriod.TimerV(!DisplayPeriod.Q0(), 0, 2, OutPeriod); // Самосбрасывающийся таймер периода AutoID_Timer.TimerV(!AutoID_Timer.Q0() && (PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) , 0, 2, OutPeriod*2); SecsSetted.TimerV((Mode==1 && ((PlusKey.DI_Read() &&!PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))),0,1,1500); if (ModeKey.DI_Read() && !ModeKey_old) Mode = (++Mode)%4; //Перебор режимов if (!SecsSetted.Q0() && SecsSetted_old) Mode = 2; if (Mode ==2 && !Mode2_old) MinuteToSet = RTC_Time.min; if (Mode ==3 && !Mode3_old) HourToSet = RTC_Time.hour; if (Mode==1 && ((PlusKey.DI_Read() &&!PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))) Clock.setSecond(0); if (Mode!=2 && Mode2_old) Clock.setMinute(MinuteToSet); if (Mode!=3 && Mode3_old) Clock.setHour(HourToSet); if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 2){ if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) MinuteToSet=(++MinuteToSet)%60; if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) MinuteToSet=--MinuteToSet; if (MinuteToSet < 0) MinuteToSet = 59; } if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 3){ if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) HourToSet=(++HourToSet)%24; if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) HourToSet=--HourToSet; if (HourToSet < 0) HourToSet = 24; } if (DisplayPeriod.Q0()){ // Get data from the DS3231 int8_t timeDisp[4]; //Запрашиваем время RTC_Time = Clock.getTime(); //Получаем десятки часов с помощью целочисленного деления timeDisp[0] = RTC_Time.hour / 10; timeDisp[1] = RTC_Time.hour % 10; timeDisp[2] = RTC_Time.min / 10; timeDisp[3] = RTC_Time.min % 10; switch (Mode) { case 1: //if (P_s.Q0()){ timeDisp[0] = 16; timeDisp[1] = 16; timeDisp[2] = 16; timeDisp[3] = 16; //} break; case 2: if (P_s.Q0()){ timeDisp[2] = MinuteToSet / 10; timeDisp[3] = MinuteToSet % 10; }else{ timeDisp[2] = 16; timeDisp[3] = 16; } break; case 3: if (P_s.Q0()){ timeDisp[0] = HourToSet / 10; timeDisp[1] = HourToSet % 10; }else{ timeDisp[0] = 16; timeDisp[1] = 16; } break; } display.display(timeDisp); display.point(((RTC_Time.sec % 2 ? POINT_ON : POINT_OFF) && !SecsSetted.Q0()) || (!P_s.Q0() && SecsSetted.Q0())); // Send Day-of-Week //Serial.print(Clock.getDOWStr()); //Serial.print(" "); // Send date //Serial.print(Clock.getDateStr()); //Serial.print(" -- "); // Send time //Serial.println(Clock.getTimeStr()); } ModeKey_old = ModeKey.DI_Read(); PlusKey_old = PlusKey.DI_Read(); MinusKey_old = MinusKey.DI_Read(); SecsSetted_old = SecsSetted.Q0(); Mode2_old = (Mode==2); Mode3_old = (Mode==3); digitalWrite(13, P_s.Q0()); } //Содержимое функции объяснено ниже char getInt(const char* string, int startIndex) { return int(string[startIndex] - '0') * 10 + int(string[startIndex+1]) - '0'; } //Запись двухбайтового числа в память void EEPROMWriteInt(int address, int value) { EEPROM.write(address, lowByte(value)); EEPROM.write(address + 1, highByte(value)); } //Чтение числа из памяти unsigned int EEPROMReadInt(int address) { byte lowByte = EEPROM.read(address); byte highByte = EEPROM.read(address + 1); return (highByte << 8) | lowByte; } Модифицированная библиотека TM1637.h, добавлен код для погашенной цифры (16) https://yadi.sk/d/k1LxU9fVfhtAP Модифицированная библиотека DS3231.h, добавлены методы adjust(compileDate, compileTime), setHour(HourToSet), setMinute(MinuteToSet), Clock.setSecond(0) https://yadi.sk/d/yXTxXqXIfhthT Набор классов моей библиотеки https://yadi.sk/d/hGQy8xu1fZNks
Бегло просмотрел код, вероятно мне скоро понадобится делать что то подобное. Пока первый вопрос пришедший в голову: а что вы записываете и читаете в EEPROM?