Здравствуйте! Тут сделал регистратор температуры и влажности, хотел бы узнать каким образом можно вывести время и дату напротив моих показаний без модуля часов реального времени.Если можно напишите код пожалуйста
Не имея RTC, время можно получить из сети Ethernet, но для этого нужен подключенный соответствующий шилд, можно получить например из радиосети с помощью модуля nRF24, если такая в наличии. В любом случае нужен какой то внешний источник реального времени.
Ну если поиграться, то можно же ардуинку заставить время считать. Точность само собой будет низкая, но для эксперимента можно и так.
Я находил такой пример: Код (C++): #include <LiquidCrystal.h>//библиотека для работы с LCD long previousMillis = 0;//переменная для хранения значений таймера int sek=0;//значение секунд int min=0;//значение минут int chas=0;//значение часов int knopka=0;//значение кнопки LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//инициализация портов void setup() { lcd.begin(16, 2);//иницифлизация дисплея pinMode(6,INPUT);//инициализация портов pinMode(9,OUTPUT);//инициализация портов pinMode(13,OUTPUT);//инициализация портов } void loop() { if (millis() - previousMillis >500) { previousMillis = millis(); //запучкаем таймер digitalWrite(13, !digitalRead(13));//меняем значение порта каждые 0.5секунд if(digitalRead(13)==HIGH)//если 13 нога лог1 то... { sek++;//переменная секунда + 1 lcd.clear(); //обновление дисплея //вывод символов на дисплей// lcd.setCursor(6, 1); lcd.print(":");//выводим символ ":"между часами и минутами lcd.setCursor(9, 1); lcd.print(":");//выводим символ ":"между минутами и секундами } if(digitalRead(13)==LOW) { //через каждые 0.5 секунд меняем символ ":" на "." lcd.setCursor(9, 1); lcd.print("."); lcd.setCursor(6, 1); lcd.print("."); } if(sek>59)//если переменная секунда больше 59 ... { sek=0;//сбрасываем ее на 0 min++;//пишем +1 в переменную минута } if(min>59)//если переменная минута больше 59 ... { min=0;//сбрасываем ее на 0 chas++;//пишем +1 в переменную час } if(chas>23)//если переменная час больше 23 ... { chas=0;//сбрасываем ее на 0 } //вывод символов на дисплей// lcd.setCursor(4, 1);//выводим значение часов в строку - 1 //столбец -4 lcd.print(chas);//количество часов lcd.setCursor(7, 1);//выводим значение часов в строку - 1 //столбец -7 lcd.print(min);//количество минут lcd.setCursor(10, 1);//выводим значение часов в строку - 1 //столбец -10 lcd.print(sek);//количество секунд } //установка времени// //кнопка// if(digitalRead(6)==HIGH&&knopka==0)//если кнопка нажата // и перемення "knopka" равна 0 , то ... { min++;//пишем + 1 в переменную минута sek=0;//пишем 0 в переменную секунда knopka++;//пишем 1 в переменную кнопка //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" //с каждым нажатием кнопки обновляем значения на дисплее// lcd.setCursor(4, 1); lcd.print(chas); lcd.setCursor(7, 1); lcd.print(min); lcd.setCursor(10, 1); lcd.print(sek); } if(digitalRead(6)==LOW&&knopka==1)//если кнопка НЕ нажата //и переменная knopka равна - 1 ,то ... { knopka=0;//обнуляем переменную "knopka" } //выводим надпись "CHASI." в строку - 0 lcd.setCursor(5, 0); lcd.print("CHASI."); }
я вот такой вот код написал и это просто она начинает считать с момента включения ардуино Код (C++): int time=millis()/1000; if (time/60/60<10) { Serial.print ("0"); } Serial.print (time/60/60); Serial.print (":"); if (time/60%60<10) { Serial.print ("0"); } Serial.print ((time/60)%60); Serial.print (":"); if (time%60<10) { Serial.print ("0"); } Serial.println (time%60); а мне нужно чтобы точное время было,ну более или менее
http://amperka.ru/product/troyka-rtc или другой такой модуль. самый популярный чип DS1307. как раз такой-же как в модуле от амперки
нормальная точность будет. полминуты в месяц точность будет, если питание не будет скакать. ну и бесперебойник нужно, чтобы часы не сбились, и прогу делать с учетом того, что напруга может пропасть.
стоимость часиков настолько мала, а реализация проста, что наверное не стоит заморачиватся с подсчетом милисикунд в процесе работы программы, а тем более использовать изернет шилды, инет и т д.
Нет, нормальная точность не получится. Попробовал ради интереса на основе примера приведенного ImrDuke запустить часы. Как раз тестировал дисплей Nokia 5110, надо было что-то на него вывести. Так они за час на 3-4 секунды отстали. Ну конечно можно в строке Код (C++): if (millis() - previousMillis >500) поиграть с цифрой 500, но если делать вручную, на более или менее точную калибровку уйдёт не меньше недели. Причём подгонять надо под каждую ардуинку индивидуально.
получается. неделя не нужна. делаете putch() по таймеру, смотрите в терминале с метками и получаете 6 знаков, после чего одной математической операцией решаете проблему. Я на всех в мире, конечно, не пробовал, но у меня на 5-6 атмегах с точностью до 1 один и тот же коэффициент, у меня 6 знаков. Так что можно загонять в модуль одного производителя одной партии один и тот же коэффициент и получать то что я написал - секунды, ну может десяток- другой секунд в месяц.