ВКЛ и ВЫКЛ реле по времени

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

Подскажите как правильно сделать  нужно включать и выключать реле по времени  в void loop крутиться так и еше выводим инфу на дисплей. проблема часыки тормозяться .... 

HELP

void loop() 
{

lcd.setCursor(0,0);
  lcd.print(RTC.get(DS1307_HR,true)); // печатаем час
  lcd.print(":"); // печатаем разделитель
  lcd.print(RTC.get(DS1307_MIN,false)); // печатаем минуты
  lcd.print(":"); // печатаем разделитель
  lcd.print(RTC.get(DS1307_SEC,false)); // печатаем секунды

hours = RTC.get(DS1307_HR,true);
minutes = RTC.get(DS1307_MIN,false);
if (hours == 21){if (minutes == 48) digitalWrite(Relay1, LOW);} ;
minutes = RTC.get(DS1307_MIN,false);
if (hours == 21){if (minutes == 49) digitalWrite(Relay1, HIGH);} ;
}

 

Snubist
Offline
Зарегистрирован: 18.02.2013

Не совсем понятно в чем проблема. И в вашем коде зачем считывать минуты еще раз? Они и так считаны двумя строками выше. 

Для гарантированного срабатывания, нужно использовать не == , а < или >

Snubist
Offline
Зарегистрирован: 18.02.2013
hours = RTC.get(DS1307_HR,true);
minutes = RTC.get(DS1307_MIN,false);

lcd.setCursor(0,0);

  lcd.print(hours); // печатаем час
  lcd.print(":"); // печатаем разделитель
  lcd.print(minutes); // печатаем минуты
  lcd.print(":"); // печатаем разделитель
  lcd.print(RTC.get(DS1307_SEC,false)); // печатаем секунды
 
if (hours == 21 && minutes >= 48) 
   {
   digitalWrite(Relay1, LOW);
   }
else if (hours == 21 && minutes >= 49) 
   {
   digitalWrite(Relay1, HIGH);
   }
}

или окончание

if (hours == 21 && minutes >= 48  && minutes < 49) 
   {
   digitalWrite(Relay1, LOW);
   }
else 
   {
   digitalWrite(Relay1, HIGH);
   }

 

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

может тогда будет правильней тогда так  чтоб избежать ошибки. вдруг прибор откл и прив включении  он понял что надо включить реле. 

if (hours >= 21 && minutes >= 48) 
   {
   digitalWrite(Relay1, LOW);
   }
else 
   {
   digitalWrite(Relay1, HIGH);
   }

 

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

akimov_aleks пишет:

может тогда будет правильней тогда так  чтоб избежать ошибки. вдруг прибор откл и прив включении  он понял что надо включить реле. 

if (hours >= 21 && minutes >= 48) 
   {
   digitalWrite(Relay1, LOW);
   }
else 
   {
   digitalWrite(Relay1, HIGH);
   }

 

Так у вас условие будет выполняться по 12 минут 3 раза - с 21:48 до 22:00, затем с 22:48 до 23:00 и с 23:48 до 00:00. Вы лучше опишите по-подробнее что хотите.

Snubist
Offline
Зарегистрирован: 18.02.2013

Вот вот, что бы такого не получаось легче превести все к минутам, и работать с ними

On_Time=21*60+48; //включение 21:48  (приводим к минутам)
Off_Time=22*60+49; //выключение 22:49 
Curent_Time=RTC.get(DS1307_HR,true)*60+RTC.get(DS1307_MIN,false);//текущее время
if(On_Time < Off_Time) //Проверка, таймер в течении одних суток?
  {
    if (Curent_Time >= On_Time && Curent_Time <= Off_Time)
      {
        digitalWrite(Relay1, LOW);
      }
    else
      {
        digitalWrite(Relay1, HIGH);
      }
  }
