Управление котлом при двухтарифном счетчике на ардуино

Искромет
Offline
Зарегистрирован: 18.03.2017

Здравствуйте.

Вот уже который год я пытаюсь освоить ардуино...

Хотел сделать отопление котлом при двухтарифном счетчике, но с часами реального времени так и не разобрался, по-этому котел управляется в итоге ардуино по температуре и реле времени (попалось на работе на глаза....). Сейчас встала проблема подобного же, только уже с гаражем.

Слепив код для моргания диода с измерением температуры при помощи LM35 получилась прога, которая будет включать-выключать по температуре, а вот со временем опять затык... Как проще сделать таймер, чтоб он включал в 23:00 и выключал в 07:00?

Заранее спасибо за советы.

 

[code]
int led = 13;
int raw = 0;
float temp = 0;
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
  iarduino_RTC watch(RTC_DS1302, 2, 3, 4);    
  
void setup() {
  pinMode(led, OUTPUT); 
  Serial.begin(9600);
  pinMode( A0, INPUT );
  delay(1000);                                             // Ждем готовности модуля отвечать на запросы
   watch.begin();     
}
 
void loop() {
  raw = analogRead(A0);
  temp = ( raw/1023.0 )*5.0*1000/10; 
  if (temp<25) digitalWrite(led, HIGH);
  if (temp>26) digitalWrite(led, LOW);
   if(millis()%1000==0)                                  // Если прошла 1 секунда.
      Serial.println(watch.gettime("d-m-Y, H:i:s, D"));    // Выводим время.
      delay(1000); 
      }
[/code]
Искромет
Offline
Зарегистрирован: 18.03.2017
[code]
int led = 13;
int raw = 0;
float temp = 0;
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
  iarduino_RTC watch(RTC_DS1302, 2, 3, 4);    
  
void setup() {
  pinMode(led, OUTPUT); 
  Serial.begin(9600);
  pinMode( A0, INPUT );
  delay(1000);                                             // Ждем готовности модуля отвечать на запросы
   watch.begin();     
}

void loop() {
  raw = analogRead(A0);
  temp = ( raw/1023.0 )*5.0*1000/10; 
  if (temp<25) digitalWrite(led, HIGH);
  if (temp>26) digitalWrite(led, LOW);
   if(millis()%1000==0)                                  // Если прошла 1 секунда.
      Serial.println(watch.gettime("d-m-Y, H:i:s, D"));    // Выводим время.
      delay(1000); 
      }
[/code]

 

Искромет
Offline
Зарегистрирован: 18.03.2017

Пока я только могу посмотреть время (благо теперь оно не стартует с одного и того же значения! :))) А вот как задать условие, чтоб светодиод ( в будущем реле) включался/выключался не только по времени, но и по температуре, если она ниже определенной уставки.

Искромет
Offline
Зарегистрирован: 18.03.2017

В сети есть уже готовые решения под контроллер с кнопками и дисплеем. Я же хочу ограничиться просто платой ,которая настраивается прям с компьютера, это должно быть даже проще, но пока вычленить нужные строчки не получается :(

Искромет
Offline
Зарегистрирован: 18.03.2017
if(set_on < set_off){
  
             if(now.hour() >= set_on && now.hour() < set_off ){             //Start
             digitalWrite(Relay, HIGH);
             }
             else if(now.hour() >= set_off) {
             digitalWrite(Relay, LOW);
             }
             else{
             digitalWrite(Relay, LOW);
             }
}
if (set_on > set_off){

            if(now.hour() >= set_on && now.hour() <= 23){                  //Start
            digitalWrite(Relay, HIGH);  
            }
            else if(now.hour() < set_off){
            digitalWrite(Relay, HIGH);
            }
            else if(now.hour() >= set_off && now.hour() < set_on){
            digitalWrite(Relay, LOW);  
            }

 

gfx125
Offline
Зарегистрирован: 27.05.2017

Искромет пишет:

Пока я только могу посмотреть время (благо теперь оно не стартует с одного и того же значения! :))) А вот как задать условие, чтоб светодиод ( в будущем реле) включался/выключался не только по времени, но и по температуре, если она ниже определенной уставки.

С библиотекой которую вы используете идут примеры. Вы их изучали?

Искромет
Offline
Зарегистрирован: 18.03.2017

ВЫ про библиотеку времени?

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

Пропустил что-то?

gfx125
Offline
Зарегистрирован: 27.05.2017

Искромет пишет:

Там я понял как ставить время, как его получать,

И что так сложно сравнить полученное время с требуемым и если оно совпало то выполнить необходимое действие?

