изменение времени таймера на DS1307

Snecky
Offline
Зарегистрирован: 24.01.2012

Добрый день!
опять нуб просит вашей помощи :(
Дело в том что требуеться изменять значение FullMinutesTimerOn и FullMinutesTimeroff c помощью Serial monitor , домустим отправив команду ton09:45 изменится значение FullMinutesTimerOn на 09:45 (влючения TimePIN) ну и соответственно и изменять время выключения, уважаемые комрады возможно это сделать ?

 



#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> 
#define timePIN 10

void setup()
{
  Serial.begin(9600);
  
  pinMode(timePIN, OUTPUT); 
  
}
void loop()
{

if(Serial.available()) SetTime();
  int Hour = RTC.get(DS1307_HR, true); 
  int Minute = RTC.get(DS1307_MIN, false); 
  int Second = RTC.get(DS1307_SEC, false); 
  int FullMinutes = Hour * 60 + Minute;
  int FullMinutesTimerOn = 8 * 60 + 10; // включение света в 8:10
  int FullMinutesTimerOff = 19 * 60 + 30; // выключение в 19:30
  if(FullMinutes >= FullMinutesTimerOn && FullMinutes <= FullMinutesTimerOff) digitalWrite(timePIN, LOW); 
  else digitalWrite(timePIN, HIGH);


void SetTime()  
{ 
  delay(10);
  if (Serial.read() == 't') 
  { 
    int h = (Serial.read() - '0') * 10 + (Serial.read() - '0'); 
    Serial.read(); 
    int m = (Serial.read() - '0') * 10 + (Serial.read() - '0'); 
    RTC.stop(); 
    RTC.set(DS1307_SEC,0); 
    RTC.set(DS1307_MIN,m); 
    RTC.set(DS1307_HR,h); 
    RTC.start(); 
  } 
  while(Serial.available()) 
  {
    delay(2);
    Serial.read(); 
  }
}

String addZero(int val) // Добавим 0 перед значением часа/минуты/секунды, если оно меньше 10 
{ 
  if (val<10) return "0" + String(val);
  else return String(val); 
}

 

tsostik
Offline
Зарегистрирован: 28.02.2013

Странно, вроде бы у Вас уже почти все сделано, что нужно.  Осталось в обработчике SetTime проверить, что пришло по сериалу и в зависимости от этого выставлять либо время на часах, либо

нужные Вам переменные.

В чем конкретно у вас проблема?

Snecky
Offline
Зарегистрирован: 24.01.2012

 

Осталось в обработчике SetTime проверить, что пришло по сериалу и в зависимости от этого выставлять либо время на часах, либо
нужные Вам переменные.

вот с этим у меня проблема =( не как не могу докумекать что писать и куда 

maksim
Offline
Зарегистрирован: 12.02.2012

Команды n10:45 и f10:50, но вы должны понимать, что после перезагрузки эти значения обнулятся.

#include <Wire.h>
#include <DS1307.h> 
#define timePIN 10

#define f_read (Serial.read() - '0') * 10 + (Serial.read() - '0')
int FullMinutesTimerOn, FullMinutesTimerOff; // включение света в 8:10

void setup()
{
  Serial.begin(9600);
  pinMode(timePIN, OUTPUT); 

}
void loop()
{
  if(Serial.available()) 
  {
    delay(10);
    SetTime();
    if(Serial.read() == 'n') FullMinutesTimerOn = FullMinutesRead();
    if(Serial.read() == 'f') FullMinutesTimerOff = FullMinutesRead();
    SerialBuffClaer();
  }
  int Hour = RTC.get(DS1307_HR, true); 
  int Minute = RTC.get(DS1307_MIN, false); 
  int Second = RTC.get(DS1307_SEC, false); 
  int FullMinutes = Hour * 60 + Minute;

  if(FullMinutes >= FullMinutesTimerOn && FullMinutes <= FullMinutesTimerOff) digitalWrite(timePIN, LOW); 
  else digitalWrite(timePIN, HIGH);
}

void SetTime()  
{ 
  if (Serial.read() == 't') 
  { 
    int h = f_read; 
    Serial.read(); 
    int m = f_read; 
    RTC.stop(); 
    RTC.set(DS1307_SEC,0); 
    RTC.set(DS1307_MIN,m); 
    RTC.set(DS1307_HR,h); 
    RTC.start(); 
  } 
}

int FullMinutesRead()
{
  int h = f_read; 
  Serial.read(); 
  int m = f_read; 
  return h * 60 + m;
}

String addZero(int val) // Добавим 0 перед значением часа/минуты/секунды, если оно меньше 10 
{ 
  if (val<10) return "0" + String(val);
  else return String(val); 
}

void SerialBuffClaer()
{
  while(Serial.available()) 
  {
    delay(2);
    Serial.read(); 
  }
}

И скачайте более свежую версию ArduinoIDE 1.0.Х 

Snecky
Offline
Зарегистрирован: 24.01.2012

maksim  хотелось бы чтоб не обнулялось значения  при перезагрузки  =) но и на этом огромное спасибо 

maksim
Offline
Зарегистрирован: 12.02.2012

Сохраняйте в EEPROM.

Snecky
Offline
Зарегистрирован: 24.01.2012

Максим  для меня это немного сложновато пока =(

maksim
Offline
Зарегистрирован: 12.02.2012
#include <EEPROM.h>
#include <Wire.h>
#include <DS1307.h> 
#define timePIN 10

#define f_read (Serial.read() - '0') * 10 + (Serial.read() - '0')
int FullMinutesTimerOn = EEPROM_read(0);
int FullMinutesTimerOff = EEPROM_read(2); 

void setup()
{
  Serial.begin(9600);
  pinMode(timePIN, OUTPUT); 
}

void loop()
{
  if(Serial.available()) 
  {
    delay(10);
    SetTime();
    SetTimeOn();
    SetTimeOff();
    SerialBuffClaer();
  }
  
  int Hour = RTC.get(DS1307_HR, true); 
  int Minute = RTC.get(DS1307_MIN, false); 
  int Second = RTC.get(DS1307_SEC, false); 
  
  int FullMinutes = Hour * 60 + Minute;
  if(FullMinutes >= FullMinutesTimerOn && FullMinutes <= FullMinutesTimerOff) digitalWrite(timePIN, LOW); 
  else digitalWrite(timePIN, HIGH);
}

void SetTime()  
{ 
  if (Serial.read() == 't') 
  { 
    int h = f_read; 
    Serial.read(); 
    int m = f_read; 
    RTC.stop(); 
    RTC.set(DS1307_SEC,0); 
    RTC.set(DS1307_MIN,m); 
    RTC.set(DS1307_HR,h); 
    RTC.start(); 
  } 
}

void SetTimeOn()  
{ 
  if(Serial.read() == 'n') 
  {
    FullMinutesTimerOn = FullMinutesRead();
    EEPROM_write(0, FullMinutesTimerOn);
  }
}

void SetTimeOff()  
{
  if(Serial.read() == 'f') 
  {
    FullMinutesTimerOff = FullMinutesRead();
    EEPROM_write(2, FullMinutesTimerOff);
  }
}

int FullMinutesRead()
{
  int h = f_read; 
  Serial.read(); 
  int m = f_read; 
  return h * 60 + m;
}

String addZero(int val) // Добавим 0 перед значением часа/минуты/секунды, если оно меньше 10 
{ 
  if (val<10) return "0" + String(val);
  else return String(val); 
}

void SerialBuffClaer()
{
  while(Serial.available()) 
  {
    delay(2);
    Serial.read(); 
  }
}

void EEPROM_write(int addr, int val)  // запись в ЕЕПРОМ
{
  byte *x = (byte *)&val;
  EEPROM.write(addr, x[0]);
  EEPROM.write(addr+1, x[1]);
}

int EEPROM_read(int addr) // чтение из ЕЕПРОМ
{  
  byte x[] = {EEPROM.read(addr), EEPROM.read(addr+1)};
  int *y = (int *)&x;
  return y[0];
}

 

Snecky
Offline
Зарегистрирован: 24.01.2012

Максим попробовал Вш код и  постигла не удача (((  пин 10 постояно влючен

maksim
Offline
Зарегистрирован: 12.02.2012
#include <EEPROM.h>
#include <Wire.h>
#include <DS1307.h> 
#define timePIN 10

#define f_read (Serial.read() - '0') * 10 + (Serial.read() - '0')
int FullMinutesTimerOn = EEPROM_read(0);
int FullMinutesTimerOff = EEPROM_read(2); 

void setup()
{
  Serial.begin(9600);
  pinMode(timePIN, OUTPUT); 
  Serial.print("TimeOn: ");
  Serial_print(FullMinutesTimerOn/60, FullMinutesTimerOn%60);
  Serial.print("TimeOff: ");
  Serial_print(FullMinutesTimerOff/60, FullMinutesTimerOff%60);
}

void loop()
{
  if(Serial.available()) 
  {
    delay(10);
    SetTime();
    SetTimeOn();
    SetTimeOff();
    SerialBuffClear();
  }

  int Hour = RTC.get(DS1307_HR, true); 
  int Minute = RTC.get(DS1307_MIN, false); 
  int Second = RTC.get(DS1307_SEC, false); 

  int FullMinutes = Hour * 60 + Minute;
  if(FullMinutes >= FullMinutesTimerOn && FullMinutes <= FullMinutesTimerOff) digitalWrite(timePIN, LOW); 
  else digitalWrite(timePIN, HIGH);
}

void SetTime()  
{ 
  if (Serial.peek() == 't') 
  { 
    Serial.read(); 
    int h = f_read; 
    Serial.read(); 
    int m = f_read; 
    RTC.stop(); 
    RTC.set(DS1307_SEC,0); 
    RTC.set(DS1307_MIN,m); 
    RTC.set(DS1307_HR,h); 
    RTC.start();
    Serial.print("SetTime: ");
    Serial_print(h, m);
  } 
}

void SetTimeOn()  
{ 
  if(Serial.peek() == 'n') 
  {
    Serial.read(); 
    FullMinutesTimerOn = FullMinutesRead();
    EEPROM_write(0, FullMinutesTimerOn);
    Serial.print("SetTimeOn: ");
    Serial_print(FullMinutesTimerOn/60, FullMinutesTimerOn%60);
  }
}

void SetTimeOff()  
{
  if(Serial.peek() == 'f') 
  {
    Serial.read(); 
    FullMinutesTimerOff = FullMinutesRead();
    EEPROM_write(2, FullMinutesTimerOff);
    Serial.print("SetTimeOff: ");
    Serial_print(FullMinutesTimerOff/60, FullMinutesTimerOff%60);
  }
}

int FullMinutesRead()
{
  int h = f_read; 
  Serial.read(); 
  int m = f_read; 
  return h * 60 + m;
}

String addZero(int val) // Добавим 0 перед значением часа/минуты/секунды, если оно меньше 10 
{ 
  if (val<10) return "0" + String(val);
  else return String(val); 
}

void Serial_print(byte h, byte m)
{
  Serial.print(addZero(h));
  Serial.print(":");
  Serial.println(addZero(m));
}

void SerialBuffClear()
{
  while(Serial.available()) 
  {
    delay(2);
    Serial.read(); 
  }
}

void EEPROM_write(int addr, int val)  // запись в ЕЕПРОМ
{
  byte *x = (byte *)&val;
  EEPROM.write(addr, x[0]);
  EEPROM.write(addr+1, x[1]);
}

int EEPROM_read(int addr) // чтение из ЕЕПРОМ
{  
  byte x[] = {
    EEPROM.read(addr), EEPROM.read(addr+1)  };
  int *y = (int *)&x;
  return y[0];
}

 

Snecky
Offline
Зарегистрирован: 24.01.2012

Максим не первый раз Вы меня выручаете ! последний код работает 

Snecky
Offline
Зарегистрирован: 24.01.2012

Максим  возможно ли  добавать второй таймер на другой пин? ( независимых друг от друга 2 таймера)

maksim
Offline
Зарегистрирован: 12.02.2012

Конечно возможно.

Snecky
Offline
Зарегистрирован: 24.01.2012

а подскажите как ? (на примере )  =)