изменение времени таймера на DS1307
- Войдите на сайт для отправки комментариев
Пт, 19/04/2013 - 11:33
Добрый день!
опять нуб просит вашей помощи :(
Дело в том что требуеться изменять значение 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);
}
Странно, вроде бы у Вас уже почти все сделано, что нужно. Осталось в обработчике SetTime проверить, что пришло по сериалу и в зависимости от этого выставлять либо время на часах, либо
нужные Вам переменные.
В чем конкретно у вас проблема?
Осталось в обработчике SetTime проверить, что пришло по сериалу и в зависимости от этого выставлять либо время на часах, либо
нужные Вам переменные.
вот с этим у меня проблема =( не как не могу докумекать что писать и куда
Команды 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.Х
maksim хотелось бы чтоб не обнулялось значения при перезагрузки =) но и на этом огромное спасибо
Сохраняйте в EEPROM.
Максим для меня это немного сложновато пока =(
#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]; }Максим попробовал Вш код и постигла не удача ((( пин 10 постояно влючен
#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]; }Максим не первый раз Вы меня выручаете ! последний код работает
Максим возможно ли добавать второй таймер на другой пин? ( независимых друг от друга 2 таймера)
Конечно возможно.
а подскажите как ? (на примере ) =)