RTC, serial монитор и я

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Вот у меня такой вопрос ..

Как можно менять время из сериал монитора? Выполнить команду  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 года, время и день недели оставить без изменений
    }
}    

 

dimOnOff
Offline
Зарегистрирован: 21.04.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);  // запишем новые настройки времени (сек, мин, час, число, месяц, год, день недели)
// &nbsp; &nbsp;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.");
}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если по простому, то нужно передать через сериал строку с датой-временем (например, отправить такую строку с компа "M2016-02-12 18:15:04"), в Ардуино распарсить эту строку в переменные и вызвать setTime передав параметры через переменные.

 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

А как можно представить команду  time.settime(0,00,15,1,1,15,1)  в виде массива, чтобы потом поменять в массиве поэлементно? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kisoft пишет:

Если по простому, то нужно передать через сериал строку с датой-временем (например, отправить такую строку с компа "M2016-02-12 18:15:04"), в Ардуино распарсить эту строку в переменные и вызвать setTime передав параметры через переменные.

Троллите :)))

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

ЕвгенийП пишет:

kisoft пишет:

Если по простому, то нужно передать через сериал строку с датой-временем (например, отправить такую строку с компа "M2016-02-12 18:15:04"), в Ардуино распарсить эту строку в переменные и вызвать setTime передав параметры через переменные.

Троллите :)))


Почему? Разве это не проще, чем делать через меню? Я совершенно серьезно. Впрочем, наверное Вы просто шутите, а я не понял :)

dimOnOff
Offline
Зарегистрирован: 21.04.2015

С переборами типа меню вообще, думаю, замороченно выйдет) 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kisoft][quote=ЕвгенийП пишет:

Почему? Разве это не проще, чем делать через меню? Я совершенно серьезно. Впрочем, наверное Вы просто шутите, а я не понял :)

Да, нет, ну вот смотрите, ТС пишет: "time.settime(0,00,15,1,1,15,1) - это просто. А можно ли из сериал менять значения в скобках функции time.settime(...)". Т.е., уровень знанний и понимания в общем-то ясен. Так вот мне показалось, что предлагать человеку с таким уровнем знаний распарсить строку - троллинг. Ему бы взять книжку и с нуля читать, рабирая все примеры, но они ж (новички) обижаются на такие советы. Я уж и давать их почти перестал.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Как по мне, так сообщение по поводу распарсить строку куда дельнее, чем Ваши) Это по крайней мере наталкивает на мысль в этом разобраться. А "иди книжку с нуля читай и разбирайся" - это действительно дельный совет. Еще не понятно, кто тролит) 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

В общем получилось реализовать задуманное. Правда, не знаю насколько правильно это все, но, кажется, работает. В процессе перешел на другую библиотеку для 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; // запомнили когда мы "отчитались"
}

}

 

gloom78
Offline
Зарегистрирован: 23.10.2016

Вдруг кому нибудь пригодится

// 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();
}