else // если сутки сменились
  {
        if ((Curent_Time >= On_Time && Curent_Time <= 2820)||(Curent_Time >= 0 && Curent_Time <= Off_Time))//2820=24часа*60
      {
        digitalWrite(Relay1, LOW);
      }
    else
      {
        digitalWrite(Relay1, HIGH);
      }
  }

 

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

И кстати можно было поиском по сайту воспользоваться и найти уже готовый программируемый таймер http://arduino.ru/forum/obshchii/izmenenie-vremeni-taimera-na-ds1307#comment-28970 с сохранением в ЕЕПРОМ.

#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];
}

 

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

Snubist пишет:

Вот вот, что бы такого не получаось легче превести все к минутам, и работать с ними

On_Time=21*60+48; //включение 21:48  (приводим к минутам)
Off_Time=22*60+49; //выключение 22:49 
Curent_Time=RTC.get(DS1307_HR,true)*60+RTC.get(DS1307_MIN,false);//текущее время
if(On_Time < Off_Time) //Проверка, таймер в течении одних суток?
  {
    if (Curent_Time >= On_Time && Curent_Time <= Off_Time)
      {
        digitalWrite(Relay1, LOW);
      }
    else
      {
        digitalWrite(Relay1, HIGH);
      }
  }
else // если сутки сменились
  {
        if ((Curent_Time >= On_Time && Curent_Time <= 2820)||(Curent_Time >= 0 && Curent_Time <= Off_Time))//2820=24часа*60
      {
        digitalWrite(Relay1, LOW);
      }
    else
      {
        digitalWrite(Relay1, HIGH);
      }
  }

 

допустили ошибку 

On_Time=(21*60+36)-1; //включение 21:36  (приводим к минутам)
Off_Time=(21*60+37)-1; //выключение 21:37 (приводим к минутам)


 

Snubist
Offline
Зарегистрирован: 18.02.2013

akimov_aleks пишет:

допустили ошибку 

On_Time=(21*60+36)-1; //включение 21:36  (приводим к минутам)
Off_Time=(21*60+37)-1; //выключение 21:37 (приводим к минутам)

Обьясни плз, в чем ошибка?

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

по вашему коду на минуту позже срабатывает.

 

spa-sam
Offline
Зарегистрирован: 14.12.2012

Посмотри вот это...очень неплохой вариант вроде как)...

http://www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/

https://github.com/lucadentella/SimpleTimer

Snubist
Offline
Зарегистрирован: 18.02.2013

akimov_aleks пишет:

по вашему коду на минуту позже срабатывает.

Похоже ты набирал текст, а не копировал отсюда, и в проверке использовал >

if (Curent_Time > On_Time && Curent_Time <= Off_Time)

Вместо >=

if (Curent_Time >= On_Time && Curent_Time <= Off_Time)

 

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

Вашь код 


#include <Wire.h>                       // For some strange reasons, Wire.h must be included here
#include <DS1307.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int hours;
int minutes;
//блок реле 
int Relay1 = 2;
int Relay2 = 3;     
int Relay3 = 11;
int Relay4 = 12;     
int On_Time =0;
int Off_Time =0;
int Curent_Time = 0;

void setup()
{
  lcd.begin(16, 2); 
  Serial.begin(9600);
  pinMode(Relay1, OUTPUT); 
  pinMode(Relay2, OUTPUT); 
  pinMode(Relay3, OUTPUT); 
  pinMode(Relay4, OUTPUT);
  digitalWrite(Relay1, HIGH);
  digitalWrite(Relay2, HIGH);
  digitalWrite(Relay3, HIGH);
  digitalWrite(Relay4, HIGH);

}  

