Не работает реле с RTC

voVWan
Offline
Зарегистрирован: 04.01.2016

День добрый. Перерыл кучу тем на форуме но так ответа и не нашел. 

Имею простейший код для включения реле по часам реального времени DS1307. Чаы подключены верно, время сохранят если отключать ардуино от питания. Время пингуется, все норм. Реле тоже подклчено верно, если из кода убрать составляющие которые связаны со временем то все вклбючается. Меня террзают смутные сомнения что код как то не верно переводит время в формат UNIX, не правильно высчитывает количество секунд с начала суток. 

Помогите пожалуста новичку разобраться :) Искал в сети как сделать таймер в формате обычного времени а не UNIX но так толком и не нашел ни чего :( Спасибо! 


#include <Wire.h>                               
#include <RTClib.h>                                 

RTC_DS1307 RTC;                                  

const int RelayChn1 = 6;                            //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля

//----------Настройки времени и продолжительности включения реле
const int StartRelCn_1 = 46500;                     //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток) 
                                                    //в данном случае 25200 - это 7 часов 00 минут  = ( 60 секунд *60 минут *7 = 25200) 
const int DurationCh_1 = 10;                        //ДЛИТЕЛЬНОСТЬ срабатывания реле (в секундах) 
 
void setup(){
  
  pinMode(RelayChn1,OUTPUT);                        //Инициализируем порт для реле как ВЫХОД

  digitalWrite(RelayChn1,HIGH);                     //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень 


  Wire.begin();                                    
  RTC.begin();                                      

}                                                  

void loop()                                         
{
    DateTime myTime = RTC.now();                    //Читаем данные времени из RTC при каждом выполнении цикла

    long utime = myTime.unixtime();                  //сохраняем в переменную - время в формате UNIX
    utime %= 86400;                                  //Сохраняем в этой же переменной остаток деления на кол-во секунд в сутках, 
                                                     //Это дает количество секунд с начала текущих суток

    if ((utime >= StartRelCn_1) &&                   //Если секунд с начала суток больше, чем задано для включения 
       (utime < (StartRelCn_1+DurationCh_1)))        //Но, одновременно и меньше, чем задано для включения + длительность 
                                                      
                                                      
      {
          digitalWrite(RelayChn1,LOW);                //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
      }  
    else                                              //во всех остальных случаях 
      {
          digitalWrite(RelayChn1,HIGH);               //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
      } 

}

 

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

voVWan пишет:

День добрый. Перерыл кучу тем на форуме но так ответа и не нашел. 

День добрый, перечитал Ваш пост раза три, но так вопроса и не нашёл!

Всё у Вас верно, всё работает, всё сохраняется, всё пингуется, а в чём же Вам помощь нужна?

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

voVWan
Offline
Зарегистрирован: 04.01.2016

спасибо за отзывчивость) вопрос в том почему реле не срабатывает в нужное время? оно вообще ни когда не включается, при любом значении прописанных секунд... 

Для проверки правильности подцепления реле, меняю параметры HIGH и LOW местами в этой строке

if ((utime >= StartRelCn_1) && 
       (utime < (StartRelCn_1+DurationCh_1)))
                                                     
                                                      
      {
          digitalWrite(RelayChn1,LOW);               
      }  
    else                                             
      {
          digitalWrite(RelayChn1,HIGH);              

и оно всегда включено становится, лампочка на реле загорается. Значит провода правильно подцеплены. 

 

Часы подключены вот по такой схеме: http://zelectro.cc/Media/Default/Periphery/13_RTC_module/RTC_main.jpg

а тут как и часы и реле вместе подцеплены. Мне нужно два реле, но пока код решил упростить до одного. 

voVWan
Offline
Зарегистрирован: 04.01.2016

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

voVWan пишет:

День добрый. Перерыл кучу тем на форуме но так ответа и не нашел. 

День добрый, перечитал Ваш пост раза три, но так вопроса и не нашёл!

Всё у Вас верно, всё работает, всё сохраняется, всё пингуется, а в чём же Вам помощь нужна?

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

ответил выше :)

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

Ну, смотрите, начнём с Вашей строки №9

const int StartRelCn_1 = 46500; 

