нужна помощь millis

Тема в разделе "Флудилка", создана пользователем freebie, 26 мар 2017.

  1. freebie

    freebie Нуб

    привет! помогите плиз! необходимо что бы реле с 1 включалась при превышении температуры 28, например на 20 сек и потом вырубалась! и если теппература превысит 29 то по такому же алгоритму включается реле3.
    и если тепрература ниже 27,5 то на эти же 20 сек включается реле 2 и если температура ниже 28,5 то включается на 20 сек реле4

    у меня в скетче сделан таймер, но он сволочь в loop и каждый раз мне включает реле....

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

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

    такое решение необходимо только для реле 1 2 3 4

    ниже скетч

    Код (C++):
    #include "DHT.h"

    #define RELAY1   4
    #define RELAY2   5
    #define RELAY3   6
    #define RELAY4   7
    #define RELAY5   8
    #define RELAY6   9
    #define RELAY7  10
    #define RELAY8  11
    //значения времени
    #define ONTIME 20000 //если реле включено более чем
    #define OFFTIME 100
    #define PAUSE 1000
    #define ON  0      // если реле управляются высоким уровнем то ON= 1 OFF=0
    #define OFF 1      // если реле управляется низким уровнем то поставить ON=0 OFF=1

    //датчик температуры
    #define DHTPIN 3     // what digital pin we're connected to
    #define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
    DHT dht(DHTPIN, DHTTYPE);
    unsigned long timeRelay1 = -99999;
    unsigned long timeRelay2 = -99999;
    unsigned long timeRelay3 = -99999;
    unsigned long timeRelay4 = -99999;
    boolean relay1 = false;
    boolean relay2 = false;
    boolean relay3 = false;
    boolean relay4 = false;
    boolean relay5 = false;
    boolean relay6 = false;
    boolean relay7 = false;
    boolean relay8 = false;

    void setup() {
      Serial.begin(9600);
      Serial.println("DHTxx test!");
      dht.begin();
     
      pinMode(RELAY1, OUTPUT);
      pinMode(RELAY2, OUTPUT);
      pinMode(RELAY3, OUTPUT);
      pinMode(RELAY4, OUTPUT);
      pinMode(RELAY5, OUTPUT);
      pinMode(RELAY6, OUTPUT);
      pinMode(RELAY7, OUTPUT);
      pinMode(RELAY8, OUTPUT);
      digitalWrite(RELAY1, OFF);
      digitalWrite(RELAY2, OFF);
      digitalWrite(RELAY3, OFF);
      digitalWrite(RELAY4, OFF);
      digitalWrite(RELAY5, OFF);
      digitalWrite(RELAY6, OFF);
      digitalWrite(RELAY7, OFF);
      digitalWrite(RELAY8, OFF);

    }
    void loop() {
      delay(2000);
      // Reading temperature or humidity takes about 250 milliseconds!
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      float h = dht.readHumidity();
      // Read temperature as Celsius (the default)
      float t = dht.readTemperature();
      // Read temperature as Fahrenheit (isFahrenheit = true)
      float f = dht.readTemperature(true);

      // Check if any reads failed and exit early (to try again).
      if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
      }
      float hif = dht.computeHeatIndex(f, h);
      float hic = dht.computeHeatIndex(t, h, false);
      Serial.print("TEMP:     ");
      Serial.print(t);
      Serial.println(" *C ");
      //Serial.print("HUM:     ");
      //Serial.print(h);
      //Serial.println(" %\t");
      //Serial.print(f);
      //Serial.print(" *F\t");
      //Serial.print("Heat index: ");
      //Serial.print(hic);
      //Serial.println(" *C ");
      //Serial.print(hif);
      //Serial.println(" *F");

             if (t>28){ //окно 1
      digitalWrite (RELAY1, ON);
      Serial.println("WINDOW_1: OPEN");
      digitalWrite (RELAY2, OFF);
      if ( digitalRead(RELAY1) == ON){
        if ( millis()-timeRelay1 >= ONTIME){
          digitalWrite(RELAY1, OFF);
          timeRelay1 = millis();
    }}} else
      if (t<27.5){
      digitalWrite (RELAY1, OFF);
      digitalWrite (RELAY2, ON);
      if ( digitalRead(RELAY2) == ON){
        if ( millis()-timeRelay2 >= ONTIME){
          digitalWrite(RELAY2, OFF);
          timeRelay2 = millis();
    }}
      }
             if (t>29){ //окно 2
      digitalWrite (RELAY3, ON);
      Serial.println("WINDOW_2: OPEN");
      digitalWrite (RELAY4, OFF);
      if ( digitalRead(RELAY3) == ON){
        if ( millis()-timeRelay3 >= ONTIME){
          digitalWrite(RELAY3, OFF);
          timeRelay3 = millis();
    }}
    } else
      if (t<28.5){
      digitalWrite (RELAY3, OFF);
      digitalWrite (RELAY4, ON);
      if ( digitalRead(RELAY4) == ON){
        if ( millis()-timeRelay4 >= ONTIME){
          digitalWrite(RELAY4, OFF);
          timeRelay4 = millis();
    }}
      }
             if (t>27){ //вентилятор1
      digitalWrite (RELAY7, LOW);
      Serial.println("VENT_1:   ON");
    } else
      if (t<26.5){
      digitalWrite (RELAY7, HIGH);
      }
             if (t>27.5){ //вентилятор2
      digitalWrite (RELAY8, LOW);
      Serial.println("VENT_2:   ON");
    } else
      if (t<27){
      digitalWrite (RELAY8, HIGH);
      }
             if (t<25){ //обогрев 1-2
      digitalWrite (RELAY5, LOW);
      digitalWrite (RELAY6, LOW);
      Serial.println("HEAT:     ON");
    } else
      if (t>25.5){
      digitalWrite (RELAY5, HIGH);
      digitalWrite (RELAY6, HIGH);
      }

    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    unsigned не может быть отрицательным.
     
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    if (t > 28.0 && relay1 == false)
      {
        digitalWrite (RELAY1, ON);
        relay1 = false;
        timeRelay1 = millis();
        ...

    if (t < 28.0)
      {
       relay1 == true;
     
     
  4. freebie

    freebie Нуб

    с моим кодом чет никак не работает
     
  5. freebie

    freebie Нуб

    но при этом все работает =)
     
  6. freebie

    freebie Нуб

    всеравно в цикле вырубается и снова врубается как и до этого было
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    но не так как задумано ;)

    я не знаю как именно вы распорядились моим вектором (замена втупую конечно не сработает), поэтому посоветовать нечего.
     
  8. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    сам в шоке) у мне Arduino 1.8.1 тоже всякую бяку делало и unsigned принимал отрицательное значение и вообще чудеса творились. вернул старую 1.6. - все стабильно и правильно.