void loop()
{
hours = RTC.get(DS1307_HR,true);
minutes = RTC.get(DS1307_MIN,false);

lcd.setCursor(0,0);

  lcd.print(hours); // печатаем час
  lcd.print(":"); // печатаем разделитель
  lcd.print(minutes); // печатаем минуты
  lcd.print(":"); // печатаем разделитель
  lcd.print(RTC.get(DS1307_SEC,false)); // печатаем секунды

lcd.setCursor(0,2);
On_Time=21*60+29; 
Off_Time=22*60+30;  
Curent_Time=RTC.get(DS1307_HR,true)*60+RTC.get(DS1307_MIN,false);//текущее время
if(On_Time < Off_Time) //Проверка, таймер в течении одних суток?
  {
    if (Curent_Time >= On_Time && Curent_Time <= Off_Time)
      {
        digitalWrite(Relay1, LOW);
      }
    else
      {
        digitalWrite(Relay1, HIGH);
      }
  }
else // если сутки сменились
  {
        if ((Curent_Time >= On_Time && Curent_Time <= 2820)||(Curent_Time >= 0 && Curent_Time <= Off_Time))//2820=24часа*60
      {
        digitalWrite(Relay1, LOW);
      }
    else
      {
        digitalWrite(Relay1, HIGH);
      }
  }
}

снова перепроверил срабатыввает на минуту позже или раньше проверял раз 10.

модправил так работает как часы

#include <Wire.h>                       // For some strange reasons, Wire.h must be included here
#include <DS1307.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int hours;
int minutes;
//блок реле 
int Relay1 = 2;
int Relay2 = 3;     
int Relay3 = 11;
int Relay4 = 12;     
int On_Time =0;
int Off_Time =0;
int Curent_Time = 0;

void setup()
{
  lcd.begin(16, 2); 
  Serial.begin(9600);
  pinMode(Relay1, OUTPUT); 
  pinMode(Relay2, OUTPUT); 
  pinMode(Relay3, OUTPUT); 
  pinMode(Relay4, OUTPUT);
  digitalWrite(Relay1, HIGH);
  digitalWrite(Relay2, HIGH);
  digitalWrite(Relay3, HIGH);
  digitalWrite(Relay4, HIGH);

}  

void loop()
{
hours = RTC.get(DS1307_HR,true);
minutes = RTC.get(DS1307_MIN,false);

lcd.setCursor(0,0);

  lcd.print(hours); // печатаем час
  lcd.print(":"); // печатаем разделитель
  lcd.print(minutes); // печатаем минуты
  lcd.print(":"); // печатаем разделитель
  lcd.print(RTC.get(DS1307_SEC,false)); // печатаем секунды

lcd.setCursor(0,2);
On_Time=(21*60+29)-1; 
Off_Time=(22*60+30)-1; 
Curent_Time=RTC.get(DS1307_HR,true)*60+RTC.get(DS1307_MIN,false);//текущее время
if(On_Time < Off_Time) //Проверка, таймер в течении одних суток?
  {
    if (Curent_Time >= On_Time && Curent_Time <= Off_Time)
      {
        digitalWrite(Relay1, LOW);
      }
    else
      {
        digitalWrite(Relay1, HIGH);
      }
  }
else // если сутки сменились
  {
        if ((Curent_Time >= On_Time && Curent_Time <= 2820)||(Curent_Time >= 0 && Curent_Time <= Off_Time))//2820=24часа*60
      {
        digitalWrite(Relay1, LOW);
      }
    else
      {
        digitalWrite(Relay1, HIGH);
      }
  }
}

 

 

Snubist
Offline
Зарегистрирован: 18.02.2013

Похоже задержка у вас конкретная.

Ладно главное работает.

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

спасибо. как с вами можно связаться ...... icq 601712

saidovdiman
Offline
Зарегистрирован: 04.10.2014

Подскажите , пожалуйста, нужно тоже самое от ардуины , но этот скетч выдает ошибку при компиляции "sketch_oct04a.ino:32:17: error: 'DS1307_HR' was not declared in this scope

sketch_oct04a.ino:33:19: error: 'DS1307_MIN' was not declared in this scope
sketch_oct04a.ino:39:21: error: 'DS1307_SEC' was not declared in this scope" 
, что переделать ?
 