Число 46500 в переменную типа int не лезет. Либо заменяйте на long, либо на unsigned int. Если второе, что осторожно, т.к. всего в сутках 86400 секунд, а это не полезет и в unisgned int.

далее, в районе строк 38 и 42 я бы поставил Serial.print и посмотрел бы как оно туда попадает. Если попадает нормально и всё правильно, но реле по-прежнему не включается, я бы посмотрел, что там у Вас за релейный модуль (какой ток нужен для срабатывания реле). Если там нет транзистора, то скорее всего реле требует большого тока (например, SRD-05VDC-SL-C кушает около 70ma - нога ардуины столько не даст), тогда надо ставить транзистор. Если же в модуле уже всё есть и ток требуется небольшой (до 20ma), то по идее должно работать. Если не работает, напишите, будем внимательнее текст смотреть.

 

voVWan
Offline
Зарегистрирован: 04.01.2016

Если запустить простейшую проверку времени из модуля часов DS1307, вот такую:

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
}

void loop () {
    // Определяем время
    DateTime now = RTC.now();
    
    // Выводим время в монитор порта
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
 
    delay(1000);
}

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

Но при этом не один скетч по включению реле на основе реального времени не работает :(

хотя если не трогая проводов запустить приметивный скетч включения реле, на тот же самый пин №6, но уже не используя данные из модуля реального времени, то реле будет запускаться и отключаться...

int Relay = 6;

void setup() 
{                
  pinMode(Relay, OUTPUT);     
}

void loop() 
{
  digitalWrite(Relay, HIGH);  
  delay(2000);  
  digitalWrite(Relay, LOW);   
  delay(12000);                            
}

 

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

Вы поправили StartRelCn_1, как я Вам говорил? И что? Не заработало? Если нте. выложите на всякий случай новый скетч целиком - булем любоваться.

voVWan
Offline
Зарегистрирован: 04.01.2016

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

Ну, смотрите, начнём с Вашей строки №9

const int StartRelCn_1 = 46500; 

Число 46500 в переменную типа int не лезет. Либо заменяйте на long

 

Ах вы ж мой спаситель!)))) заработало!!!! я блин три дня уже бьюсь над этой проблемой!)))

Попробовал сейчас вот такой таймер, нашел на забугорном форуме: http://www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/

так он чего то тоже не срабатывает у меня... или тоже у них ошибка в коде...

Спасибо что с первым кодом помогли разобраться!!

#include <Wire.h>
#include "RTClib.h"

// PIN definitions
#define RELAY_PIN 6

// FSM states
#define STATE_OFF  0
#define STATE_ON   1

// Timer settings
#define START_TIME  1646
#define END_TIME    1647

// variables
RTC_DS1307 RTC;
int fsm_state;

void setup() {
  
  Serial.begin(57600);
  Serial.println("SimpleTimer running...");
  Serial.println();

  Wire.begin();
  RTC.begin();  

  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);
  fsm_state = STATE_OFF;
}

void loop() {

  DateTime now = RTC.now();
  int nowHourMinute = now.hour() * 100 + now.minute();

  // FSM states
  switch(fsm_state) {
    
    case STATE_OFF:
      if(nowHourMinute > START_TIME && nowHourMinute < END_TIME) {
        Serial.print(now.hour(), DEC);
        Serial.print(':');
        Serial.print(now.minute(), DEC);
        Serial.println(", it's time to wake up!");
        digitalWrite(RELAY_PIN, HIGH);
        fsm_state = STATE_ON;
      }
      break;
    
    case STATE_ON:
      if(nowHourMinute > END_TIME) {
        Serial.print(now.hour(), DEC);
        Serial.print(':');
        Serial.print(now.minute(), DEC);        
        Serial.println(", it's time to go to sleep!");
        digitalWrite(RELAY_PIN, LOW);
        fsm_state = STATE_OFF;
      }    
      break;
  }
}

 

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

Ну, этот код не может работать. Посмотрите на строку 42

if(nowHourMinute > START_TIME && nowHourMinute < END_TIME) ...

Теперь, давайте переведём её на русский язык. попутно подставив значения констант из строк 12 и 13. Переводим:

ЕСЛИ nowHourMinute  больше чем 1646 И nowHourMinute меньше чем 1647 ТО ...

Это условие не будет истинным никогда. Ни при каком nowHourMinute  . Вы знаете такое число, которое было бы одновременно и больше чем 1646, и меньше чем 1647? Таких чисел просто не бывает.

