прошу помощи с кодом, не корректно работает цифровой выход

xentry

✩✩✩✩✩✩✩
11 Май 2026
7
0
прошу помощи, не понимаю в чем проблема, на 4 пине появляется 5в когда нужно, но не пропадает питание когда нужно без перезагрузки ардуино...
прошу ткните пожалуйста где я накосячил, если еще в коде есть косяки прошу тоже показать если вам будет не сложно
C++:
int val = 10;   
int res = 10;
int res2 =10;

void setup() {
  // put your setup code here, to run once:
 //Serial.begin(115200);
pinMode(9, OUTPUT);//вентиляция
digitalWrite(9, LOW);
pinMode(10, OUTPUT);//обогрев
digitalWrite(10, LOW);
pinMode(4,OUTPUT);
digitalWrite(4,LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
val = analogRead(15);

//блок чтения
//обогрев
if (val >= 990) res2=230;
else if (val >= 930) res2=170;
else if (val >= 855) res2=80;
else if (val <= 850) res2=10; //выключение при вентиляции

//вентиляция
if (val <=200 || val >=840 ) res = 10;
else if (val >= 700) res=60;
else if (val >= 450) res=130;
else if (val >= 220) res=200;
//выключение при обогреве и сбое питания
if (val >=855) {digitalWrite(4, HIGH);}
else if (val <=854) {digitalWrite(4, LOW);}
//блок вывода
//вентиляция
if (res == 200){analogWrite(9, 140);}
else if (res == 130){analogWrite(9, 120);}
else if (res == 60){analogWrite(9, 60);}
else if (res == 10){digitalWrite(9, LOW);}
//обогрев
if (res2 == 230){analogWrite(10, 170);}
else if (res2 == 170){analogWrite(10, 80);}
else if (res2 == 80){analogWrite(10, 20);}
else if (res2 == 10){digitalWrite(10, LOW);}

//Serial.println("sek"); Serial.println(res); Serial.println(res2); Serial.println(val); delay(1000);
}
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
702
107
В самом начале кода наверно надо пин 4 задекларировать, типа int, потом уже назначать как выход.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,377
1,341
Москва
if (val >=855) {digitalWrite(4, HIGH);} else if (val <=854) {digitalWrite(4, LOW);}
1. второе условие тут просто лишнее, если val не большие или равно 855 оно точно меньше или равно 854.
Но это не влияет на работу.
2.
Как тестировалось и проверялось на выключение ?
Если вывести val в 47 строке , то точно будет меньше 855 что бы выключиться ?
Не может быть такого , что только выключилось, а на сл. цикле уже включилось ?

Обычно для включения и выключения не берут одно значение порога, иначе просто задрочат реле переключениями , а делают так, пример для температуры: если холодно , меньше 10 градусов, то включить обогреватель. если тепло и больше 20, то выключить его. В промежутке же между 10 и 20 состояние обогревателя не меняется.
 

bort707

★★★★★★★
21 Сен 2020
3,465
1,000
@xentry, а что такое val, если не секрет? Не слишком ли много функций у одного единственного аналогового входа?