akimov_aleks
Offline
Зарегистрирован: 04.04.2013

не тот модуль значит. качай другой.

saidovdiman
Offline
Зарегистрирован: 04.10.2014


Скачал другую библиотеку и заменил в коде . Теперь другая ошибка sketch_oct04acklock2.ino:49:47: error: 'class DS1307new' has no member named 'get'



#include <DS1307new.h>
#include <Wire.h>                       // For some strange reasons, Wire.h must be included here
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int hours;
int minutes;
//блок реле 
int Relay1 = 2;
int Relay2 = 3;     
int Relay3 = 11;
int Relay4 = 12;     
int On_Time =0;
int Off_Time =0;
int Curent_Time = 0;

void setup()
{
  lcd.begin(16, 2); 
  Serial.begin(9600);
  pinMode(Relay1, OUTPUT); 
  pinMode(Relay2, OUTPUT); 
  pinMode(Relay3, OUTPUT); 
  pinMode(Relay4, OUTPUT);
  digitalWrite(Relay1, HIGH);
  digitalWrite(Relay2, HIGH);
  digitalWrite(Relay3, HIGH);
  digitalWrite(Relay4, HIGH);

}  

void loop()
{
hours = RTC.get(DS1307new_HR,true);
minutes = RTC.get(DS1307new_MIN,false);

lcd.setCursor(0,0);

  lcd.print(hours); // печатаем час
  lcd.print(":"); // печатаем разделитель
  lcd.print(minutes); // печатаем минуты
  lcd.print(":"); // печатаем разделитель
  lcd.print(RTC.get(DS1307new_SEC,false)); // печатаем секунды

lcd.setCursor(0,2);
On_Time=(21*60+29)-1; 
Off_Time=(22*60+30)-1; 
Curent_Time=RTC.get(DS1307new_HR,true)*60+RTC.get(DS1307new_MIN,false);//текущее время
if(On_Time < Off_Time) //Проверка, таймер в течении одних суток?
  {
    if (Curent_Time >= On_Time && Curent_Time <= Off_Time)
      {
        digitalWrite(Relay1, LOW);
      }
    else
      {
        digitalWrite(Relay1, HIGH);
      }
  }
else // если сутки сменились
  {
        if ((Curent_Time >= On_Time && Curent_Time <= 2820)||(Curent_Time >= 0 && Curent_Time <= Off_Time))//2820=24часа*60
      {
        digitalWrite(Relay1, LOW);
      }
    else
      {
        digitalWrite(Relay1, HIGH);
      }
  }
}

 

 


aleksandr-crimea
Offline
Зарегистрирован: 28.09.2014

прошу обьяснить почему необходимо все перевести в минуты, не проще ли будет в условии прописать == вместо >=

 

if( Hour == 12 && Minute >= 24 ){digitalWrite(ledPin, HIGH);}

if( Hour == 12 && Minute >= 25 ){digitalWrite(ledPin, LOW);}

Andrey_Shatov
Offline
Зарегистрирован: 23.03.2015

Всем доброго вечера, у меня вопрос, хочу сделать включение 1 канала реле один раз в неделю (регулярно), допустим в понедельник на 3 секунды с 12.00.00. При этом присоединив к ардуино часы реально времени (RTC) на случай отключения питания, питать хочу от блока питания зарядки для телефона. Набросал схему и код, прошу умов проверить (я новичок), сам пока не могу, жду часы с ebay.

#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC 
#include <Time.h>
#include <DS1307.h> // Подключаем библиотеку часов
int Relay = 12; // Назначаем выход для управлением реле
int DAY
int HR
int MIN
int SEC

