Установка бинарных часов DS3231
- Войдите на сайт для отправки комментариев
Чт, 31/03/2016 - 18:27
Всем здравствуйте! Опять без Вас не как(( Немогу организовать установку времени на бинарных часах кнопками. Перепробовал кучу примеров, скетчей из готовых проектов, но так и не смог переделать настройку по свой код.
Мой код
#include "Wire.h" //#include <DS3231.h> #define DS3231_ADDRESS 0x68 int latchPin = 11; //Pin connected to SH_CP of 74HC595 int clockPin = 13; ////Pin connected to DS of 74HC595 int dataPin = 12; void setup(){ Wire.begin(); // setDateTime(); // Первый раз запустит для установки текущего времени, второй раз запускаем "закоментированно" pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop(){ printDate(); //delay(1000); } void setDateTime(){ byte second = 0; //0-59 byte minute = 05; //0-59 byte hour = 18; //0-23 byte dow = 2; //1-7 byte day = 8; //1-31 byte month = 11; //1-12 byte year = 11; //0-99 byte getTemp = 0; Wire.beginTransmission(DS3231_ADDRESS); Wire.write(0); //stop Oscillator Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(day)); //число Wire.write(decToBcd(dow)); //день недели Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.write(decToBcd(getTemp)); Wire.write(0); //start Wire.endTransmission(); } byte decToBcd(byte val){ // Convert normal decimal numbers to binary coded decimal return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val) { // Convert binary coded decimal to normal decimal numbers return ( (val/16*10) + (val%16) ); } void printDate(){ // Reset the register pointer Wire.beginTransmission(DS3231_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS3231_ADDRESS, 7); int second = bcdToDec(Wire.read()); int minute = bcdToDec(Wire.read()); int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time int dow = bcdToDec(Wire.read()); //0-6 -> sunday — Saturday int day = bcdToDec(Wire.read()); int month = bcdToDec(Wire.read()); int year = bcdToDec(Wire.read()); int getTemp = bcdToDec(Wire.read()); //if (hour>12) hour=hour-12; digitalWrite(latchPin, 0); //count up on GREEN LEDs //shiftOut(dataPin, clockPin,MSBFIRST, second); shiftOut(dataPin, clockPin,MSBFIRST, minute); //count down on RED LEDs shiftOut(dataPin, clockPin,MSBFIRST, hour); //return the latch pin high to signal chip that it //no longer needs to listen for information digitalWrite(latchPin, 1); }
то из чего пробовал переделать под себя
// Библиотека «iarduino_RTC» разработана для RTC модуля http://iarduino.ru/shop/Expansion-payments/chasy-realnogo-vremeni-rtc-tr... // Вывод времени осуществляется на LCD 1602 I2C дисплей http://iarduino.ru/shop/Displei/simvolnyy-displey-golubaya-podsvetka-lcd... // Подключаем библиотеки: #include <Wire.h> // подключаем библиотеку для работы с шиной I2C #include <LiquidCrystal_I2C.h> // подключаем библиотеку для работы с LCD дисплеем #include <iarduino_RTC.h> // подключаем библиотеку для работы с RTC модулем LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) iarduino_RTC time(RTC_DS1307); // объявляем переменную для работы с RTC модулем, указывая название модуля // Объявляем переменные и константы: const uint8_t PIN_button_SET = 2; // указываем номер вывода arduino, к которому подключена кнопка SET const uint8_t PIN_button_UP = 3; // указываем номер вывода arduino, к которому подключена кнопка UP const uint8_t PIN_button_DOWN = 4; // указываем номер вывода arduino, к которому подключена кнопка DOWN uint8_t VAR_mode_SHOW = 1; // режим вывода: 1-время 2-дата uint8_t VAR_mode_SET = 0; // режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_недели void setup() { pinMode(PIN_button_SET, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_UP, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_DOWN, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" delay(300); // ждем 300мс time.begin(); // инициируем RTC модуль lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея } void loop(){ if(millis()%1000==0){ // если прошла 1 секунда lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print("iArduino.ru"); // выводим текст "iArduino.ru" lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 if(VAR_mode_SHOW==1){ // если установлен режим вывода времени lcd.print(time.gettime("H:i:s")); // выводим время } if(VAR_mode_SHOW==2){ // если установлен режим вывода даты lcd.print(time.gettime("d-m-Y D")); // выводим дату } delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс } Func_buttons_control(); // передаём управление кнопкам } // Функция управления кнопками: void Func_buttons_control(){ uint8_t i=0; time.blinktime(VAR_mode_SET); // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0) //Если часы находятся в режиме установки даты/времени if(VAR_mode_SET){ // Если нажата кнопка UP if(digitalRead(PIN_button_UP )){ while(digitalRead(PIN_button_UP)){delay(50);} // ждём пока мы не отпустим кнопку UP switch (VAR_mode_SET){ // инкремент (увеличение) устанавливаемого значения /* сек */ case 1: time.settime(0, -1, -1, -1, -1, -1, -1); break; /* мин */ case 2: time.settime(-1, (time.minutes==59?0:time.minutes+1), -1, -1, -1, -1, -1); break; /* час */ case 3: time.settime(-1, -1, (time.Hours==23?0:time.Hours+1), -1, -1, -1, -1); break; /* дни */ case 4: time.settime(-1, -1, -1, (time.day==31?1:time.day+1), -1, -1, -1); break; /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==12?1:time.month+1), -1, -1); break; /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==99?0:time.year+1), -1); break; /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==6?0:time.weekday+1) ); break; } } // Если нажата кнопка DOWN if(digitalRead(PIN_button_DOWN)){ while(digitalRead(PIN_button_DOWN)){delay(50);} // ждём пока мы её не отпустим switch (VAR_mode_SET){ // декремент (уменьшение) устанавливаемого значения /* сек */ case 1: time.settime(0, -1, -1, -1, -1, -1, -1); break; /* мин */ case 2: time.settime(-1, (time.minutes==0?59:time.minutes-1), -1, -1, -1, -1, -1); break; /* час */ case 3: time.settime(-1, -1, (time.Hours==0?23:time.Hours-1), -1, -1, -1, -1); break; /* дни */ case 4: time.settime(-1, -1, -1, (time.day==1?31:time.day-1), -1, -1, -1); break; /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==1?12:time.month-1), -1, -1); break; /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==0?99:time.year-1), -1); break; /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==0?6:time.weekday-1) ); break; } } // Если нажата кнопка SET if(digitalRead(PIN_button_SET)){ while(digitalRead(PIN_button_SET)){ // ждём пока мы её не отпустим delay(10); if(i<200){i++;}else{lcd.clear();} // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран } if(i<200){ // если кнопка SET удерживалась меньше 2 секунд VAR_mode_SET++; // переходим к следующему устанавливаемому параметру if(VAR_mode_SHOW==1 && VAR_mode_SET>3){VAR_mode_SET=1;} // возвращаемся к первому устанавливаемому параметру if(VAR_mode_SHOW==2 && VAR_mode_SET>7){VAR_mode_SET=4;} // возвращаемся к первому устанавливаемому параметру }else{ // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени VAR_mode_SET=0; // выходим из режима установки даты/времени } } //Если часы находятся в режиме вывода даты/времени }else{ // Если нажата кнопка SET if(digitalRead(PIN_button_SET)){ while(digitalRead(PIN_button_SET)){delay(10); // ждём пока мы её не отпустим if(i<200){i++;}else{lcd.clear();} // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран } if(i<200){ // если кнопка SET удерживалась меньше 2 секунд lcd.clear(); // стираем экран VAR_mode_SHOW=VAR_mode_SHOW==1?2:1; // меняем режим вывода: дата/время }else{ // если кнопка SET удерживалась дольше 2 секунд, то требуется перейти в режим установки даты/времени if(VAR_mode_SHOW==1){VAR_mode_SET=1;} // если установлен режим вывода времени, то устанавливаемый параметр - секунды if(VAR_mode_SHOW==2){VAR_mode_SET=4;} // если установлен режим вывода даты, то устанавливаемый параметр - день } } } }
и ещё
#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; }
и ещё
// ------------------------------------------------------------------------------------ // Simple clock based on a DS3231 RTC and simple 16x2 LCD // Setup includes 3 push buttons for up, down, and enter // 15th July 2015, Andrew W. - andrewideas.weebly.com // Visit AndrewIdeas.weebly.com for more info or to contact author for any reason // ------------------------------------------------------------------------------------ //include LCD and Wire library #include <LiquidCrystal.h> #include <Wire.h> //define button pins #define enterButtPin A2 #define upButtPin A1 #define downButtPin A0 //define RTC address #define DS3231_I2C_ADDRESS 0x68 //define LCD pins and initialize LCD library LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //variables for button states int enterState = 0; int enterStateLast = 0; int upState = 0; int upStateLast = 0; int downState = 0; int downStateLast = 0; //variables for ui boolean blinkOn = true; //visibility of ':' between hour and minutes boolean setVisible = false; //visibility of the set time ui //variables for new time int setM = 0; //users new minute value int setH = 0; //users new hour value //convert normal decimal numbers to binary coded decimals byte decToBcd(byte val) { return ( (val / 10 * 16) + (val % 10) ); } //convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return ( (val / 16 * 10) + (val % 16) ); } //code that runs once at setup void setup() { //start wire and lcd Wire.begin(); lcd.begin(16,2); //(col, rows) //intialize buttons as inputs pinMode(enterButtPin, INPUT); pinMode(upButtPin, INPUT); pinMode(downButtPin, INPUT); //Use below code to set time and date once from code //it will run at every reset and you will lose the time on the RTC //format is (sec, min, hr, day of week, day of month, month, year) //setRTCTime(0, 3, 23, 4, 15, 7, 15); } //code that runs on a constant loop void loop() { checkButtons(); printTime(); } //easy and dirty way to clear the LCD void clearLCD () { lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,0); } //set the time and date to the RTC void setRTCTime(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) { // sets time and date data to DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set next input to start at the seconds register Wire.write(decToBcd(second)); // set seconds Wire.write(decToBcd(minute)); // set minutes Wire.write(decToBcd(hour)); // set hours Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday) Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31) Wire.write(decToBcd(month)); // set month Wire.write(decToBcd(year)); // set year (0 to 99) Wire.endTransmission(); } //read the time and date from the RTC void readRTCTime(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set DS3231 register pointer to 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes of data from DS3231 starting from register 00h *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } //reads the RTC time and prints it to the top of the LCD void printTime() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; //retrieve time readRTCTime(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //print to lcd top lcd.setCursor(0,0); lcd.print(" Current: "); if (hour<10) { lcd.print("0"); } lcd.print(hour, DEC); if (blinkOn == true) { lcd.print(" "); blinkOn = false; } else if (blinkOn == false) { lcd.print(":"); blinkOn = true; } if (minute<10) { lcd.print("0"); } lcd.print(minute, DEC); delay(100); } //checks if buttons are pressed and responds accordingly void checkButtons() { //check enter enterState = digitalRead(enterButtPin); if (enterState != enterStateLast) { if (enterState == HIGH) { if (setVisible == true) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; readRTCTime(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); setRTCTime(0, setM, setH, dayOfWeek, dayOfMonth, month, year); hideSet(); } else if (setVisible == false) { showSet(); } } } enterStateLast = enterState; //check up upState = digitalRead(upButtPin); if (upState != upStateLast) { if (upState == HIGH) { if (setVisible == true) { addMin(); printSetTime(); } else if (setVisible == false) { showSet(); } } } upStateLast = upState; //check down downState = digitalRead(downButtPin); if (downState != downStateLast) { if (downState == HIGH) { if (setVisible == true) { subMin(); printSetTime(); } else if (setVisible == false) { showSet(); } } } downStateLast = downState; } //displays the new time interface in the bottom of the LCD void showSet () { //update new time variables to current RTC values byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; readRTCTime(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); setH = hour, DEC; setM = minute, DEC; //pints to the LCD lcd.setCursor(0,1); lcd.print(" New: "); printSetTime(); setVisible = true; } //hides the new time interface void hideSet () { clearLCD(); setVisible = false; } //adds a minute to new time void addMin() { if (setM < 59) { setM++; } else if (setM == 59) { setM = 0; addHr(); } } //subtracts a minute from new time void subMin() { if (setM > 0) { setM--; } else if (setM == 0) { setM = 59; subHr(); } } //adds an hour to new time void addHr () { if (setH < 23) { setH++; } else if (setH == 23) { setH = 0; } } //subtracts an hour from new time void subHr () { if (setH > 0) { setH--; } else if (setH == 0) { setH = 23; } } //prints the new time values on the bottom of the LCD void printSetTime() { lcd.setCursor(8,1); if (setH<10) { lcd.print("0"); } lcd.print(setH); lcd.print(":"); if (setM<10) { lcd.print("0"); } lcd.print(setM); }
Подскажите как сотворить сие чудо.
Своих набросков не выкладываю, ибо полный бред и ничего не работает((
Хм... А где, собственно, кнопки?
В моем коде их нет, а вот во всех остальных присутствует. В этом вся и проблема, как добавить кнопки в мои часы. Добавить не просто указать пин и что они работают как вход, а что бы они настраивали часы.
Для начала должна появиться функция опроса кнопок, которая будет возвращать "нечто". Далее, этими "нечтами" прибавляем-убавляем интересующее нас значение и переходим к следующему. Настроив все значения, записываем.
Все вместе будет называться "меню установки времени".
А что такое "бинарные часы"?
А что такое "бинарные часы"?
Работают-не работают?
http://nnm.me/blogs/oleg_karp/arduino-delaem-shild-binarnye-chasy-2/
собраны вот такие, только добавлены секунда и время в 24-х часовом формаите.
сижу щас опять пытаюсь добавить настройку, ни че не получается((
Что то ваши скетчи заумные слишком. Сделайте функцию на три кнопки: "+"," -", "ОК". Считайте значения минут, часов..... с RTC и последовательно их изменяйте. После изменения последнего значения, записали в RTC.
это то я понимаю, весь процесс описать могу с подробностями, а вот как реализовать...
я не программист, у нас в школе даже информатики небыло.
пока научился вслепую выставлять минуты. тыкаю на ентер, потом + или -, потом опять ентер и минуты меняются. как выставлять часы, и как заставить мигати все это добро при установке не представляю
понятно дело что это ужасно выглядит, что то по моему делается даже два раза)) но по другому пока не смог...
я тут накошматил маленько. вообщем то ничего не поменял, просто код сократил чутьь чуть..
Что то ваши скетчи заумные слишком. Сделайте функцию на три кнопки: "+"," -", "ОК". Считайте значения минут, часов..... с RTC и последовательно их изменяйте. После изменения последнего значения, записали в RTC.
Назревает что то такое. попробую дополнить еще
Посмотрите здесь 282 пост. Код большой и лобовой, но практически все в функциях и уже второй год работает. Можете и сначала почитать, это не руководство к действию, а последовательный полет фантазии.))))
Спасибо, обязательно гляну. Просто еще большой проблемой является помигать устанавливаемым значением на этих часах.
Я конечно почитаю еще про 74hc595, но без Вас точно не осилю.
"последовательный полет фантазии."
Здесь похоже ни у кого подобного девайса нет, как и желания его создавать. Рубим все на мелкие самодостаточные кусочки-функции, а потом складываем их вместе. Есть функция обработки кнопок, есть мигания чем либо, есть считывания из RTC в переменные + обработка кнопок получим инструмент изменения этих переменных и т.д.
Начнете пытаться все пихать в loop, увязнете по самые уши.
Начнете пытаться все пихать в loop, увязнете по самые уши.
Неистово плюсую.
А что такое "бинарные часы"?
А что такое "бинарные часы"?
отображает время в двоичном коде. в виде едениц и нулей, которые представлены в виде горящих (1), и не горящих (0) светодиодов
это вроде все что нужно с того кода, но все равно ничего не выходит...(((
я вот такое добавил, оно мигнет что изменилось, а потом лбратно, как сохранить в RTC не знаю...
функция timeRtc считывает значения из часов. seRtc записывает.
Как сделано у вас, корректно работать не будет. Цикл работает очень быстро, ++ или -- за нажатие успевают сработать бешеное количество раз. Нужны или защелка или замедлитель.
По кнопкам посмотрите титановый велосипед Клапауция.
или замедлитель.
По кнопкам посмотрите титановый велосипед Клапауция.
меняю титановый велосипед на замедлитель...
два замедлителяящик замедлителейхнык хнык... ну я и наговнокодил((( помогите что делать дальше???
переменные мигают, в сериал все правельно дает, но к переменным ничего не прибавляется и не убавляется, и еще не знаю как записать их в RTC
и еще я не понял где происходит сброс минут в 0 при входе в режим 1
меняю титановый велосипед на замедлитель...
два замедлителяящик замедлителейОбана, ты ведь на рекорд шел. Никак забанили?
переменные мигают, в сериал все правельно дает, но к переменным ничего не прибавляется и не убавляется, и еще не знаю как записать их в RTC
А откуда узнали, что ничего не прибавляется?
Запись в часы, строки 34-54, по образу и подобию.
И ведь говорил, не пихайте все в loop. То, что вы это сделали в функции, которая вызывается при каждом проходе, ничего не изменилось. В итоге гора ифов, которая непонятно как работает.
меняю титановый велосипед на замедлитель...
два замедлителяящик замедлителейОбана, ты ведь на рекорд шел. Никак забанили?
Какой рекорд? За что забанить?
а со строчками 34-54 я пробовал, что то не получилось((
А откуда узнали, что ничего не прибавляется?
по нажатию кнопок светодиоды какие горели, такие и горят
>> И ведь говорил, не пихайте все в loop
я вообще не программист не разу, не знаю как по другому сделать
меняю титановый велосипед на замедлитель...
два замедлителяящик замедлителейОбана, ты ведь на рекорд шел. Никак забанили?
да - ихтамнеты утверждают, что их детям не поотрывает ноги российскими фугасами потому, что "ихтамнет!".. наивные.
меняю титановый велосипед на замедлитель...
два замедлителяящик замедлителейОбана, ты ведь на рекорд шел. Никак забанили?
да - ихтамнеты утверждают, что их детям не поотрывает ноги российскими фугасами потому, что "ихтамнет!".. наивные.
Вообще ни чего не понял хД
Вообще ни чего не понял хД
забей - кому нужно, тот понял.
не понял что поменял, но минуты теперь не сбрасываются
и как правильно? Н++ или Н=Н++
и вообще я считаю чудом что мои скетчи хотя бы компилируются...
Таки давайте, пойдем мелкими шагами: Берем всю простыню и выкидываем в топку (пока).
Идем сюда и изучаем лисапед. Научившись ездить, добавляем в скетч две новых функции rtcWrite и rtcRead и учимся с ними работать - считывать и записывать значения RTC. Читать-писать по одной переменной думаю не выйдет, только пачкой.
Освоили методы записи в RTC и начали придумывать алгоритм работы девайса - как попадаем в меню установки, как переходим, как возвращаемся. Должно получиться - (условно) при длительном нажатии Set попали в выбор режима, Up Down Set - больше меньше переход, двойной или длинный Set - запись значений в RTC и возврат в основной режим (отображения).
Функцию изменения параметров, я бы сделал на while, с возможностью выхода по событию или таймеру (кстати в велосипеде вроде есть)
Всю эту радость делаем пока с выводом в сериал, не заморачиваясь с вашим экраном.
Наконец, написали функции вывода на ваш экран и вместо сериала передаем значения в них.
ну светодиодами моргать научился... ну не то что бы научился... примерно суть понял...
ну светодиодами моргать научился...
Судя по коду, не научился :(
подскажите, а
class
BUTTON же можно как то в отдельный файл, и ссылку на него. Ну что то типа библиотеки
почему? он же загорается и гаснет как я ему говарю...
спрошу сразу пока не запутался еще дальше.
почему когда нажимаю вверх, переменная доходит до 23 и обнуляется, а когда нажимаю вниз, после нуля перескакивает на 255 и убавляется?
хм...... сделал их (int), все заработало.....
простите что я такой балбес((
Потому, что h у Вас byte - т.е. беззнаковое целое. И какй смысл сравнивать его на < 0 в строке 130? Оно никогда меньше не будет, дойдёт до 0 и станет 255.
ну вот вроде как сделал что то такое. по крайне мере время устанавливаю...
пока коряво конечно, но все же
и да ... как все таки класс то отдельно сделать? а то он так страшно в коде смотрится
ах да... еще не знаю как сделать что бы "h" и "m" по умолчанию были часы и минуты, что бы включил настройку, и переводиш часы с текущего времени, а не со значения переменной.
ах да... еще не знаю как сделать что бы "h" и "m" по умолчанию были часы и минуты, что бы включил настройку, и переводиш часы с текущего времени, а не со значения переменной.
Не хотите вы с мечтой, все в одну кучу спихать, расставаться. Вошли в режим изменения, считали значения с RTC, приравняли им H и M.
дак это получится что нужно будет много раз считывать время, не проще ли один раз считать, и брать от туда значения... только я не знаю как((
дак это получится что нужно будет много раз считывать время, не проще ли один раз считать, и брать от туда значения... только я не знаю как((
тогда тебе и модуль RTC не нужет - пиши время непосредственно в код скетча.
time = 1 Апреля
и, всё!
не, эт фигня получится, и время не точно, и при потере питания сбивается...
Ну вот так вот все хорошо, только маленькие недочеты с записью времени в переменные при изменении времени, и мигание светодиодов при настройке какое то бледное, там вроде как задержку надо впихнуть?
Господа! Так как все таки присвоить переменной "h" и "m", что бы они стали равны часам и минутам, но при этом менялись?
А то я присваиваю им значение часов и минут, а они его постоянно считывают, и не меняются(
Теоретически, m = minute;
А проблема думаю от того, что все время крутитесь в loop, при каждом проходе считываете их по новой и каждый раз возвращаетесь в выбор режима. Они бы и хотели поменяться, да никак.((((
И что у вас в 62 строке за переменная? Откуда она берется, не нашел.
А в строках 96 и 118 сохранение корректно написано? А то считываете через Wire, а записываете иначе?
А в строках 96 и 118 сохранение корректно написано? А то считываете через Wire, а записываете иначе?
Не знаю, но время записывается, проблем с этим вроде нет.
Ох... и все равно не могу понять как адекватно мигать переменной. Это не совсем тоже самое что мигать одним диодом, тут как то через ж... надо.
так красиво но не работает как надо
а так мигает черте как, редко и тускло, не так, горит пол секунды - не горит по секунды, а вспыхивает каждые пол секунды на мгновение
кто придумал delay(); таким не пригодным... нельзя было сделать то же самое, только без тормозов для программы((
голова болит, пошел спать((