RTC, serial монитор и я
- Войдите на сайт для отправки комментариев
Пт, 12/02/2016 - 17:47
Вот у меня такой вопрос ..
Как можно менять время из сериал монитора? Выполнить команду time.settime(0,00,15,1,1,15,1) - это просто. А можно ли из сериал менять значения в скобках функции time.settime(...). Может есть какие решения? А может быть можно представить строку time.settime(0,00,15,1,1,15,1) в виде массива? В общем, прошу вашей помощи..
#include <RTC.h>
RTC time;
void setup() {
delay(300);
Serial.begin(9600);
time.begin(RTC_DS3231);
Serial.println(time.gettime(" H:i:s d-m-Y, D"));
}
void loop()
{
int rx_byte = 0; // переменная для хранения байта из serial
if (Serial.available()) { // читаем полученные данные
rx_byte = Serial.read();
}
if ((rx_byte == 'N') || (rx_byte == 'n'))
{
Serial.println(time.gettime(" H:i:s d-m-Y, D")); // выводим текущее время
}
if ((rx_byte == 'S') || (rx_byte == 's'))
{
time.settime(0,00,15,1,1,15,1); // запишем новые настройки времени (сек, мин, час, число, месяц, год, день недели)
// time.settime(35,10,20);// 35 сек, 10 мин, 20 час, дату оставить без изменений
// time.settime(-1,-1,-1,31,12,15); // 31, декабря, 2015 года, время и день недели оставить без изменений
}
}
Может что-то типа такого можно сделать. Типа меню что ли ?
#include <RTC.h> RTC time; void setup() { delay(300); Serial.begin(9600); time.begin(RTC_DS3231); Serial.println(time.gettime(" H:i:s d-m-Y, D")); } void loop() { int rx_byte = 0; // переменная для хранения байта из serial if (Serial.available()) { // читаем полученные данные rx_byte = Serial.read(); } if ((rx_byte == 'N') || (rx_byte == 'n')) { Serial.println(time.gettime(" H:i:s d-m-Y, D")); // выводим текущее время } if ((rx_byte == 'S') || (rx_byte == 's')) { time.settime(0,00,15,1,1,15,1); // запишем новые настройки времени (сек, мин, час, число, месяц, год, день недели) // time.settime(35,10,20);// 35 сек, 10 мин, 20 час, дату оставить без изменений // time.settime(-1,-1,-1,31,12,15); // 31, декабря, 2015 года, время и день недели оставить без изменений } if ((rx_byte == 'M') || (rx_byte == 'm')) { PrintMenu; switch (rx_byte) { case '1': // принимаем данные "год" и записываем в соотв. массив break; case '2': break; case '7': // выполняем команду time.settime(0,00,15,1,1,15,1) break; case '8': // сбрасываем значения из time.settime(0,00,15,1,1,15,1) break; } } } void PrintMenu() { Serial.println(" "); Serial.println(" Set Date & Time Menu "); Serial.println(" "); Serial.println("(Select 1 to 8)"); Serial.println("1. Set year."); Serial.println("2. Set month."); Serial.println("3. Set day."); Serial.println("4. Set hour."); Serial.println("5. Set minute."); Serial.println("6. Set second."); Serial.println("7. Write changes and finish."); Serial.println("8. Exit without changing."); }Если по простому, то нужно передать через сериал строку с датой-временем (например, отправить такую строку с компа "M2016-02-12 18:15:04"), в Ардуино распарсить эту строку в переменные и вызвать setTime передав параметры через переменные.
А как можно представить команду time.settime(0,00,15,1,1,15,1) в виде массива, чтобы потом поменять в массиве поэлементно?
Если по простому, то нужно передать через сериал строку с датой-временем (например, отправить такую строку с компа "M2016-02-12 18:15:04"), в Ардуино распарсить эту строку в переменные и вызвать setTime передав параметры через переменные.
Троллите :)))
Если по простому, то нужно передать через сериал строку с датой-временем (например, отправить такую строку с компа "M2016-02-12 18:15:04"), в Ардуино распарсить эту строку в переменные и вызвать setTime передав параметры через переменные.
Троллите :)))
Почему? Разве это не проще, чем делать через меню? Я совершенно серьезно. Впрочем, наверное Вы просто шутите, а я не понял :)
С переборами типа меню вообще, думаю, замороченно выйдет)
Почему? Разве это не проще, чем делать через меню? Я совершенно серьезно. Впрочем, наверное Вы просто шутите, а я не понял :)
Да, нет, ну вот смотрите, ТС пишет: "time.settime(0,00,15,1,1,15,1) - это просто. А можно ли из сериал менять значения в скобках функции time.settime(...)". Т.е., уровень знанний и понимания в общем-то ясен. Так вот мне показалось, что предлагать человеку с таким уровнем знаний распарсить строку - троллинг. Ему бы взять книжку и с нуля читать, рабирая все примеры, но они ж (новички) обижаются на такие советы. Я уж и давать их почти перестал.
Как по мне, так сообщение по поводу распарсить строку куда дельнее, чем Ваши) Это по крайней мере наталкивает на мысль в этом разобраться. А "иди книжку с нуля читай и разбирайся" - это действительно дельный совет. Еще не понятно, кто тролит)
В общем получилось реализовать задуманное. Правда, не знаю насколько правильно это все, но, кажется, работает. В процессе перешел на другую библиотеку для RTC, но это сути не меняет.
#include "Wire.h" #include "DS1307new.h" int YEAR; int MONTH; int DAY; int HOUR; int MINUTE; int SECOND; void setup(){ Serial.begin(9600); if(RTC.isPresent()){ // обнаружен ли модуль? Serial.println("RTC Ready..."); // все хорошо Serial.println(" "); } else { Serial.println("Error!!!! RTC Module not found"); // сообщаем о проблеме while(1); // и останавливаем скетч } RTC.getTime(); // получить время от модуля print_RTC(); // выводим полученное время Serial.println(" "); Serial.println("Press 'T' to set the time or 'D' to set the date"); Serial.println("Press 'N' to view the current time"); } void loop() { doSerialCommands(); // слушаем и выполняем команды из Serial } void setNewTime () // установка нового времени { RTC.stopClock(); RTC.hour = HOUR; RTC.minute = MINUTE; RTC.second = SECOND; RTC.setTime(); RTC.startClock(); } void setNewDate () // установка новой даты { RTC.stopClock(); RTC.year = YEAR; RTC.month = MONTH; RTC.day = DAY; RTC.setTime(); RTC.startClock(); } void doSerialCommands() // выполняем команды из сериал и настраиваем { if(Serial.available()) // что-нибудь пришло? { char ch=Serial.read(); // читаем что пришло if ((ch=='T')|| (ch=='t')) { Serial.println(" "); Serial.print("Please enter HOUR : "); while (Serial.available()==0) HOUR=Serial.parseInt(); {} Serial.println (HOUR); Serial.print("Please enter MINUTE : "); while (Serial.available()==1) {} MINUTE=Serial.parseInt(); Serial.println (MINUTE); Serial.print("Please enter SECOND : "); while (Serial.available()==1) {} SECOND=Serial.parseInt(); Serial.println (SECOND); Serial.println (""); Serial.print(HOUR); Serial.print(":"); Serial.print(MINUTE); Serial.print(":"); Serial.print(SECOND); Serial.println (""); Serial.println("Press 'W' to set time or 'N' to exit"); while (Serial.available()) { Serial.read(); } } if ((ch=='D')|| (ch=='d')) { Serial.println(" "); Serial.print("Please enter YEAR : "); while (Serial.available()==0) YEAR=Serial.parseInt(); {} Serial.println (YEAR); Serial.print("Please enter MONTH : "); while (Serial.available()==1) {} MONTH=Serial.parseInt(); Serial.println (MONTH); Serial.print("Please enter DAY : "); while (Serial.available()==1) {} DAY=Serial.parseInt(); Serial.println (DAY); Serial.println (""); Serial.print(DAY); Serial.print("/"); Serial.print(MONTH); Serial.print("/"); Serial.println(YEAR); Serial.println(""); Serial.println("Press 'Q' to set date or 'N' to exit"); while (Serial.available()) { Serial.read(); } } if((ch=='N')|| (ch=='n')) // команда No (отказ от установки и показ текущего времени) { Serial.println (""); RTC.getTime(); // получить время от модуля print_RTC(); // выводим полученное время } if((ch=='W')|| (ch=='w')) // команда SetTime (установка нового времени) { Serial.println (""); setNewTime(); // установили время (записали их в RTC) RTC.getTime(); // получили данные от модуля print_RTC(); // вывели полученные данные Serial.println (""); Serial.println("Press 'T' to set the time or 'D' to set the date"); } if((ch=='Q')|| (ch=='q')) // команда SetDate (установка новой даты) { Serial.println (""); setNewDate(); // установили дату (записали ее в RTC) RTC.getTime(); // получили данные от модуля print_RTC(); // вывели полученные данные Serial.println (""); Serial.println("Press 'T' to set the time or 'D' to set the date"); } } } void print_RTC() // вывод времени на экран { byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете if(RTC.second!=prevSecond) { if (RTC.hour < 10) { Serial.print("0"); Serial.print(RTC.hour, DEC); } else { Serial.print(RTC.hour, DEC); } Serial.print(":"); if (RTC.minute < 10) { Serial.print("0"); Serial.print(RTC.minute, DEC); } else { Serial.print(RTC.minute, DEC); } Serial.print(":"); if (RTC.second < 10) { Serial.print("0"); Serial.print(RTC.second, DEC); } else { Serial.print(RTC.second, DEC); } Serial.print(" "); if (RTC.day < 10) { Serial.print("0"); Serial.print(RTC.day, DEC); } else { Serial.print(RTC.day, DEC); } Serial.print("/"); if (RTC.month < 10) { Serial.print("0"); Serial.print(RTC.month, DEC); } else { Serial.print(RTC.month, DEC); } Serial.print("/"); Serial.print(RTC.year, DEC); Serial.println(" "); prevSecond=RTC.second; // запомнили когда мы "отчитались" } }Вдруг кому нибудь пригодится
// include the library code: #include <LiquidCrystalRus.h> // initialize the library with the numbers of the interface pins LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2); #include <iarduino_RTC.h> iarduino_RTC time(RTC_DS1307); byte lghtStatZ1 = 0; //статус освещения зала 1 лампа byte lghtStatZ2 = 0; //статус освещения зала 2 лампа byte lghtStatD = 0; //статус освещения детской byte lghtStatS = 0; //статус освещения спальни byte lghtStatK = 0; //статус освещения кухни byte lghtStatW = 0; //статус освещения ванны byte statusBoy = 0; //статус включения бойлера byte statusDay = 0; //статус включения режима дня(0-выкл 1-вкл) byte statusHome = 0; //статус безусловного включения дома byte statusLGHT = 0; //статус освещения(фотореле) byte statusWeekday = 0; //статус дня недели( 0-раб дни, 1-выходные) byte statusNight = 0; //статус ночного режима float TempKuh; float TempUlica; float TempWanna; //формат указания текущего времени "ДД.ММ.ГГ чч:мм:сс D" //где ДД - день, ММ - месяц, ГГ - год, чч - часы, мм - минуты, сс - секунлы //ГГ - от 00 до 99 для 2000-2099 годов D - номер дня недели void setTimeFromFormatString(String stime) { //ДД.ММ.ГГ чч:мм:сс int sday = stime.substring(0, 2).toInt(); int smonth = stime.substring(3, 5).toInt(); int syear = stime.substring(6, 8).toInt(); int hours = stime.substring(9, 11).toInt(); int minutes = stime.substring(12, 14).toInt(); int seconds = stime.substring(15, 17).toInt(); int sD = stime.substring(18, 19).toInt(); time.settime (seconds, minutes, hours, sday, smonth, syear, sD); } void LCD() { lcd.setCursor(0, 0); lcd.print(time.gettime("w/H:i:s")); lcd.print("/"); lcd.print(statusHome); lcd.print(statusDay); lcd.print(statusNight); lcd.print(statusWeekday); lcd.print(statusLGHT); // set the cursor to column 0, line 1 // (note: line 1 is the second row, since counting begins with 0): lcd.setCursor(0, 1); // print the number of seconds since reset: lcd.print(int(TempKuh));lcd.print("/"); lcd.print(int(TempWanna));lcd.print("/"); lcd.print(int(TempUlica));lcd.print("/"); lcd.print(lghtStatZ1); lcd.print(lghtStatZ2); lcd.print(lghtStatD); lcd.print(lghtStatS); lcd.print(lghtStatK); lcd.print(lghtStatW); lcd.print(statusBoy); } void setup() { Serial.begin(9600); // set up the LCD's number of rows and columns: lcd.begin(16, 2); time.begin(); } void loop() { if (Serial.available()) { //поступила команда с временем setTimeFromFormatString(Serial.readStringUntil('\n')); } LCD(); }