void setup(){
	Serial.begin(9600);
	while (!Serial); // Устанавливаем функцию для получения времени с часов
	setSyncProvider(RTC.get); //Устанавливаем время в формате: часы, минуты, секунды, день, месяц, год
    setTime(17,50,0,23,3,2015);
	RTC.set(now());	//Применяем:
	pinMode(Power, OUTPUT);
	pinMode(Relay, OUTPUT); // Устанавливаем выход для реле
	RTC.stop(); // остановка времени перед синхронизацией с компьютером
}
void loop(){
	RTC.get(rtc,true); // Получаем время из DS1307
	if(DOW == 1 && HR == 12 && MIN == 0 && SEC == 0){ // задаём день понельник время и время включения с 12.00.00
	digitalWrite(Relay, HIGH); //реле включено
	} 
	delay(3000); //задержка на 3 секунды
	else { //иначе
	digitalWrite(Relay, LOW); //реле выключено
	}
}

 

Andrey_Shatov
Offline
Зарегистрирован: 23.03.2015
aleks3905
aleks3905 аватар
Offline
Зарегистрирован: 18.02.2015

Вы какими библиотеками пользуетесь. Мои не понимают: 

  
     int DAY
06 int HR
07 int MIN
08 int SEC

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

А так  понимает?

int DAY   ;
int HR    ;
int MIN  ;
int SEC  ;

Ещё........

if ( DOW == 1 && HR == 12 && MIN == 0 && SEC == 0)

 

vov4ik
Offline
Зарегистрирован: 10.09.2013

Если раз в неделю то надо было DC1302, там запросить неделю (типа byte) , а тут вам счётчик нужно делать.

AlexRyzh
Offline
Зарегистрирован: 11.11.2015

Интересно, а можно (реально это) сделать многоканальное (например 4-5 каналов), программируемое недельное реле времени с 10-15 программами вкл-откл. на каждый канал?

Если можно (думаю можно), то на какой друине? Нано достаточно, или Уно для этого нужно?

Программирование вкл.-откл. организовать кнопками, дисплей такой http://pt.aliexpress.com/item/New-0-96-I2C-IIC-Serial-128X64-OLED-LCD-LED-Display-Module-For-Arduino-55785/32357566914.html?spm=2114.031030708.3.19.DrdFCx&ws_ab_test=searchweb201556_1,searchweb201644_1_79_78_77_82_80_62_81,searchweb201560_5

Ну и релюшки соответственно. Решал кто подобную задачу? Реально это?

std
Offline
Зарегистрирован: 05.01.2012

Можно, и Nano отличается от Uno только размерами, выводов столько же.

Но на такие сроки однозначно нужны часы. Экран имхо лучше 1602, меньше кода уходит на него.

10-15 программ включений 4 релюх должны по-идее поместиться в штатной памяти EEPROM, но если нет - можно поставить внешнюю, тем более на многих модулях с часами она есть.

AlexRyzh
Offline
Зарегистрирован: 11.11.2015

Очасах я даже не упоминал, т.к. без них создание полноценного, автономного реле времени в принципе невозможно. А почему 1602. Там выводов куча,, которые занимают полезные пины, а в этом всего 2 вывода, кроме +-. Да и красивше выглядит. В цене разница, но не критичная. Тем более на eBay есть и за 3 бакса.

bwn
Offline
Зарегистрирован: 25.08.2014

На 1602 сожрете меньше памяти, да и для начинающего попроще. Чтобы 1602 стал с двумя выводами, нужно купить переходник i2C за 90 рублев. В целом, дело вкуса.

lex2k
Offline
Зарегистрирован: 17.12.2015

из кода выше if ((Curent_Time >= On_Time && Curent_Time <= 2820)||(Curent_Time >= 0 && Curent_Time <= Off_Time))//2820=24часа*60

вопрос зачем  Curent_Time <=2820)
 разве Curent_Time может достигнуть значения больше чем 2820=24часа*60
lex2k
Offline
Зарегистрирован: 17.12.2015

