привет! помогите плиз! необходимо что бы реле с 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); } }
Код (C++): if (t > 28.0 && relay1 == false) { digitalWrite (RELAY1, ON); relay1 = false; timeRelay1 = millis(); ... if (t < 28.0) { relay1 == true;
но не так как задумано я не знаю как именно вы распорядились моим вектором (замена втупую конечно не сработает), поэтому посоветовать нечего.
сам в шоке) у мне Arduino 1.8.1 тоже всякую бяку делало и unsigned принимал отрицательное значение и вообще чудеса творились. вернул старую 1.6. - все стабильно и правильно.