Значит строки 43-48 не будут выполняться никогда.

voVWan
Offline
Зарегистрирован: 04.01.2016

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

Вы поправили StartRelCn_1, как я Вам говорил? И что? Не заработало? булем любоваться.

Вот полностью рабочий код на две реле, с вашей помощью все заработало :)


#include <Wire.h>                                   
#include <RTClib.h>                                

RTC_DS1307 RTC;                                     

//----------Объявляем разные переменные------------
const int RelayChn1 = 6;                            //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
const int RelayChn2 = 7;                            //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля
//----------Настройки времени и продолжительности включения реле

//----------ПЕРВЫЙ канал----------------------------
const long StartRelCn_1 = 61920;                     //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток) 
                                                    
const int DurationCh_1 = 30;                        //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах) 

//----------ВТОРОЙ канал----------------------------
const long StartRelCn_2 = 62020;                     //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток)
                                                   
const int DurationCh_2 = 30;                        //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах) 


void setup(){
  
  pinMode(RelayChn1,OUTPUT);                        //Инициализируем порт для ПЕРВОГО канала как ВЫХОД
  pinMode(RelayChn2,OUTPUT);                        //Инициализируем порт для ВТОРОГО канала как ВЫХОД   

  digitalWrite(RelayChn1,HIGH);                     //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень 
  digitalWrite(RelayChn2,HIGH);                     //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой 
  


  Wire.begin();                                     //Инициируем I2C интерфейс
  RTC.begin();                                      //Инициирум RTC модуль

}                                                  

void loop()                                         // ПРОГРАММЫй безусловный ЦИКЛ 
{
    DateTime myTime = RTC.now();                    //Читаем данные времени из RTC при каждом выполнении цикла

    //----------Раздел обработки реле по времени ----
    long utime = myTime.unixtime();                  //сохраняем в переменную - время в формате UNIX
    utime %= 86400;                                  //Сохраняем в этой же переменной остаток деления на кол-во секнд в сутках, 
                                                     //Это дает количество секунд с начала текущих суток

  //------------КАНАЛ 1------------------------------
    if ((utime >= StartRelCn_1) && 
       (utime < (StartRelCn_1+DurationCh_1)))
                                                      //Если секунд с начала суток больше, чем задано для включения 
                                                      //Но, одновременно и меньше, чем задано для включения + длительность 
      {
          digitalWrite(RelayChn1,LOW);                //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
      }  
    else                                              //во всех остальных случаях 
      {
          digitalWrite(RelayChn1,HIGH);               //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
      } 

    //------------КАНАЛ 2 - все аналогично -----------
    if ((utime >= StartRelCn_2) && 
       (utime < (StartRelCn_2+DurationCh_2)))
      {
          digitalWrite(RelayChn2,LOW);                  //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
      }  
    else
      {
          digitalWrite(RelayChn2,HIGH);               //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
      } 

}//------------Конец ЦИКЛА-----------------------------

 

Вопрос, а как правильнее вписать сюда 4 и более реле? И как в случае необходимости заставить какое то из них включаться в одних сутках а выключаться в других? Спасибо

 

Вроде бы простейшая и распространенная задача для ардуино: включение чего либо по времени. А работающий скетч в инете фиг найдешь! Ну трудно его написать самому если ардуино видишь ты всего 3 дня и до этого не программировал вообще...

Alexino
Offline
Зарегистрирован: 29.12.2015

voVWan пишет:

utime %= 86400; //Сохраняем в этой же переменной остаток деления на кол-во секнд в сутках, //Это дает количество секунд с начала текущих суток

Этого можно было и не делать, работать будет и не выделяя секунды по суткам.
Мало того, если Вы захотите включить реле незадолго до полуночи и время включения перехлестнёт полночь, то нарвётесь на неприятности.

Если хотите выделять из unixtime суточное время, то храните не точку включения и длительность, а 2 точки - включения и отключения реле. Тогда проблем никаких не будет.

voVWan
Offline
Зарегистрирован: 04.01.2016

Спасибо за дельный совет :) а как лучше объеденить 2 точки включения и выключения одного реле в Void loop?