if ((Curent_Time >= On_Time && Curent_Time <= 2820)||(Curent_Time >= 0 && Curent_Time <= Off_Time))//2820=24часа*60

и одназначно Curent_Time >= 0 не может быть меньше

 

lex2k
Offline
Зарегистрирован: 17.12.2015

и вообще это как 2820=24часа*60

StyleWarrior
Offline
Зарегистрирован: 14.03.2016

Так как же правельно сделать проверку если таймер перескакивает на следующие сутки?

std
Offline
Зарегистрирован: 05.01.2012

Включить в переменную сутки.

То есть

byte day,   //0-30
     hour,  //0-23
     min;   //0-59

unsigned int timestamp=(day*24*60)+(hour*60)+min;   // max 44639

 

StyleWarrior
Offline
Зарегистрирован: 14.03.2016

А если таймер ежедневный:

начало 11:00

конец 02:00 (следующий день)

И нужна проверка, если пропало питание и после его включения если время входит в этот промежуток то включить реле

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

А вот как сделать проверку если конец переходит на следующие сутки сообразить немогу.

bwn
Offline
Зарегистрирован: 25.08.2014

Две проверки, если более 11*60+.. и менее 23*60+59 вторая, более 0 и менее 2*60+... Если входит в оба диапазона, тру.

Miller48
Offline
Зарегистрирован: 17.02.2017

Приветствую!

Я в работе с ардуинкой совсем новичок, но есть поставленная задача и её хотелось бы решить.

Нужно сделать реле времени что бы реле включались каждый день в разное время. Например реле 1 включалось с 7.00 до 16.00 , реле 2 включалось с 9.00 до 15.00 и реле 3 включалось с 12.00 до 14.30.

Есть ардуинка нано, 8 релейный модуль и часы реального времени ds1307. Подскажите как реализовать? Буду очень благодарен!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Написать алгоритм.

2. Прошить его в Ардуину.

3. Спаять схему.

4. Подключить питание.

victorr99
Offline
Зарегистрирован: 22.04.2016