Искромет
Offline
Зарегистрирован: 18.03.2017

Я на часы время установил и теперь могу их посмотреть в мониторе, но вот как их использовать, чтоб в 23 включить и в 07 выключить светодиод я пока не понимаю...

Знаю, что это должно быть очень просто, но пока не нашел....

Надо объявить переменную "Часы" и к ней уже условие выставлять, но пока не получилось :)

rkit
Offline
Зарегистрирован: 23.11.2016

Он хочет программировать не учась программировать. Дохлый номер.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

if ((Hour>=23)||(Hour<7)) Включить!!!();

Искромет
Offline
Зарегистрирован: 18.03.2017

Если уметь, то не сложно :)

Но как это время сравнить? ввести переменную "часы"?

Искромет
Offline
Зарегистрирован: 18.03.2017

Типа такого я уже пытался писать - не работает :)))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Это потому, что ты мало пьёшь. У меня - работает. 

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

Искромет пишет:

Типа такого я уже пытался писать - не работает :)))

Нет, не типа такого. Если бы типа такого, то работало бы.

Кстати, из всех RTC библиотек, которые я видел, Вы выбрали самую неудачную.

Искромет
Offline
Зарегистрирован: 18.03.2017

У меня не работает, потому как жалуется, что либо "Houts" не объявлены, либо еще что - но я на верном пути :)

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

Спасибо за простые подсказки - все начинали когда-то :)

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

Искромет пишет:

У меня не работает, потому как жалуется, что либо "Houts" не объявлены, либо еще что

Так объявите

Искромет
Offline
Зарегистрирован: 18.03.2017
[code]
int led = 13;
int raw = 0;
int Hours;
int On_Time =0;
int Off_Time =0;
int Current_Time =0;
float temp = 0;
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
  iarduino_RTC watch(RTC_DS1302, 2, 3, 4);    
  
void setup() {
  pinMode(led, OUTPUT); 
  Serial.begin(9600);
  pinMode( A0, INPUT );
  delay(1000);                                             // Ждем готовности модуля отвечать на запросы
   watch.begin();  
   Current_time = watch.gettime(H);   
}

void loop() {
  raw = analogRead(A0);
  temp = ( raw/1023.0 )*5.0*1000/10; 
  if (temp<22) digitalWrite(led, HIGH);
  if (temp>23) digitalWrite(led, LOW);
    delay(1000);  
                                   // Если прошла 1 секунда.
      Serial.println(temp);    // Выводим время.
      delay(1000);  
      Serial.println(watch.gettime("d-m-Y, H:i:s, D"));

       if(Curent_time() >= set_on && Curent_time() < set_off ){             //Start
             digitalWrite(led, HIGH);
             else if(Curent_time() >= set_off) {
             digitalWrite(Relay, LOW);
             }
             else{
             digitalWrite(Relay, LOW);
             }


      
      
  
  
      }
[/code]

 

Искромет
Offline
Зарегистрирован: 18.03.2017

Всем привет. 

Очередная попытка "задекларировать" текущее время провалилась...

Почему у меня при компеляции ошибка: "Current_time' was not declared in this scope"?

Ведь я же задекларировал... 

Искромет
Offline
Зарегистрирован: 18.03.2017

Спасибо огромное! 

Я думал вы пошутили и просто такая строчка работать не будет :)) Думал надо программу "писать" :))

Заработало!!!

Спасибо еще раз!

 

int led = 13;
int raw = 0;
int Hours;
int On_Time =0;
int Off_Time =0;
int Current_Time =0;
float temp = 0;
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
  iarduino_RTC watch(RTC_DS1302, 2, 3, 4);    
  
void setup() {
  pinMode(led, OUTPUT); 
  Serial.begin(9600);
  pinMode( A0, INPUT );
  delay(1000);                                             // Ждем готовности модуля отвечать на запросы
   watch.begin();  
   Hours =(watch.Hours);   
}

void loop() {
  raw = analogRead(A0);
  temp = ( raw/1023.0 )*5.0*1000/10; 
  if (temp<10) digitalWrite(led, HIGH);
  if (temp>44) digitalWrite(led, LOW);
    delay(1000);  
                                   // Если прошла 1 секунда.
      Serial.println(temp);    // Выводим время.
      delay(1000);  
      Serial.println(watch.gettime("d-m-Y, H:i:s, D"));

                  
            if ((Hours>=19)||(Hours<7)) digitalWrite(led, HIGH);
             
             }

 

Искромет
Offline
Зарегистрирован: 18.03.2017
int led = 12;
int raw = 0;
int Hours;
float temp = 0;
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
  iarduino_RTC watch(RTC_DS1302, 2, 3, 4);    
  
void setup() {
  pinMode(led, OUTPUT); 
  Serial.begin(9600);
  pinMode( A0, INPUT );
  delay(1000);                                             // Ждем готовности модуля отвечать на запросы
   watch.begin();  
   // Ниже у нас прописываются временные значения в виде секунд, минут, часов, даты, включая месяц и год, и также можете указать день недели
    //watch.settime(10,51,16,9,11,20,1);  // 10  сек, 10 мин, 10 час, 4 , октября, 2017 года, среда 
   Hours =(watch.Hours);   
}

void loop() {
  raw = analogRead(A0);
  temp = ( raw/1023.0 )*5.0*1000/10; 

if ((Hours>=23)||(Hours<7)) digitalWrite(led, HIGH);
else {
if (temp<10) digitalWrite(led, HIGH);
if (temp>12) digitalWrite(led, LOW);}
  
    delay(1000);  
                                  // Если прошла 1 секунда.
      Serial.println(temp);    // Выводим время.
      delay(1000);  
      Serial.println(watch.gettime("d-m-Y, H:i:s, D"));     
    
             
             }

Всем привет!

Оказывается "программа" (без кавычек на данном форуме ее называть некорректно), работавшая на столе при изменении времени или температуры отказывается работать "в железе"....

Мои потуги создать два условия, чтоб ночью включались тены (LED) вне зависимости от температуры с 23 до 7, а в остальное время поддерживали диапазон между 10 и 12 градусами пока не дали положительного результата. Прошу помощи указать ошибку, потому как племянница, закончившая физ-мат и работающая преподавателем информатики (ну вы в курсе про тех, кто учит и что умеет))) помочь не с смогла...


int led = 12;
int raw = 0;
int Hours;
float temp = 0;
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
  iarduino_RTC watch(RTC_DS1302, 2, 3, 4);    
  
void setup() {
  pinMode(led, OUTPUT); 
  Serial.begin(9600);
  pinMode( A0, INPUT );
  delay(1000);                                             // Ждем готовности модуля отвечать на запросы
   watch.begin();  
   // Ниже у нас прописываются временные значения в виде секунд, минут, часов, даты, включая месяц и год, и также можете указать день недели
    //watch.settime(10,51,16,9,11,20,1);  // 10  сек, 10 мин, 10 час, 4 , октября, 2017 года, среда 
   Hours =(watch.Hours);   
}

void loop() {
  raw = analogRead(A0);
  temp = ( raw/1023.0 )*5.0*1000/10; 

if ((Hours>=23)||(Hours<7)) digitalWrite(led, HIGH);
else {
if (temp<10) digitalWrite(led, HIGH);
if (temp>12) digitalWrite(led, LOW);}
  
    delay(1000);  
                                  // Если прошла 1 секунда.
      Serial.println(temp);    // Выводим время.
      delay(1000);  
      Serial.println(watch.gettime("d-m-Y, H:i:s, D"));     
    
             
             }

 

Вчера например обогрев после 23 не включился, но стоило только подключить кабель к компьютеру, то он включился и остался включенным после 7...  Если подключаю комп и меняю заданные уставки, то все работает... ничего не пойму :(

Искромет
Offline
Зарегистрирован: 18.03.2017

И еще один вопрос:

с удивлением обнаружил, что часы RTC_DS1302 убегают КАЖДЫЙ день на 2 мин! Это нормально для них или косяк какой-то? Я понимаю, что точности швейцарских часов грешно требовать от игрушки в наборе ардуино, но все же:) Как с точностью у других часов реального времени? 

Спасибо за ответ.

b707
Offline
Зарегистрирован: 26.05.2017

Искромет пишет:
Если подключаю комп и меняю заданные уставки, то все работает...

Ну не удивительно - вы ж часы читаете один раз - в сетапе при старте скетча.

а в ЛУП кто за вас будет переменную Hours обновлять - Пушкин?

Искромет
Offline
Зарегистрирован: 18.03.2017

То есть я попытался указать, что брать из часов

Hours =(watch.Hours);  

Но это неверно?

Это нужно в лупе указать?

b707
Offline
Зарегистрирован: 26.05.2017

Искромет пишет:

То есть я попытался указать, что брать из часов

Hours =(watch.Hours);  

Вы это делаете только один раз - в сетапе. Поэтому после старта все работет, а потом нет.