и как оптимальнее там прописать допустим 4 реле, что бы случайно ни кто ни кому не помешал сработать

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

Alexino
Offline
Зарегистрирован: 29.12.2015

voVWan пишет:

а как лучше объеденить 2 точки включения и выключения одного реле в Void loop?

Такими же условиями на больше-меньше-равно...

voVWan пишет:

и как оптимальнее там прописать допустим 4 реле, что бы случайно ни кто ни кому не помешал сработать

Ну у Вас же сейчас 2 реле обрабатывается, и никто никому не мешает. И тут также - одинаковыми блоками.

arduinec
Offline
Зарегистрирован: 01.09.2015

voVWan пишет:

Имею простейший код для включения реле по часам реального времени DS1307. Чаы подключены верно, время сохранят если отключать ардуино от питания. Время пингуется, все норм. Реле тоже подклчено верно, если из кода убрать составляющие которые связаны со временем то все вклбючается. Меня террзают смутные сомнения что код как то не верно переводит время в формат UNIX, не правильно высчитывает количество секунд с начала суток. 

Из DS1307 можно сразу получать секунды, минуты, часы, дни и т.д. и не нужно будет считать секунды с начала суток.

http://www.youtube.com/watch?v=qq6AVdd5TFQ
 

Alexino
Offline
Зарегистрирован: 29.12.2015

А я бы для удобства сделал простенький класс, типа такого :

















class time{
public:
        time(unsigned char h=0, unsigned char m=0, unsigned char s=0){
            set_time(h, m, s);
        }
        time&   operator = (time &t){hour = t.hour; min = t.min; sec = t.sec; seconds = t.seconds; return *this;}
        boolean operator ==(time &t){return seconds==t.get_time();}
        boolean operator !=(time &t){return !(*this==t);}
        boolean operator > (time &t){return seconds>t.get_time();}
        boolean operator < (time &t){return seconds<t.get_time();}
        boolean operator >=(time &t){return seconds>=t.get_time();}
        boolean operator <=(time &t){return seconds<=t.get_time();}
        void set_time(unsigned char h, unsigned char m, unsigned char s){
            hour=h; min=m; sec=s;
            seconds=(unsigned long)h*1440 + (unsigned long)m*60 + s;
        }
        unsigned long get_time(){return seconds;};
private:
        unsigned char   hour;
        unsigned char   min;
        unsigned char   sec;
        unsigned long   seconds;
};

и потом спокойно работаем с ними :

















time    cur_time;
time    relay_1_on(20, 26, 0);
time    relay_1_off(20, 26, 10);	
time    relay_2_on(20, 26, 30);
time    relay_2_off(20, 26, 40);


    DateTime myTime = RTC.now();
    cur_time.set_time(myTime.hour(), myTime.minute(), myTime.second());

    //-------------------------------------------------------
    relay_1 = (cur_time>=relay_1_on) && (cur_time<relay_1_off);
    relay_2 = (cur_time>=relay_2_on) && (cur_time<relay_2_off);
    //-------------------------------------------------------

Люди ! Не забывайте про возможности С++ ! Они вам облегчают жизнь !

Покодил немного, отлаживал в протеусе. Т.к. тут никак не прикрепить файлы, залил готовый код и файл протеуса со скетчем на другом форуме - Ссылка 
Там, также, дал ссылку на текущий топик, для связки смысла топиков.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Alexino пишет:

А я бы для удобства сделал простенький класс, типа такого :

есть же библиотека http://playground.arduino.cc/code/time

hour();            // the hour now  (0-23)
minute();          // the minute now (0-59)          
second();          // the second now (0-59) 
day();             // the day now (1-31)
weekday();         // day of the week, Sunday is day 0 
month();           // the month now (1-12)
year();            // the full four digit year: (2009, 2010 etc) 

 

Alexino
Offline
Зарегистрирован: 29.12.2015

И что ?
Я класс создал ради простоты установки, хранения, сравнения, ...  времени.
Причём тут Вами упомянутая библиотека ? Как она может заменить мной созданный класс ?

Или искать и использовать библиотеки - ваше всё, а создавать собственное - не комильфо ?

Alexino
Offline
Зарегистрирован: 29.12.2015

Ну, собственные классы и создаются ради частных случав. Как раз, данный случай и показывает яркий тому пример.  Основная цель класса была создать объект, умеющий сравнивать временные значения. Ибо это - основная задача у ТС'а.
А Вы предлагаете по частным случаем кидаться в поиски каких-нибудь библиотек.
Это раз.
Во вторых. Вы так и не ответили на мой вопрос о замене моего класса вашей библиотекой. Обычный набор непонятных никому функций, возможно что-то там и обеспечивающих. Но какое отношение это имеет к собственным классам, как к объектам ? И где Вы видите, что я пложу сущности ? Или по-вашему, создавать собственное - плодить сущности ? Где логика ?
Или может Вам просто скучно, хочется поговорить, а не с кем ?

Ни один набор функций в стиле Си (называемый Вами библиотекой) не заменит класс, способный создать объект с перегружаемыми операциями и дающий возможность обращаться к нему как к любому типу.
Не путайте мух с котлетами и не вводите людей в заблуждение.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Находил как-то библиотеку RTClib - где все это уже было. Естественно перетащил в свою версию, но откуда взял - не смог найти. В итоге залил свою версию на GitHub https://github.com/NeiroNx/RTCLib

voVWan
Offline
Зарегистрирован: 04.01.2016

Alexino пишет:

Люди ! Не забывайте про возможности С++ ! Они вам облегчают жизнь !

Да я ж не против научиться этому, как раз я и хочу освоить ардуино для облегчения жизни!) Но впервые в жизни взял я ардуино всего 4 дня назад!))) Да и с прогроммированием столкнулся впервые тогда же :) Склад ума технический, очень люблю подобные вещи но раньше не сталкивался. Сейчас просто искал чужой скетч под свою задачу, с внятными комментариями и пытался разобраться как он работает. 

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

Но вот для еще одно из реле мне нужно будет добавть условие что бы оно включалось в нужное время, но только если температура с DS18B20 будет в заданных пределах. Для вас это просто всё, а для меня пока не очень)))

Может посоветуете какие нибудь материалы почитать для обучения по программированияю на ардуино? Ну что бы все описывалось с самых базовых вещей. Спасибо огромное за помощ и отзывчивость! Очень выручили :)

 

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

voVWan пишет:

Может посоветуете какие нибудь материалы почитать для обучения по программированияю на ардуино? Ну что бы все описывалось с самых базовых вещей. Спасибо огромное за помощ и отзывчивость! Очень выручили :)

Для начала гораздо более правильная формулировка:

voVWan пишет:

Может посоветуете какие нибудь материалы почитать для обучения по программированияю на ардуино? Ну что бы все описывалось с самых базовых вещей. Спасибо огромное за помощ и отзывчивость! Очень выручили :)

Это намного грамотнее. Потому что учиться программированию "на ардуино" - это всё равно. что учиться водить "жигули". Либо Вы умеете водить машину, либо - нет. Невозможно уметь водить "жигули" и не уметь "фольксваген". Так же и в программированни: либо Вы умеете программировать, либо нет, а уж ардуино там или Тианхе-2 - вопрос десятый.

А так, смотрите Керниган и Ритчи. Программирование на языке С и Страуструп. Язык С++

voVWan
Offline
Зарегистрирован: 04.01.2016

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

Это намного грамотнее. Потому что учиться программированию "на ардуино" - это всё равно. что учиться водить "жигули". Либо Вы умеете водить машину, либо - нет. Невозможно уметь водить "жигули" и не уметь "фольксваген". Так же и в программированни: либо Вы умеете программировать, либо нет, а уж ардуино там или Тианхе-2 - вопрос десятый.

А так, смотрите Керниган и Ритчи. Программирование на языке С и Страуструп. Язык С++

 

спасибо) я просто думал что на ардуино какой то упрощенный вариант С++, и возможно есть какая то "упрощенная" литература для чайников :)

Alexino
Offline
Зарегистрирован: 29.12.2015

Тут в соседней ветке давали ссылку на одну из книг :

Sloper пишет:

Самая хорошая и вдохновляющая книга - Петин. Проекты с применением контроллера Ардуино. 

http://mega-track.org/viewtopic.php?t=97696

 

Там все есть: и язык и проекты и черта в ступе. 

Попробуйте её полистать.

ЗЫ: А с DS1820, дак эта тема, по-моему, изъезжена до дыр. И библиотеки все для дуины есть.

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

voVWan пишет:

я просто думал что на ардуино какой то упрощенный вариант С++

Ни на грамм. Самый что ни есть С++.

Единственное, что они в IDE'шном препроцессоре добавили две фичи для "типа-упрощения" - руки бы поотрывал за такие добавления. А компилятор самый обычный - никаких упрощений.

voVWan
Offline
Зарегистрирован: 04.01.2016

Alexino пишет:

Тут в соседней ветке давали ссылку на одну из книг :

 спасибо!) обязательно почитаю :) 

voVWan
Offline
Зарегистрирован: 04.01.2016

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

Ни на грамм. Самый что ни есть С++.

 

благодарю, будем значит изучать С++

я вот лет 5 уже слушаю Радио-Т, и часто возникало желание начать изучать какой нибудь язык программирования, но так и не мог решиться с какого именно начать :) а тут все самой подвернулось

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Alexino пишет:

Ну, собственные классы и создаются ради частных случав. Как раз, данный случай и показывает яркий тому пример.  Основная цель класса была создать объект, умеющий сравнивать временные значения. Ибо это - основная задача у ТС'а.
А Вы предлагаете по частным случаем кидаться в поиски каких-нибудь библиотек.
Это раз.
Во вторых. Вы так и не ответили на мой вопрос о замене моего класса вашей библиотекой. Обычный набор непонятных никому функций, возможно что-то там и обеспечивающих. Но какое отношение это имеет к собственным классам, как к объектам ? И где Вы видите, что я пложу сущности ? Или по-вашему, создавать собственное - плодить сущности ? Где логика ?
Или может Вам просто скучно, хочется поговорить, а не с кем ?

Ни один набор функций в стиле Си (называемый Вами библиотекой) не заменит класс, способный создать объект с перегружаемыми операциями и дающий возможность обращаться к нему как к любому типу.
Не путайте мух с котлетами и не вводите людей в заблуждение.

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

Alexino
Offline
Зарегистрирован: 29.12.2015

Словоблудие, как раз, идёт именно с Вашей стороны. Это Вы, взамен мною созданного класса, процитировав, дали ссылку на какую-то библиотеку, так и не сказав, каким боком она к нему относится. Причём пытаясь мне доказать, что библиотеки - это верх совершенства и нужно пользоваться только ими, не создавая ничего своего (по Вашему это - некомильфо).

Про полезность изучения С++ я вообще ни слова не сказал, это ваши какие то домыслы.
И речь шла не о библиотекх вовсе, а немного о другом. Но Вы, видимо, читаете топик по-диагонали. И кроме ненужного никому совета по библиотеке и флуда, с Вашей стороны ничего полезного не наблюдается.
Если посоветовали что-то, докажите, что этот совет к месту в данном случае. Я, например, не вижу никаких оснований использовать Вами предложенную библиотеку в данном проекте. Если я не прав - обоснуйте.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Alexino пишет:

Словоблудие, как раз, идёт именно с Вашей стороны. Это Вы, взамен мною созданного класса, процитировав, дали ссылку на какую-то библиотеку, так и не сказав, каким боком она к нему относится. Причём пытаясь мне доказать, что библиотеки - это верх совершенства и нужно пользоваться только ими, не создавая ничего своего (по Вашему это - некомильфо).

Про полезность изучения С++ я вообще ни слова не сказал, это ваши какие то домыслы.
И речь шла не о библиотекх вовсе, а немного о другом. Но Вы, видимо, читаете топик по-диагонали. И кроме ненужного никому совета по библиотеке и флуда, с Вашей стороны ничего полезного не наблюдается.
Если посоветовали что-то, докажите, что этот совет к месту в данном случае. Я, например, не вижу никаких оснований использовать Вами предложенную библиотеку в данном проекте. Если я не прав - обоснуйте.

давайте я сам за себя расскажу, что я сделал:

я зашёл в тему увидел скетч ТС, где у него код код "как то не верно переводит время в формат UNIX, не правильно высчитывает количество секунд с начала суток", затем увидел, что вы написали класс... как бы ладно, но зачем это всё, если существует библиотека Time?

не "какая-то библиотека", а библиотека с описанием - скачивайте и читайте.

ТСу на просьбу:Помогите пожалуста новичку разобраться :) Искал в сети как сделать таймер в формате обычного времени а не UNIX

- библиотека Time.

Alexino
Offline
Зарегистрирован: 29.12.2015

Клапауций 322 пишет:

затем увидел, что вы написали класс... как бы ладно, но зачем это всё, если существует библиотека Time?

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



    relay_1 = (cur_time>=relay_1_on) && (cur_time<relay_1_off);
    relay_2 = (cur_time>=relay_2_on) && (cur_time<relay_2_off);

Вот он, смысл создания класса. И библиотека Time тут совсем не при чём.

Клапауций 322 пишет:

ТСу на просьбу:Помогите пожалуста новичку разобраться :) Искал в сети как сделать таймер в формате обычного времени а не UNIX

- библиотека Time.

Дак покажите пример её использования. Или, хотя бы, расскажите, как она сможет помочь ему в этом проекте.
Повторюсь :
Alexino пишет:
Я, например, не вижу никаких оснований использовать Вами предложенную библиотеку в данном проекте. Если я не прав - обоснуйте.

voVWan
Offline
Зарегистрирован: 04.01.2016

Alexino скажите, а это нормально: если при включенном реле открываешь ком-порт для мониторинга состояния, то реле на секунду выключается? спасибо

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Alexino скажите, а это нормально:

При открытии порта Ардуинка всегда перегружается.

voVWan
Offline
Зарегистрирован: 04.01.2016

Okmor пишет:

При открытии порта Ардуинка всегда перегружается.

Ок. Подскажите, а можно ли брать 5V для датчика температуры с ICSP разьема предназначенного для USB? Хочу вот такую схему подключения сделать. Или 5V лучше параллельно запитать от выход 5V?

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Alexino пишет:

Дак покажите пример её использования.

библиотека укомплектована примерами.

Alexino пишет:

Или, хотя бы, расскажите, как она сможет помочь ему в этом проекте.

библиотека переводит время в обычный формат из формата Unix и обратно

Alexino
Offline
Зарегистрирован: 29.12.2015

voVWan пишет:

Alexino скажите, а это нормально: если при включенном реле открываешь ком-порт для мониторинга состояния, то реле на секунду выключается? спасибо

А что значит "открываешь порт" ? Инициализация порта производится в setupe'е, реле при этом не может быть включено.

Alexino
Offline
Зарегистрирован: 29.12.2015

Клапауций 322 пишет:

библиотека переводит время в обычный формат из формата Unix и обратно

И это всё, чем она может тут помочь ?
Это же обычные деления с остатком, зачем тут нужна целая библиотека ? 

Alexino
Offline
Зарегистрирован: 29.12.2015

voVWan пишет:

Ок. Подскажите, а можно ли брать 5V для датчика температуры с ICSP разьема предназначенного для USB? Хочу вот такую схему подключения сделать. Или 5V лучше параллельно запитать от выход 5V?

Лучше брать с точки, находящейся ближе к фильтрующим конденсаторам.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Alexino пишет:

Это же обычные деления с остатком, зачем тут нужна целая библиотека ? 

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

*иначе, нужно рекомендовать ТСу идти в среднюю школу, а не писать для него и за него классы.

voVWan
Offline
Зарегистрирован: 04.01.2016

Alexino пишет:

А что значит "открываешь порт" ? 

 

ну нажмаю кнопочку "монитор порта" и в этот момент реле на секунду отключается :)

Alexino
Offline
Зарегистрирован: 29.12.2015

Ааа, на ПК чтоли мониторите порт ? ))
Может дуина ресетится ? По симтомам похоже - ресет, реле рубится, секунда проходит, время совпало, реле включилось.
Возможно, при коннекте, дуина включает бутлоадер, а потом запускает программу. ХЗ в общем ... )
Тут уже я не знаю всех подробностей коннектов дуины с ПК, ибо сам не имею этого всего, за ненадобностью )) 

voVWan
Offline
Зарегистрирован: 04.01.2016

ну и ладно, это не важно в прочем) еще раз спасибо)

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

КОГДА ТЕБЕ РЕЛА ВКЛЮЧАТЬ НАДО ...В КАКОЕ ВРЕМЯ И НА СКОКА?

 

