Помогите разобраться с кодом.

Тема в разделе "Arduino & Shields", создана пользователем Ибрагим самуилыч, 12 авг 2014.

  1. // подключаем две библиотеки для работы с LCD и математических вычислений
    // DS1302: RST -> Arduino Digital 0
    // DAT -> Arduino Digital 7
    // SKL -> Arduino Digital 8
    //VCC ->GND
    //VDD ->5+
    //VO -> potenciometr
    //15 ->5+
    //16 ->GND
    // LCD: DB7 -> Arduino Digital 1
    // DB6 -> Arduino Digital 3
    // DB5 -> Arduino Digital 4
    // DB4 -> Arduino Digital 5
    // E -> Arduino Digital 10
    // RW -> Arduino Digital 11
    // RS -> Arduino Digital 12

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <OneWire.h>// Инициализация библиотеки шины OneWire.
    #include <DallasTemperature.h>// Инициализация библиотеки термодатчиков.
    #include <DS1302.h>
    #define ONE_WIRE_BUS 6// Подключение цифрового вывода датчика к 10-му пину Ардуино.
    OneWire oneWire(ONE_WIRE_BUS);// Запуск интерфейса OneWire для подключения OneWire устройств.
    DallasTemperature sensors(&oneWire);// Указание, что устройством oneWire является термодатчик от Dallas Temperature.
    DS1302 _RTC1( 3, 4, 5);
    LiquidCrystal_I2C lcd(0x27,20,4); // Задаем размерность дисплея. входы A4,A5
    unsigned long currentTime;
    unsigned long loopTime;
    Time _tRTC1;
    bool _RTCAlO1 = 0;
    bool _RTCAlO2 = 0;
    bool _RTCAlO3 = 0;
    bool _RTCAlO4 = 0;



    void setup(void) {
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);
    currentTime = millis(); // считываем время, прошедшее с момента запуска программы
    loopTime = currentTime;
    _RTC1.halt(false);
    _RTC1.writeProtect(false);

    lcd.init(); // Инициализация lcd
    lcd.backlight(); // Включаем подсветку


    sensors.begin(); // Запуск сенсора.
    lcd.clear();
    lcd.setCursor(0,2);
    lcd.print(" AQVA");
    lcd.setCursor(9,2);
    lcd.print("T:");
    lcd.setCursor(0,3);
    lcd.print("RELE1:");
    lcd.setCursor(11,3);
    lcd.print("RELE2:");
    // Display date in the lower right corner

    }


    void loop(void) {
    _tRTC1 = _RTC1.getTime();



    if (1)
    { _RTCAlO1 = (((_tRTC1.hour) == 22) && ((_tRTC1.min) == 30) && ((_tRTC1.sec) == 10));}//выставляем максимум после выключения

    else
    {_RTCAlO1 = 0;}
    if (1)
    { _RTCAlO2 = (((_tRTC1.hour) == 20) && ((_tRTC1.min) == 20) && ((_tRTC1.sec) == 13));}//уменьшаем яркость до минимума

    else
    {_RTCAlO2 = 0;}

    if ( _tRTC1.hour < 8 )// включение лампы без регулировки
    {
    _RTCAlO3 = 1 ;
    lcd.setCursor(6,3);
    lcd.print("OFF ");
    }

    if (_tRTC1.hour > 19)//выключение лампы
    {_RTCAlO3 = 1 ;
    lcd.setCursor(6,3);
    lcd.print("OFF");
    }

    else
    {_RTCAlO3 = 0;
    lcd.setCursor(6,3);
    lcd.print("ON ");
    }

    if ( ((_tRTC1.hour) < 9 ))//
    { _RTCAlO4 = 1 ;
    lcd.setCursor(17,3);
    lcd.print("OFF ");
    }

    if (((_tRTC1.hour) > 21))
    {_RTCAlO4 = 1 ;
    lcd.setCursor(17,3);
    lcd.print("OFF");
    }

    else
    {_RTCAlO4 = 0;
    lcd.setCursor(17,3);
    lcd.print("ON ");
    }


    digitalWrite(7, _RTCAlO1);
    digitalWrite(8, _RTCAlO2);
    digitalWrite(9, _RTCAlO3);
    digitalWrite(10, _RTCAlO4);

    currentTime = millis(); // считываем время, прошедшее с момента запуска программы
    if(currentTime >= (loopTime + 1000)){


    lcd.setCursor(0, 0);
    lcd.print(_RTC1.getDateStr());
    lcd.setCursor(11,1);
    lcd.print(_RTC1.getTimeStr());
    lcd.setCursor(0, 1);
    lcd.print(_RTC1.getDOWStr(FORMAT_SHORT));
    sensors.requestTemperatures(); // Команда опроса температуры.
    lcd.setCursor(12,2);
    lcd.print(sensors.getTempCByIndex(0));// Печать в порт температуры, "0" в данном случае указывает на первое устройство в шине.
    lcd.print(" C");
    loopTime = currentTime;
    }


    }


    Проблема с _RTCAlO3 и _RTCAlO4 при достижении времени 00.00.00. реле включаются ( логика реле инвертированная). В программирование новичок).
     

    Вложения:

  2. geher

    geher Гуру

    Так, собственно, и запрограммировано.
    Сначала текущий час проверяется на меньше нижней границы. Переменная выставляется в 1, нм экране пишется OFF.
    Потом проверяется на больше верхней границы. Ноль этому условию, естественно, не соответствует, а потому выполняется то, что в else у этого условия, т.е. переменная в 0, на экран ON.

    Чтобы выполнялось задуманное, надо после первого условия, после того, что у него в фигурных скобках, добавить else, дабы следующий if (со своими блоками после него и после его собственного else) выполнялся только тогда, когда условие ложно.
    Другой вариант - объединить условия (благо, код для них идентичен), оставив else второго условия.
    Примерно так:
    Код (Text):
    if ( _tRTC1.hour < 8 )||(_tRTC1.hour > 21)
    {_RTCAlO4 = 1 ;
    lcd.setCursor(17,3);
    lcd.print("OFF");
    }
    else
    {_RTCAlO4 = 0;
    lcd.setCursor(17,3);
    lcd.print("ON ");
    }
    Сделать надо это для обоих блоков, которые задают значения _RTCAlO3 и _RTCAlO4 в зависимости от времени.
     
    Ибрагим самуилыч нравится это.
  3. Благодарю за ответ ,все заработало как надо.Еще один вопрос ,если не сложно могли бы подсказать как в этом коде запихнуть регулировку температуры ( если достигло опред. значения вкл. вентилятор например)для других датчиков разобрался а вот с этим сложно).
     
  4. geher

    geher Гуру

    Если я правильно понимаю, то sensors.getTempCByIndex возвращает абсолютное значение температуры в градусах Цельсия.
    В этом случае с вентилятором по температуре примерно так же, как с реле по времени.
    Проверяем условие, и на пин, управляющий вентилятором через транзистор или реле подаем нужный уровень.
    Примерно так:
    Код (Text):
    int ventstate=0; // состояние, должно быть где-то до setup()

    ...
    if ((!ventstate)&&(sensors.getTempCByIndex(0)>50))
    {
      // VENTPIN надо определить как номер пина для управления вентилятором
      digitalWrite(VENTPIN, ventstate=HIGH);//в данном случае применяется трюк, характерный для языка С, а именно тот факт, что присваивание возвращает присвоенное переменной значение,
    }
    else
    if ((ventstate)&&(sensors.getTempCByIndex(0)<45))
    {
      digitalWrite(VENTPIN, ventstate=LOW);
    }
     
    Разная температура включения и выключения нужны, чтобы не было ненужных постоянных запусков и остановок вентилятора, когда температура слегка колеблется относительно заданной. Точные температуры включения и выключения зависят от требований к температуре (чем выше требуемая точность, тем ближе должны быть эти температуры).
     
    Последнее редактирование: 18 авг 2014