Таймер времени ds1307

Тема в разделе "Arduino & Shields", создана пользователем ArtSmm, 15 авг 2016.

  1. ArtSmm

    ArtSmm Нерд

    Всем привет
    Изучаю датчик времени, хочу сделать полив растений по времени. Чтобы каждый день полив происходил в 13ч.
    Включение помпы происходит через реле
    Вопрос в том, что сейчас реле постоянно включено, хотя вроде время выставлено, реле заданно
    До этого я сами часы настроил, время определяется верно, в часах оно сохранено, поэтому тут не стал снова задавать определение текущего времени

    Сам скетч:
    #include <Wire.h>
    #include "RTClib.h"

    //Реле

    #define Relay 3

    RTC_DS1307 rtc;

    void setup () {

    //Реле

    pinMode(Relay, OUTPUT);

    //Часы

    Wire.begin();
    rtc.begin();
    //Serial.begin(9600);
    //rtc.adjust(DateTime(2014, 8, 2, 6, 48, 0));

    }

    void loop () {

    //Цикл полива по времени
    DateTime now = rtc.now();

    if (now.hour() >= 13 && now.hour() < 14) {
    digitalWrite(Relay, 1);
    delay(5000);
    }
    else digitalWrite(Relay, 0);

    }
     
  2. DIYMan

    DIYMan Guest

    У вас реле может включаться по низкому уровню ;)
     
  3. ArtSmm

    ArtSmm Нерд

    не совсем вас понял, что это означает?)
     
  4. DIYMan

    DIYMan Guest

    Это означает, что для включения реле надо писать digitalWrite(pin, LOW), а не digitalWrite(pin, HIGH), если реле включается по низкому уровню.

    Попробовать легко - достаточно поменять местами нолик и единичку в вашем скетче, когда пишете в пин реле.
     
  5. ArtSmm

    ArtSmm Нерд

    Вот оно что семеныч:) Спасибо, попробую)
     
  6. ArtSmm

    ArtSmm Нерд

    Реле сработало, но есть такой вопрос - как мне задать время, например 21.20.20 (час, минута, секунда)

    Такая команда не помогает: (Мне кажется, я перемудрил с условием). Может есть возможность так написать 21:20:20 ?

    void loop () {

    //Цикл полива по времени
    DateTime now = rtc.now();

    //Выставляем нужное время полива

    if (now.hour() >= 21 && now.minute() >= 20 && now.second() >= 00 && now.hour() < 21 && now.minute() < 20 && now.second() < 10 ) {
    digitalWrite(Relay, LOW);
    }
    else digitalWrite(Relay, HIGH);

    }
     
  7. DIYMan

    DIYMan Guest

    Ну что вы прям совсем? А подумать? Переведите всё в секунды, делов-то. И условие сократится не по-детски:
    Код (C++):

    unsigned long curSeconds = (now.hour()*60 + now.minutes())*60;

    if(curSeconds > (21*60+20)*60 && curSeconds  < (21*60+20)*60+10)
    {
      // выполняем условие между 21:20:00 и 21:20:10
    }
     
    Компилятор сам посчитает на этапе компиляции все чиселки в условии, и работать всё это будет быстро. А хотите - можно и на калькуляторе перемножить ;)
     
  8. ArtSmm

    ArtSmm Нерд

    Вот я лопух:( Точно, спасибо большое))
     
  9. ArtSmm

    ArtSmm Нерд

    у меня почему -то вылезает ошибка при компиляции, как будто функция "now" не указана, хотя она является частью библиотеки rtclib
     
  10. ArtSmm

    ArtSmm Нерд

    Можете весь скетч посмотреть?
     

    Вложения:

  11. DIYMan

    DIYMan Guest

    Я не пользуюсь этой библиотекой, приведите текст ошибки компиляции, и выложите ссылку на библиотеку.
     
  12. ArtSmm

    ArtSmm Нерд

    разобрался, исправил ошибку
     
  13. fogary

    fogary Гик

    Еще, как вариант так (между 21:20:20 и 21:20:30):
    Код (C++):
    if (now.hour() == 21 && now.minute() == 20 && ( now.second() >= 20 && now.second() < 30) ) {
    или так (между 21:20:00 и 21:20:10):
    Код (C++):
    if (now.hour() == 21 && now.minute() == 20 && now.second() < 10 ) {
     
  14. ArtSmm

    ArtSmm Нерд

    Спасибо)
     
  15. ArtSmm

    ArtSmm Нерд

    Работает как надо, спасибо)