lex2k
Offline
Зарегистрирован: 17.12.2015
// начало управления по времени_______________________________________________________
   Curent_Time=(hour*60+minute)-1;//текущее время в минутах //1440=24часа*60мин
   On_Time=(hour_on*60+min_on)-1; // время вкл в минутах
   Off_Time=( hour_of*60+min_of)-1; // время выкл в минутах
   
   if (On_Time < Off_Time) //Проверка при On_Time < Off_Time
{
    if (Curent_Time >= On_Time && Curent_Time <= Off_Time)
      {
        digitalWrite(12, LOW);        
      }
    else
      {
        digitalWrite(12, HIGH);       
      }
}
  else // Проверка при On_Time > Off_Time
 
{
        if (Curent_Time >= On_Time ||Curent_Time <= Off_Time)//1440=24часа*60мин
      {
        digitalWrite(12, LOW);        
      }
    else
      {
        digitalWrite(12, HIGH);        
      }
}
 
 
 // конец управления по времени___________________________________________________________ 
  Я ТАК СДЕЛАЛ ...РАБОТАЕТ.. НО БЕЗ УЧЕТА  ДНЕЙ НЕДЕЛИ
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

voVWan пишет:

ну нажмаю кнопочку "монитор порта" и в этот момент реле на секунду отключается :)

При этом происходит перезаггпузка Ардуины. Т.е. она просто перегружается и начинает работать с нуля. Так что это нормально, что реле ненадолго вырубается.

voVWan
Offline
Зарегистрирован: 04.01.2016

Спасибо! Тоже попробую и Ваш вариант :) дни недели как раз не нужны. Сейчас делаю что бы второе реле включалось только в определенные момент времени, при этом еще и брало температуру с датчика и поддерживало ее в заданных значениях всего лишь 5 минут в день. Далее оно должно быть всегда выключено :)

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

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

voVWan пишет:

ну нажмаю кнопочку "монитор порта" и в этот момент реле на секунду отключается :)

При этом происходит перезаггпузка Ардуины. Т.е. она просто перегружается и начинает работать с нуля. Так что это нормально, что реле ненадолго вырубается.

ПРИ ВХОДЕ В ТЕРМИНАЛ СБРОС ПРОИСХОДИТ

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

voVWan пишет:

Спасибо! Тоже попробую и Ваш вариант :) дни недели как раз не нужны. Сейчас делаю что бы второе реле включалось только в определенные момент времени, при этом еще и брало температуру с датчика и поддерживало ее в заданных значениях всего лишь 5 минут в день. Далее оно должно быть всегда выключено :)

У МНЯ ГОТОВОЯ ПРОГА ЕСТЬ ...НЕДАВНО ЗАКОНЧИЛ..........НО....

voVWan
Offline
Зарегистрирован: 04.01.2016

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

При этом происходит перезаггпузка Ардуины. Т.е. она просто перегружается и начинает работать с нуля. Так что это нормально, что реле ненадолго вырубается.

А, ну тогда бужу иметь ввиду :) надо все таки начинать книжки читать...

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

НО......

.// программа имеет два канала упраления 1 - по темперетуре 2- по времени. время и температура ВКЛ и ВЫКЛ устанавливается через блютуф c Android девайса 

// контролер Duemilanove на 168, время берется с DS3231, температура с DHT11.  блютуф HC-05. время и температура ВКЛ и ВЫКЛ 5 раз в сутки ЕСЛИ ИЗМЕНИЛИСЬ сохраняются в eeprom  на DS3231
// есть тест вкл\выкл реле.
voVWan
Offline
Зарегистрирован: 04.01.2016

lex2k пишет:

У МНЯ ГОТОВОЯ ПРОГА ЕСТЬ ...НЕДАВНО ЗАКОНЧИЛ..........НО....

НО я не буду у вас ни чего просить. Интересно разобраться самому. Просто иногда по незнанию возникают примитивные вопросы. Но всё равно форум хороший, быстро помогли разобраться :)

"мыши плакали и кололись - но продолжали жрать кактус"

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

Я И НЕ ПРОШУ ПРОСИТЬ ...Я  ГОВОРЮ  НАДО?

ПРОСТО ФУКЦИОНАЛ ОТЛИЧАЕТСЯ И НАСТРАЕВАЕТСЯ БО БЛЮТУФУ...ТАКОЕ УСТРОИТ?