Nano+реле

Тема в разделе "Arduino & Shields", создана пользователем lord435, 10 май 2016.

  1. lord435

    lord435 Нуб

    Доброго времени суток ув. форумчане! Необходима ваша помощь в исправлении моего очумелого кода:eek:
    Хочу, но никак не могу сделать что бы при достижении maxT (27гр.) включалась вытяжка и при minT(25гр.) она выключалась+помимо этого вытяжка включалась каждый час на несколько минут, ну а всё остальное время находилась в выкл. состоянии. Сейчас удалось добиться включения по времени+включение по достижении maxT, но дело в том, что она сразу же при снижении температуры ниже maxT и отключается, так и не достигнув значения minT. Также буду рад советам и рекомендациям по оптимизации кода.
    Опыт программирования практически отсутствует, но копи-пастить умею неплохо:confused:

    Код (C++):
    #include <Wire.h>
    #include <SPI.h>
    #include <LiquidCrystal_I2C.h>
    #include <DHT.h>
    #include <RTC.h>
    #include <dht11.h>
    #include <config.h>
    #include <ds3231.h>


    RTC  time;

    #define DHT11_PIN1 2 // Внутр. датчик влажности/температуры 2

    DHT dht(2, DHT11);
    LiquidCrystal_I2C lcd(0x27,16,2);   // Задаем адрес и размерность дисплея
    ///////////////////////////////////////////////////////////
    int h; //Установленное время часы
    int m;//Установленное время минуты
    int s;//Установленное время секунды
    int tmp_h;
    int tmp_m;
    int tmp_s;
    int maxT=27; //Максимальная температура до ВКЛ. вытяжки
    int minT=25; //Температура ВЫКЛ. вытяжки
    int ventOnMin=0; //Время ВКЛ. вытяжки
    int ventOffMin=4; //Время ВЫКЛ. вытяжки
    int TimeOnHour=17;  //Время ВКЛ. LED
    int TimeOffHour=9; //Время ВЫКЛ. LED
    int TimeOnMin=0;
    int TimeOffMin=0;
    /////////////////////////Пины реле//////////////////////////////////
    int FS = 6; //реле 1
    int vent = 5; //реле 2
    int led = 4; //реле 3
    ///////////////////////////////////////////////////////////
    byte degree[8] =         // Битовая маска символа градуса
    {
      B00111,
      B00101,
      B00111,
      B00000,
      B00000,
      B00000,
      B00000,
    };
    ////////////////////////////////////////////////////////////
    void setup() {
      // Start the I2C interface
    Wire.begin();
    Serial.begin(9600); // Start the serial interface
      while (!Serial) ; // wait for serial
      time.begin(RTC_DS3231);
      lcd.init();                       // Инициализация lcd            
      lcd.backlight();                  // Включаем подсветку
      lcd.createChar(1, degree);        // Создаем символ под номером 1
    //  pinMode(FS, OUTPUT);
    //  digitalWrite(FS, HIGH);
      pinMode(led, OUTPUT);
      digitalWrite(led, HIGH);
      pinMode(vent, OUTPUT);
      digitalWrite(vent, HIGH);
     
    //time.settime(35,18,42,3,5,16,1); // 0  сек, 8 мин, 21 час, 27, октября, 2015 года, вторник
    }

    void loop() {
      delay(1000);
      // Reading temperature or humidity takes about 250 milliseconds!
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      // Read temperature as Celsius
       int t = dht.readTemperature();
       int h = dht.readHumidity();
      tmp_h=time.Hours;
      tmp_m=time.minutes;
      tmp_s=time.seconds;
    ///////////////////////////
      lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 2 строки
      lcd.print(time.gettime("H:i:s  D"));
      lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
      lcd.print("Temp=  \1");    // Выводим текст, \1 - значок градуса
      lcd.setCursor(5, 1);            
      lcd.print(t);  
      lcd.setCursor(9, 1);
      lcd.print("Hum=  %");
      lcd.setCursor(13, 1);
      lcd.print(h);
     
    //  lcd.clear();                      // Очистка экрана
    ////////////////////////////
     
        Serial.println(t);
        Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
      if ((tmp_h >= TimeOnHour && tmp_h <= 23)||(tmp_h >= 0 && tmp_h < TimeOffHour))
    //        {digitalWrite(FS, LOW);}
             {digitalWrite(led, LOW);}
      else
    //        {digitalWrite(FS, HIGH);}
             {digitalWrite(led, HIGH);}; //В другом случае - всегда выключено
     
      if (t >= maxT)  {digitalWrite(vent, LOW);} //Если Т>МаксТ включаем
      else if (t <= minT)  {digitalWrite(vent, HIGH);} //Если Т<МинТ выключаем
      else if (tmp_m >= ventOnMin && tmp_m < ventOffMin)
          {digitalWrite(vent, LOW);} //Включаем по расписанию
      else {digitalWrite(vent, HIGH);};
    delay(1);
    }
     
     
  2. Vad33

    Vad33 Капитан-оригинал

    Код (C++):
      if (t >= maxT)  {digitalWrite(vent, LOW);} //Если Т>МаксТ включаем
      else if (t <= minT)  {digitalWrite(vent, HIGH);} //Если Т<МинТ выключаем
      else if (tmp_m >= ventOnMin && tmp_m < ventOffMin)
          {digitalWrite(vent, LOW);} //Включаем по расписанию
      else {digitalWrite(vent, HIGH);}; // <<<< ****** Собака зарыта здесь ******
    delay(1);
    }
     
    Последнее редактирование: 10 май 2016
  3. lord435

    lord435 Нуб

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

    Vad33 Капитан-оригинал

    Видима как то так:
    Код (C++):
    if (t >= maxT or (tmp_m >= ventOnMin and tmp_m < ventOffMin))  
       {digitalWrite(vent, LOW);}
      else if (t <= minT and tmp_m >= ventOffMin))  
        {digitalWrite(vent, HIGH);}
     
    Последнее редактирование: 11 май 2016
  5. lord435

    lord435 Нуб

    Ты мой кумир:rolleyes:. Спасибо! Пару дней с этим возился...
    Всё безупречно теперь работает!:cool: