Помогите разобраться с библиотекой iarduino_RTC
- Войдите на сайт для отправки комментариев
Ну точнее там в принципе все понятно. Вот только почему-то функция binktime() у меня не работает. Экран у меня стандартный 2х16 ардуиновский с I2C. Программа для обычных часов лежит на многих сайтах и там в момент установки времени должен мигать выбранный параметр (секунды, минуты, часы или там что другое). Так вот сами часы работают. Правда повозицца немного с кварцем пришлось. У меня была микросхемка ds1307, купил кварц в Чип и Дип, собрал на макетке - не работает. Повозился, в итоге нашел на старом медиацентре часовой кварт, впаял и все заработало. Так вот часы работают, но при установке не мигает устанавливаемы параметр. Тут вроде темка была, но там автор написал, что мол сам решил и проблема была в ошибке, но не написал в какой. Вот кусочек, каксающийся установки времени:
// Функция управления кнопками:
void Func_buttons_control(){
uint8_t i=0;
// watch.blinktime(VAR_mode_SET); // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0)
//Если часы находятся в режиме установки даты/времени
if(VAR_mode_SET){
// Если нажата кнопка UP
watch.blinktime(VAR_mode_SET);
if(digitalRead(PIN_button_UP )){
while(digitalRead(PIN_button_UP)){delay(50);} // ждём пока мы не отпустим кнопку UP
switch (VAR_mode_SET){ // инкремент (увеличение) устанавливаемого значения
/* сек */ case 1: watch.settime(0, -1, -1, -1, -1, -1, -1); break;
/* мин */ case 2: watch.settime(-1, (watch.minutes==59?0:watch.minutes+1), -1, -1, -1, -1, -1); break;
/* час */ case 3: watch.settime(-1, -1, (watch.Hours==23?0:watch.Hours+1), -1, -1, -1, -1); break;
/* дни */ case 4: watch.settime(-1, -1, -1, (watch.day==31?1:watch.day+1), -1, -1, -1); break;
/* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month==12?1:watch.month+1), -1, -1); break;
/* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==99?0:watch.year+1), -1); break;
/* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==6?0:watch.weekday+1) ); break;
}
}
// Если нажата кнопка DOWN
if(digitalRead(PIN_button_DOWN)){
while(digitalRead(PIN_button_DOWN)){delay(50);} // ждём пока мы её не отпустим
switch (VAR_mode_SET){ // декремент (уменьшение) устанавливаемого значения
/* сек */ case 1: watch.settime(0, -1, -1, -1, -1, -1, -1); break;
/* мин */ case 2: watch.settime(-1, (watch.minutes==0?59:watch.minutes-1), -1, -1, -1, -1, -1); break;
/* час */ case 3: watch.settime(-1, -1, (watch.Hours==0?23:watch.Hours-1), -1, -1, -1, -1); break;
/* дни */ case 4: watch.settime(-1, -1, -1, (watch.day==1?31:watch.day-1), -1, -1, -1); break;
/* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month==1?12:watch.month-1), -1, -1); break;
/* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==0?99:watch.year-1), -1); break;
/* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==0?6:watch.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{ // если
if(VAR_mode_SHOW==1){VAR_mode_SET=1;} // если установлен режим вывода времени, то устанавливаемый параметр - секунды
if(VAR_mode_SHOW==2){VAR_mode_SET=4;} // если установлен режим вывода даты, то устанавливаемый параметр - день
}
}
}
}
Я еще сейчас попробую в порт пигающее время вывести, может это с экраном что не такт.
Поможите кто знает!
А в порту мигает?
Да, только что проверил. В порту мигает. Значит что-то с дисплеем. Может частоту какую надо задать. Не ту что по умолчанию?
Брось каку и не подбирай с полу что попало - это лучший способ с нею разобраться.
Брось каку и не подбирай с полу что попало - это лучший способ с нею разобраться.
А какой некакой надо пользоваться? Это мой первый опыт. Возьму любую некаку!
Ну и потом ведь в сущности дело не в этой библиотеке, а в дисплее. На порту то все мигает как положено.
Ну и потом ведь в сущности дело не в этой библиотеке, а в дисплее. На порту то все мигает как положено.
Так в сущности дело не в том мигает или нет, а в том, что гадость в проект тянуть не надо ни в каком случае, даже если и мигает.
Их много неплохих, возьми хоть вот эту. Ты же самую худшую выбрал.
Ну и потом ведь в сущности дело не в этой библиотеке, а в дисплее. На порту то все мигает как положено.
Так в сущности дело не в том мигает или нет, а в том, что гадость в проект тянуть не надо ни в каком случае, даже если и мигает.
Их много неплохих, возьми хоть вот эту. Ты же самую худшую выбрал.
Это вы к тому, что сама микросхема барахло? Ну может. Но сейчас другой нет. А купить другую в режиме само изоляции если через алиэкспресс, то долго, если в магазине в городе, то далеко ехать и штрафануть могут. Те дорого. Или все таки библиотеку другую посмотреть. Просто я вот не пойму. Тут то в данном конкретном случае как ситуацию исправить? Другой дисплей попробовать? У меня 4х срочный есть. Или таки другой частотой помигать попробовать?
А про эту библиотеку - ну, почитай же, наконец, сколько и каких предупреждений выдаёт тебе компилятор при её компиляции. Неужели не пропало желание её использовать?
Да вот с утра пытаюсь найти и все в эту библиотеку упирается. Да и никаких сообщений при компиляции вроде нет.
Вот поковырял я с библиотекой DS1307. Вроде все просто. Но там вообще нет функции мигания времени.
В общем что-то получилось. Правда пришлось залезть в библиотеку и увидеть, что частота задается не 1Гц, а 1000. Соответственно когда ставлю 200-500 мигает. Но все равно странно. Скажем на 200 2 раза мигнет (опять таки по ощущениям раз в секунду) т следующие 2 секунды горит не мигая. А если скажем ставлю 500, то наоборот мигнет 2 раза, а потом 2 секунды не горит вообще сегмент. Т.е. такое ощущение, что этот параметр не частоту мигания задает. Но вот что - так и не понял. Поковыряю еще, но в принципе я уже при редактировании времени сделал надпись в правом верхнем углу что меняется.
Наверное ты очень страусов любишь!
Почитаю.
Но все таки ни одного примера библиотеки ты не привёл где бы было мигание. Но выступаешь уверенно! Есть у меня друг такой. Всегда в полицию/милицию попадает.
Xomyc - судя по проблемам с миганием - у вас наверняка в программе куча задержек, из-за которых код в loop() проходит цикл секунду или две. Кнопки в программе хорошо работают, не подтормаживают? - или чтобы сработали, приходится нажимать и удерживать?
Я чёт не понял, ты решил похамить немного? Я подсказал тебе, что у тебя дерьмовая библиотека на которую компилятор ругается матом, подсказал как увидеть сообщения компилятора, которых ты не видишь (и теряешь много полезной информации) - и это твоё "спасибо"?
Ну, ладно, разбирайся тогда сам в своих проблемах. Если чего не поймёшь, то вот на этом сайте всё написано - почитай.
Я чёт не понял, ты решил похамить немного? Я подсказал тебе, что у тебя дерьмовая библиотека на которую компилятор ругается матом, подсказал как увидеть сообщения компилятора, которых ты не видишь (и теряешь много полезной информации) - и это твоё "спасибо"?
Ну, ладно, разбирайся тогда сам в своих проблемах. Если чего не поймёшь, то вот на этом сайте всё написано - почитай.
Ну я был предельно вежлив, а вот твои посты немного скажем так вольные. Все таки мы на брудершафт не пили. Но спасибо я сказал. И еще раз скажу спасибо.
Xomyc - судя по проблемам с миганием - у вас наверняка в программе куча задержек, из-за которых код в loop() проходит цикл секунду или две. Кнопки в программе хорошо работают, не подтормаживают? - или чтобы сработали, приходится нажимать и удерживать?
Вот код, что у меня в итоге получилось. Но как я писал, основу писал не я. Она лежит на многих сайтах. Я переделал, чтобы часы с датой на одном экране лежали и установку 2 будильников и их отработку.
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <iarduino_RTC.h> iarduino_RTC watch(RTC_DS1307); // объявляем переменную time для работы с библиотекой, указывая название модуля RTC_DS1307 LiquidCrystal_I2C lcd(0x27,16,2); // устанавливаем адрес 0x27, и дисплей 16 символов в 2 строки (16х2) // Определяем системное время: // Время загрузки скетча. //const char* strM="JanFebMarAprMayJunJulAugSepOctNovDec"; // Определяем массив всех вариантов текстового представления текущего месяца. //const char* sysT=__TIME__; // Получаем время компиляции скетча в формате "SS:MM:HH". //const char* sysD=__DATE__; // Получаем дату компиляции скетча в формате "MMM:DD:YYYY", где МММ - текстовое представление текущего месяца, например: Jul. // Парсим полученные значения sysT и sysD в массив i: // Определяем массив «i» из 6 элементов типа int, содержащий следующие значения: секунды, минуты, часы, день, месяц и год компиляции скетча. //const int i[6] {(sysT[6]-48)*10+(sysT[7]-48), (sysT[3]-48)*10+(sysT[4]-48), (sysT[0]-48)*10+(sysT[1]-48), (sysD[4]-48)*10+(sysD[5]-48), ((int)memmem(strM,36,sysD,3)+3-(int)&strM[0])/3, (sysD[9]-48)*10+(sysD[10]-48)}; 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-день_недели int8_t VAR_AL_MIN1 = 10; // Задаем минуты 1-ого будильника int8_t VAR_AL_MIN2 = 0; // Задаем минуты 2-ого будильника int8_t VAR_AL_HOUR1 = 9; // Задаем часы 1-ого будильника int8_t VAR_AL_HOUR2 = 22; // Задаем часы 2-ого будильника bool VAR_alarm_FLAG1 = true; // будильник1 разрешение работы bool VAR_alarm_FLAG2 = true; // будильник2 разрешение работы int LED = 7; unsigned long AW = 0; void setup() { //Serial.begin(9600); pinMode(PIN_button_SET, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_UP, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_DOWN, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" delay(300); // ждем 300мс watch.begin(); // инициируем RTC модуль lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея //watch.settime(i[0],i[1],i[2],i[3],i[4],i[5]); pinMode(LED,OUTPUT); } void loop() { if(millis()%1000==0){ // если прошла 1 секунда if(VAR_mode_SHOW==1){ // если установлен режим вывода времени lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(watch.gettime("H:i:s")); // выводим время lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(watch.gettime("d-m-Y D")); // выводим дату lcd.setCursor(12, 0); lcd.print(Func_TM_SET(VAR_mode_SET)); } if(VAR_mode_SHOW==2){ // если установлен режим вывода даты lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print("AL1:"); lcd.setCursor(5, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(Func_alarm_digits(8,VAR_AL_HOUR1,millis())); lcd.setCursor(7, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(":"); lcd.setCursor(8, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(Func_alarm_digits(9,VAR_AL_MIN1,millis())); lcd.setCursor(13, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(Func_alarm_en(10,VAR_alarm_FLAG1,millis())); lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print("AL2:"); lcd.setCursor(5, 1); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(Func_alarm_digits(11,VAR_AL_HOUR2,millis())); lcd.setCursor(7, 1); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(":"); lcd.setCursor(8, 1); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(Func_alarm_digits(12,VAR_AL_MIN2,millis())); lcd.setCursor(13, 1); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(Func_alarm_en(13,VAR_alarm_FLAG2,millis())); } delay(10); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс if(VAR_alarm_FLAG1){ // если будильник1 включён if(watch.seconds==00){ // если в текущем времени 0 секунд if(watch.minutes==VAR_AL_MIN1){ // если совпали минуты if(watch.Hours==VAR_AL_HOUR1){ // если совпали часы digitalWrite(LED, HIGH); AW = millis(); } } } } if(VAR_alarm_FLAG2){ // если будильник2 включён if(watch.seconds==00){ // если в текущем времени 0 секунд if(watch.minutes==VAR_AL_MIN2){ // если совпали минуты if(watch.Hours==VAR_AL_HOUR2){ // если совпали часы digitalWrite(LED, HIGH); AW = millis(); } } } } // if(VAR_alarm_FLAG2){Func_alarm_action();}// запускаем действия будильника } //Serial.println(VAR_mode_SET); if ((AW > 0) && (millis() - AW > 600000)) {digitalWrite(LED, LOW); AW = 0;} Func_buttons_control(); // передаём управление кнопкам } // Функция вывода времени в будильниках String Func_alarm_digits(uint8_t rz,uint8_t tm,unsigned long sc){ String rs; if (tm < 10) rs = "0"+String(tm); else rs = String(tm); if (VAR_mode_SET == 0){return rs;} else { if (rz == VAR_mode_SET) { if (sc%2 == 0){return rs;} else {return " ";} } else {return rs;} } } // Функция вывода включен или нет будильник String Func_alarm_en(uint8_t rz,bool en,unsigned long sc){ String rs; if (en) rs = "ON "; else rs = "OFF"; if (VAR_mode_SET == 0){return rs;} else { if (rz == VAR_mode_SET) { if (sc%2 == 0){return rs;} else {return " ";} } else {return rs;} } } String Func_TM_SET(uint8_t tm){ switch (tm){ case 0: return "";break; case 1: return "SEC ";break; case 2: return "MIN ";break; case 3: return "HOUR";break; case 4: return "DAY ";break; case 5: return "MON ";break; case 6: return "YEAR";break; case 7: return "DOW ";break; } } // Функция управления кнопками: void Func_buttons_control(){ uint8_t i=0; if(VAR_mode_SHOW==1) {watch.blinktime(VAR_mode_SET,200);} // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0) if(VAR_mode_SHOW==2) {} // мигаем устанавливаемым параметром (если 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: watch.settime(0, -1, -1, -1, -1, -1, -1); break; /* мин */ case 2: watch.settime(-1, (watch.minutes==59?0:watch.minutes+1), -1, -1, -1, -1, -1); break; /* час */ case 3: watch.settime(-1, -1, (watch.Hours==23?0:watch.Hours+1), -1, -1, -1, -1); break; /* дни */ case 4: watch.settime(-1, -1, -1, (watch.day==31?1:watch.day+1), -1, -1, -1); break; /* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month==12?1:watch.month+1), -1, -1); break; /* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==99?0:watch.year+1), -1); break; /* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==6?0:watch.weekday+1) ); break; /* д.н.*/ case 8: VAR_AL_HOUR1++; if (VAR_AL_HOUR1 > 23) VAR_AL_HOUR1 = 0; break; /* д.н.*/ case 9: VAR_AL_MIN1++; if (VAR_AL_MIN1 > 59) VAR_AL_MIN1 = 0; break; /* д.н.*/ case 10: VAR_alarm_FLAG1 = !VAR_alarm_FLAG1; break; /* д.н.*/ case 11: VAR_AL_HOUR2++; if (VAR_AL_HOUR2 > 23) VAR_AL_HOUR2 = 0; break; /* д.н.*/ case 12: VAR_AL_MIN2++; if (VAR_AL_MIN2 > 59) VAR_AL_MIN2 = 0; break; /* д.н.*/ case 13: VAR_alarm_FLAG2 = !VAR_alarm_FLAG2; break; } } // Если нажата кнопка DOWN if(digitalRead(PIN_button_DOWN)){ while(digitalRead(PIN_button_DOWN)){delay(50);} // ждём пока мы её не отпустим switch (VAR_mode_SET){ // декремент (уменьшение) устанавливаемого значения /* сек */ case 1: watch.settime(0, -1, -1, -1, -1, -1, -1); break; /* мин */ case 2: watch.settime(-1, (watch.minutes==0?59:watch.minutes-1), -1, -1, -1, -1, -1); break; /* час */ case 3: watch.settime(-1, -1, (watch.Hours==0?23:watch.Hours-1), -1, -1, -1, -1); break; /* дни */ case 4: watch.settime(-1, -1, -1, (watch.day==1?31:watch.day-1), -1, -1, -1); break; /* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month==1?12:watch.month-1), -1, -1); break; /* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==0?99:watch.year-1), -1); break; /* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==0?6:watch.weekday-1) ); break; /* д.н.*/ case 8: VAR_AL_HOUR1--; if (VAR_AL_HOUR1 < 0) {VAR_AL_HOUR1 = 23;} break; /* д.н.*/ case 9: VAR_AL_MIN1--; if (VAR_AL_MIN1 < 0) {VAR_AL_MIN1 = 59;} break; /* д.н.*/ case 10: VAR_alarm_FLAG1 = !(VAR_alarm_FLAG1); break; /* д.н.*/ case 11: VAR_AL_HOUR2--; if (VAR_AL_HOUR2 < 0) {VAR_AL_HOUR2 = 23;} break; /* д.н.*/ case 12: VAR_AL_MIN2--; if (VAR_AL_MIN2 < 0) {VAR_AL_MIN2 = 59;} break; /* д.н.*/ case 13: VAR_alarm_FLAG2 = !(VAR_alarm_FLAG2); 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>7){VAR_mode_SET=1;} // возвращаемся к первому устанавливаемому параметру if(VAR_mode_SHOW==2 && VAR_mode_SET>13){VAR_mode_SET=8;} // возвращаемся к первому устанавливаемому параметру }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{ // если if(VAR_mode_SHOW==1){VAR_mode_SET=1;} // если установлен режим вывода времени, то устанавливаемый параметр - секунды if(VAR_mode_SHOW==2){VAR_mode_SET=8;} // если установлен режим вывода даты, то устанавливаемый параметр - день } } } }