Или вы думали. что в лупе оно само обновляться будет? :))))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Искромет пишет:

Hours =(watch.Hours);  

Это так не работает, нельзя связать переменную Hours и watch.Hours, так чтобы Hours обновлялась отоматически.  Читать и присваиватьчасы надо именно там, где используются часы

kost82
Offline
Зарегистрирован: 30.11.2015

Искромет пишет:

Вчера например обогрев после 23 не включился, но стоило только подключить кабель к компьютеру, то он включился и остался включенным после 7...  Если подключаю комп и меняю заданные уставки, то все работает... ничего не пойму :(

Дайте угадаю: к компьютеру вы подключили ардуино уже после 23 часов и не отключали до 7 утра. Можно было просто включить/выключить - результат был бы таким же. Переменную Hours Вы получаете в setup(), который выполняется один раз, при старте устройства.

Искромет
Offline
Зарегистрирован: 18.03.2017

Спасибо, перенес в луп, тогда понятно почему на столе при изменении времени все работало после заливки при тестах :)

 

Искромет
Offline
Зарегистрирован: 18.03.2017

Угадали, вечером только подключил комп - программа сработала, утром же смотрю греет не выключаясь - просто выключил питание (от старой нокиа) и прога сработала.

То есть либо каждый день в 23 и в 7 включать -выключать, либо... сделать прогу рабочей :)) Перенес в луп, посмотрим как это скажется ночью - менять уставку времени смысла нет, я так эту прогу уже "отладил" :)))

b707
Offline
Зарегистрирован: 26.05.2017

Искромет пишет:

Перенес в луп, посмотрим как это скажется ночью - менять уставку времени смысла нет, я так эту прогу уже "отладил" :)))

Вы не пробовали хоть чуть-чуть научиться понимать. что написано в коде? Или так и будете отлаживать - перенес одну строчку, "попробовал" - не прокатило, перенес другую...

Искромет
Offline
Зарегистрирован: 18.03.2017

так это и есть мой долгий тернистый путь понимания - методом проб и ошибок...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ты в течение 3х с половиной лет так через тернии и не пробился. 

b707
Offline
Зарегистрирован: 26.05.2017

Искромет пишет:

так это и есть мой долгий тернистый путь понимания - методом проб и ошибок...

"понимания" ? - ты себе льстишь

Короче, ждем еще через пару месяцев новую серию постов "опять не работает".

Мужик, бросай это дело. С таким "пониманием" ты дом спалишь

Искромет
Offline
Зарегистрирован: 18.03.2017

Спасибо, за советы.

Перенес эту строчку в луп, поставил время с 23 до 16 и платка сама выключила :) Есть надежда, что прога все же рабочая :)

Дунул фреоном на датчик и она включила пол и выключила после отогрева датчика :)

Не беспокойтесь, дом не спалю - это отопление гаража в стяжке бетонного пола, проводка надежная, я электрик.

Посмотрим как будет работать :)

b707
Offline
Зарегистрирован: 26.05.2017

Искромет пишет:

 

Перенес эту строчку в луп, поставил время с 23 до 16 и платка сама выключила :) Есть надежда, что прога все же рабочая :)

покажи код, что получился

Искромет
Offline
Зарегистрирован: 18.03.2017
int led = 12;
int raw = 0;
int Hours;
float temp = 0;
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
  iarduino_RTC watch(RTC_DS1302, 2, 3, 4);    
  
void setup() {
  pinMode(led, OUTPUT); 
  Serial.begin(9600);
  pinMode( A0, INPUT );
  delay(1000);                                             // Ждем готовности модуля отвечать на запросы
   watch.begin();  
   // Ниже у нас прописываются временные значения в виде секунд, минут, часов, даты, включая месяц и год, и также можете указать день недели
    //watch.settime(10,51,16,9,11,20,1);  // 10  сек, 10 мин, 10 час, 4 , октября, 2017 года, среда 
    
}

void loop() {
  raw = analogRead(A0);
  temp = ( raw/1023.0 )*5.0*1000/10; 
  Hours =(watch.Hours);
if ((Hours>=23)||(Hours<7)) digitalWrite(led, HIGH);
else {
if (temp<10) digitalWrite(led, HIGH);
if (temp>12) digitalWrite(led, LOW);}
  
    delay(1000);  
                                  // Если прошла 1 секунда.
      Serial.println(temp);    // Выводим время.
      delay(1000);  
      Serial.println(watch.gettime("d-m-Y, H:i:s, D"));     
    
             
             }

Я просто ее перенес.... компеляция прошла, проверил - работает (вроде как :)