Доброго времени суток. Решил попробовать свои силы в ардуино, для начала попробовал сделать часы с возможностью корректировать время/дату кнопками. Сами то часы работают, но вот заставить работать коррекцию не могу. Подскажите пожалуйста, в чем косяк? Исходные данные: Ардуино - Arduino UNO R3; Дисплей - OLED 128*64, подключен к пинам +5, GND, A4(SDA), A5(SCL); Модуль времени - Tiny RTC I2C Modules, подключен к пинам +3,3, GND, SDA, SCL; кнопки - микрики на пинах 2, 3 и 4 к GND подтянуты резисторами 10к, замыкаются на +5. Код: Код (C++): // Подключаем библиотеки: #include <Wire.h> // Подключаем библиотеку для работы с шиной I2C #include <OLED_I2C.h> // Подключение библиотеки для дисплея OLED myOLED(SDA, SCL); // Cоздаем экземпляр класса extern uint8_t MegaNumbers[]; // Подключение больших шрифтов extern uint8_t SmallFont[]; // Подключение маленьких шрифтов #include <iarduino_RTC.h> // Подключение библиотеки для часового модуля 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_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 модуль myOLED.begin(); // Инициируем OLED дисплей myOLED.setBrightness(127); // Настраиваем яркость дисплея } void loop() { if(millis()%500==0) // Если прошла 0,5 секунды { myOLED.setFont(SmallFont); // Установка маленького шрифта myOLED.print(time.gettime("D"), CENTER, 0); // Отображение дня недели myOLED.setFont(MegaNumbers); // Установка большого шрифта myOLED.print(time.gettime("H"), 4, 12); // Отображение часов myOLED.print("/", 51, 12); // Отображение двоеточия myOLED.print(time.gettime("i"), 75, 12); // Отображение минут myOLED.setFont(SmallFont); // Установка маленького шрифта myOLED.print(time.gettime("d-M-Y"), CENTER, 57); // Отображение даты myOLED.update(); // Обновление дисплея delay(500); // Ждем 0,5 секунды myOLED.setFont(MegaNumbers); // Скрытие двоеточия myOLED.print("-", 51, 12); myOLED.update(); // Обновление дисплея delay(500); // Ждем 0,5 секунды } Func_buttons_control(); // Передаём управление кнопкам } // Функция управления кнопками: void Func_buttons_control() { uint8_t i=0; time.blinktime(VAR_mode_SET); // Мигаем устанавливаемым параметром (если VAR_mode_SET больше 0) if(VAR_mode_SET) // Если часы находятся в режиме установки даты/времени { if(digitalRead(PIN_button_UP)) // Если нажата кнопка 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; } } if(digitalRead(PIN_button_DOWN)) // Если нажата кнопка 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; } } if(digitalRead(PIN_button_SET)) // Если нажата кнопка SET { while(digitalRead(PIN_button_SET)) { delay(50); // Ждём пока мы её не отпустим if(i<2000) // Фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран { i++; } else { myOLED.clrScr(); } } if(i<2000) // Если кнопка SET удерживалась меньше 2 секунд { VAR_mode_SET++; // Переходим к следующему устанавливаемому параметру } else // Если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени { VAR_mode_SET=0; // Выходим из режима установки даты/времени } } } }
У него вроде питание от 5V. time по моему зарезервировано. Я бы написал time_t или currentTime или как то так.
Пробовал и 5V и 3.3V, "на скорость не влияет". Встречал записи на форумах, что на 3.3V работает стабильнее. Тем не менее сейчас переподключил на 5V, результат тот же - часы работают, время считают, время кнопками не корректируется. В описании библиотеки определение типа модуля часов идет именно этой командой.
В него встроена цепь подзарядки, которая 5 вольтами подзаряжает батарейку. Я думаю что если вы запитываете модуль от 3.3V то батарея подзаряжаться не будет.
Батарейки подзаряжать нельзя. В чистом виде должен ставиться аккумулятор, но и с ним существующая цепь подзарядки убъет бедолагу очень быстро. У меня цепь подзарядки выпаяна и поставлена обычная батарейка. По словам специалистов, ее емкости должно хватить на 10 лет работы модуля.
Все, всем спасибо, нашел где проблема. В код закралась ошибка и недоговоренность Тему можно закрывать.