#include <OLED_I2C.h>
OLED  myOLED(SDA, SCL, 8);
extern uint8_t MegaNumbers[];
extern uint8_t RusFont[];
extern uint8_t SmallFont[];
extern uint8_t term[];
extern uint8_t grad[];
#include <DS1307.h>
DS1307 rtc(A0, A1);
Time t;
#include <OneWire.h>
OneWire ds(4);
int x = 0;
#define timePIN 13
void setup() {
pinMode(13, OUTPUT);
myOLED.begin();
rtc.begin();
rtc.halt(false);
//rtc.setDOW(MONDAY);
//rtc.setTime(19, 19, 0);
//rtc.setDate(8, 3, 2017);
}
void loop() {
if (x >= 10) {
temp();
x=0;
}
else
{
watch();
}
x++;
}
void watch() {
myOLED.setFont(RusFont);
t = rtc.getTime();
switch (t.dow)
{
case 1:     myOLED.print("GJYTLTKMYBR", CENTER, 0);    break;
case 2:     myOLED.print("DNJHYBR", CENTER, 0);        break;
case 3:     myOLED.print("CHTLF", CENTER, 0);          break;
case 4:     myOLED.print("XTNDTHU", CENTER, 0);        break;
case 5:     myOLED.print("GZNYBWF", CENTER, 0);        break;
case 6:     myOLED.print("CE<<JNF", CENTER, 0);        break;
case 7:     myOLED.print("DJCRHTCTYMT", CENTER, 0);    break;
}
String stringOne = rtc.getTimeStr();
myOLED.setFont(MegaNumbers);
myOLED.print(stringOne.substring(0, 2), 4, 12);
myOLED.print("/", 51, 12);
myOLED.print(stringOne.substring(3, 5), 75, 12);
myOLED.setFont(RusFont);
switch (t.mon)
{
case 1:
myOLED.print(String(t.date), 30, 57);
myOLED.print("ZYDFHZ", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 2:
myOLED.print(String(t.date), 26, 57);
myOLED.print("ATDHFKZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
case 3:
myOLED.print(String(t.date), 30, 57);
myOLED.print("VFHNF", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 4:
myOLED.print(String(t.date), 30, 57);
myOLED.print("FGHTKZ", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 5:
myOLED.print(String(t.date), 36, 57);
myOLED.print("VFZ", CENTER, 57);
myOLED.print(String(t.year), 82, 57);
break;
case 6:
myOLED.print(String(t.date), 35, 57);
myOLED.print("B>YZ", CENTER, 57);
myOLED.print(String(t.year), 81, 57);
break;
case 7:
myOLED.print(String(t.date), 35, 57);
myOLED.print("B>KZ", CENTER, 57);
myOLED.print(String(t.year), 81, 57);
break;
case 8:
myOLED.print(String(t.date), 28, 57);
myOLED.print("FDUECNF", CENTER, 57);
myOLED.print(String(t.year), 90, 57);
break;
case 9:
myOLED.print(String(t.date), 24, 57);
myOLED.print("CTYNZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 94, 57);
break;
case 10:
myOLED.print(String(t.date), 26, 57);
myOLED.print("JRNZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
case 11:
myOLED.print(String(t.date), 28, 57);
myOLED.print("YJZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 90, 57);
break;
case 12:
myOLED.print(String(t.date), 26, 57);
myOLED.print("LTRF<HZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
}
myOLED.update();
delay(450);
myOLED.setFont(MegaNumbers);
myOLED.print("-", 51, 12);
myOLED.update();
delay(450);
}
void temp() {  
for(int x = 0; x < 10; x++){
byte data[2];
ds.reset();
ds.write(0xCC);
ds.write(0x44);
delay(250);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
int Temp = (data[1] << 8) + data[0];
Temp = Temp >> 4;
String stringOne = rtc.getTimeStr();
myOLED.clrScr();
myOLED.setFont(SmallFont);
myOLED.print(stringOne.substring(0, 5), 98, 0);
myOLED.print(rtc.getDateStr(), 0, 0);
myOLED.setFont(RusFont);
myOLED.print("NTVGTHFNEHF DJLS", CENTER, 57);
myOLED.drawBitmap(4, 12, term, 19, 40);
myOLED.setFont(MegaNumbers);
myOLED.print(String(Temp), CENTER, 12);
myOLED.drawBitmap(92, 12, grad, 13, 12); 
myOLED.update();
myOLED.clrScr();
}
}

Добрый день!

Есть следующий рабочий код, как прикрутить включение и выключение реле на 13 пине по заранее установленному времени.

Спасибо!

 

 

arDubino
Offline
Зарегистрирован: 12.01.2017

и шо это было?!!(c)

Neopetnui
Offline
Зарегистрирован: 04.12.2017

Кто поможет написать скетч нужна что бы ардуина просыпалась 2 раза в день с утра и вечером и вкльчала 2 двигателя по 3.3 в на разных пинах есть китайська ардуино уно и датчик реального времини DS3231AT24C32IIC модуль памяти DS3231SN

Neopetnui
Offline
Зарегистрирован: 04.12.2017

Двигатели нужно включять токо от 10 до 20 секунд 

vvadim
Offline
Зарегистрирован: 23.05.2012

Neopetnui пишет:

Кто поможет написать скетч нужна что бы ардуина просыпалась 2 раза в день с утра и вечером и вкльчала 2 двигателя по 3.3 в на разных пинах есть китайська ардуино уно и датчик реального времини DS3231AT24C32IIC модуль памяти DS3231SN

подразумевается что кто то вам должен написать программу, ?

Neopetnui
Offline
Зарегистрирован: 04.12.2017

Не должен а еще то кто бескорысно поможет в этой ситуацыи 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Neopetnui пишет:

Не должен а еще то кто бескорысно поможет в этой ситуацыи 

Бескорыстно помочь в этой ситуации тебе поможет учебник русского языка, плюс воспитание в себе навыка связно излагать свои мысли - мало кто владеет таким, как у тебя, дзеном, поэтому твой поток сознания не только лишь все дешифровать могут.

bwn
Offline
Зарегистрирован: 25.08.2014

Neopetnui пишет:

Не должен а еще то кто бескорысно поможет в этой ситуацыи 

Вы сами начните хоть что то делать. Тогда возможно и помогут. Хотя бы последние темы по форуму почитайте. Где то в ваш адрес отвечал, что буквально пару дней назад человек закончил подобный скетч, правда на один канал и с часовыми интервалами. Взяв его за основу легко сделаете и свою задачу. Искать за вас и писать вряд ли у кого есть желание.

Khabibra
Offline
Зарегистрирован: 05.04.2018

Подскажите пожалуйста, а как на 1302 организовать управление нагрузкой по времери.?
Утром вкл на 3 сек, выкл. И вечером то же действие?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Khabibra пишет:
Подскажите пожалуйста, а как на 1302 организовать управление нагрузкой по времери.? Утром вкл на 3 сек, выкл. И вечером то же действие?

Ручками: получаем время с часов, смотрим - утро? Включили на 3 секунды. Смотрим - вечер? Включили на 3 секунды.

Khabibra
Offline
Зарегистрирован: 05.04.2018

Спасибо за помощь добрый человек. 

Есть такой код: #include <DS1302.h>

Time t;
int t1=5; // Час включения света
int m1=0; // Минуты включения
int t2=23; // Час вылючения света
int m2=0; // Минуты вылючения
int d; // Переменная в которую записываются текущий показатель часов
int m; // Переменная в которую записываются текущий показатель минут
// Реле модуль подключен к цифровому выводу 5
int Relay = 5;
// Подключение the DS1302
// DS1302:  CE pin  (RES)  -> Arduino Digital 2
//          I/O pin (DAT)  -> Arduino Digital 3
//          SCLK pin(CLK) -> Arduino Digital 4
DS1302 rtc(2, 3, 4);
 
void setup()
{
   pinMode(Relay, OUTPUT); 
 
  
  // Setup Serial connection (Установки подключения)
  Serial.begin(9600);
 
  // The following lines can be commented out to use the values already stored in the DS1302(Строки ниже нужно раскоментировать если вы устанавливаете дату и время в модуль после установки нужно опять закоментировать)
  // Set the clock to run-mode, and disable the write protection
//  rtc.halt(false);
 // rtc.writeProtect(false);
  //rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
 // rtc.setTime(21, 17, 0);     // Set the time to 12:00:00 (24hr format)
 // rtc.setDate( 4, 2, 2017);   // Set the date to August 6th, 2010
}
 
void loop()
{
  t = rtc.getTime();
  // Send Day-of-Week(Передать день недели)
 //Serial.print(rtc.getDOWStr());
 // Serial.print(" ");
  
  // Передать дату
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");
d=t.hour,DEC;
m=t.min,DEC;
  // Передать время
  Serial.println(rtc.getTimeStr());
  
  
  
  if (d >= t1 && d <= t2) {
                          if (d==t1 && m<m1) {goto label;}
                          if (d==t2 && m>m2) {goto label;}
   digitalWrite(Relay, HIGH);   // реле включено
   Serial.println(" HIGH ");
                        }
                        else
                            {  
                             label:           
                            digitalWrite(Relay, LOW);  // реле выключено 
                            Serial.println(" LOW "); 
                            }
  delay(10000);  // задержка 10 сек
}
Не могу поставить время. что бы и утром вкл выкл и вечером то же. То есть два таймера на день. Не поможете?
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Khabibra пишет:

Не поможете?

Отчего ж не помочь? Конечно, помогу: http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii