прошу помощи с кодом обогрева и вентиляции

xentry

✩✩✩✩✩✩✩
11 Май 2026
5
0
кое как сделал скетч для имитации блока обогрева и вентиляции, у него в выключенном состоянии выходит 2.5в, при обогреве напряжение поднимается до 5в(3режима работы), а при вентиляции опускается до 0.5в(3режима работы), это все делал чтоб подключить обогрев и вентиляцию сидений лексуса, но блоки отказались запускаться, теперь решил сделать что-бы исходя из напряжения поступающего на вход аналогпин1 ардуино подавала шим сигнал на драйвер обогрева и на драйвер вентиляции, написал скетч, решил проверить на столе и ардуино не выдает шим на указанные пины, прошу помощи с советом что не так. sid11.ino - это скетч ардуино сиденья, который как раз и не получается сделать, а nnV2.ino - это скетч ардуино с кнопками обогрева и вентиляции из которого выходит напряжение 0.5-2.5в для охлаждения, 2.5в в состоянии покоя и 2.5-5в в режиме обогрева.
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
3,443
988
У вас было бы больше шансов получить полезные ответы, если бы вставили код прямо в сообщение вместо того чтобы прикладывать файлы.
Если будете это делать, обратите внимание на правила вставки кода на этом форуме.
 

xentry

✩✩✩✩✩✩✩
11 Май 2026
5
0
@bort707, вот код который не работает:
C++:
int val = 0;  
int analogPin = 15;

void setup() {
  // put your setup code here, to run once:
pinMode(9, OUTPUT);//вентиляция
pinMode(8, OUTPUT);//обогрев
}

void loop() {
  // put your main code here, to run repeatedly:
val = analogRead(15);
//вентиляция
if (val >= 120 && val <= 220){analogWrite(9, 200);}
if (val >=240 && val <= 355){analogWrite(9, 130);}
if (val >=380 && val <= 490){analogWrite(9, 60);}
if (val >=500){digitalWrite(9,LOW);}
//обогрев
if (val >=1024 && val <= 940){analogWrite(8, 250);}
if (val >=795 && val <= 930){analogWrite(8, 170);}
if (val >=655 && val <= 785){analogWrite(8, 80);}
if (val <=645){digitalWrite(8,LOW);}
}
а вот код ардуинки с кнопками, который выдает напряжение, если нужно (кстати в нем вроде криво работала функция таймера, если получилось бы ее тоже исправить было бы неплохо тоже)
C++:
#include <EncButton.h>

// подключаем кнопки на пины
Button btn1H(2);
Button btn2L(3);

// переменные для режимов работы обогрева и вентиляции
int value1H = 0;
int value2L = 0;

unsigned long timing1H = millis(); // переменная хранения точки отсчета 1H
unsigned long timing2L = millis(); // переменная хранения точки отсчета 2L
int tset2L ; //флаг таймера вентиляции
int tset1H ; //флаг таймера обогрева

void setup() {
  // пины индикации 1H
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(14, OUTPUT);
  pinMode(18, OUTPUT);
  // пины индикации 2L
  pinMode(15, OUTPUT);
  pinMode(16, OUTPUT);
  pinMode(17, OUTPUT);
  pinMode(19, OUTPUT);
   //пины индикации
  pinMode(4, OUTPUT); //1H обогрев
  pinMode(6, OUTPUT); //2L вентиляция
  // шим выход
  pinMode(5, OUTPUT);

}
void loop() {
  // опрос кнопок происходит здесь
  btn1H.tick();
  btn2L.tick();


  // клик по кнопке - меняем значение переменной, если нажали кнопку 3 раза, выключается обогрев/вентиляция
  if (btn1H.click()) {
    if (value2L >= 10) {value2L =0; tset2L =0;} //сброс вентиляции при включении обогрева
    if (value1H >= 40) {value1H =0; tset1H =0;} //сброс обогрева при 4м нажатии
    else{value1H += 10 ;} //счетчик
  }
  if (btn2L.click()) {
    if (value1H >=10) {value1H =0; tset1H =0;} //сброс обогрева при включении вентиляции
    if (value2L >=40) {value2L =0; tset2L =0;} //сброс вентиляции при 4м нажатии
    else{value2L += 10 ;} //счетчик
  }

  if (value1H == 0 && value2L == 0) {analogWrite(5, 143);} // часть кода которая отключает обогрев и вентиляцию при нулевых счетчиках

    if (value1H >= 10) {digitalWrite(4, HIGH);} //включение индикации обогрева
    if (value1H < 10) {digitalWrite(4, LOW);} //выключение индикации обогрева

    if (value2L >= 10) {digitalWrite(6, HIGH);} //включение индикации вентиляции
    if (value2L < 10) {digitalWrite(6, LOW);} //выключение индикации вентиляции


  //выход на сиденье готового сигнала обогрева и вентиляции

  // выход на 1H подогрева
  if (value1H == 20) {analogWrite(5, 251);}
  if (value1H == 30) {analogWrite(5, 216);}
  if (value1H == 40) {analogWrite(5, 180);}
//выход на 2L охлаждения
   if (value2L == 20) {analogWrite(5, 38);}
  if (value2L == 30) {analogWrite(5, 73);}
  if (value2L == 40) {analogWrite(5, 105);}

  //индикация работы

//выход на 1H индикации подогрева
  if (value1H == 0) {digitalWrite(12, LOW); digitalWrite(13, LOW); digitalWrite(14, LOW); digitalWrite(18, LOW);}
  if (value1H == 10) {digitalWrite(12, LOW); digitalWrite(13, LOW); digitalWrite(14, LOW); digitalWrite(18, HIGH);}
  if (value1H == 20) {digitalWrite(12, HIGH); digitalWrite(13, HIGH); digitalWrite(14, HIGH); digitalWrite(18, LOW);}
  if (value1H == 30) {digitalWrite(12, LOW); digitalWrite(13, HIGH); digitalWrite(14, HIGH); digitalWrite(18, LOW);}
  if (value1H == 40) {digitalWrite(12, LOW); digitalWrite(13, LOW); digitalWrite(14, HIGH); digitalWrite(18, LOW);}
//выход на 2L индикации охлаждения
  if (value2L == 0) {digitalWrite(15, LOW); digitalWrite(16, LOW); digitalWrite(17, LOW); digitalWrite(19, LOW);}
  if (value2L == 10) {digitalWrite(15, LOW); digitalWrite(16, LOW); digitalWrite(17, LOW); digitalWrite(19, HIGH);}
  if (value2L == 20) {digitalWrite(15, HIGH); digitalWrite(16, HIGH); digitalWrite(17, HIGH); digitalWrite(19, LOW);}
  if (value2L == 30) {digitalWrite(15, LOW); digitalWrite(16, HIGH); digitalWrite(17, HIGH); digitalWrite(19, LOW);}
  if (value2L == 40) {digitalWrite(15, LOW); digitalWrite(16, LOW); digitalWrite(17, HIGH); digitalWrite(19, LOW);}

//авто режимы

//авто режим 1H подогрева
if (value1H == 10)
{
  if (tset1H == 0 && millis() - timing1H >= 1000)
{analogWrite(5, 251); timing1H = millis(); tset1H = 1;}

if (tset1H == 1 && millis() - timing1H >= 300000)
{analogWrite(5, 216); timing1H = millis(); tset1H = 2;}

if (tset1H == 2 && millis() - timing1H >= 300000)
{analogWrite(5, 180); timing1H = millis(); tset1H = 3;}

if (tset1H == 3 && millis() - timing1H >= 300000)
{tset1H = 0; value1H = 0; timing1H = millis();}
}

//авто режим 2L охлаждения
if (value2L == 10)
{
  if (tset2L == 0 && millis() - timing2L >= 1000)
{analogWrite(5, 38); timing2L = millis(); tset2L = 1;}

if (tset2L == 1 && millis() - timing2L >= 300000)
{analogWrite(5, 73); timing2L = millis(); tset2L = 2;}

if (tset2L == 2 && millis() - timing2L >= 300000)
{analogWrite(5, 105); timing2L = millis(); tset2L = 3;}

if (tset2L == 3 && millis() - timing2L >= 300000)
{tset2L = 0; value2L = 0; timing2L = millis();}
}
}
если поможете с вопросом буду очень благодарен
 

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

★★★★★★★
14 Авг 2019
4,360
1,331
Москва
Первое что у видел в неработающем коде - интервал не сплошной.
Далее замените
if (val >= 120 && val <= 220){analogWrite(9, 200);}
на что то типа
if (val >= 120 && val <= 220) res=200;
после всех проверок
выведите res и val в монитор порта, а уже потом
analogWrite(9, res);
Но не забудьте в самом начале дать переменной res какой то начальное значение, типа 30 или 201, которое не назначается условиями. Ну и будет понятно скорее всего.
Вообще можно (и нужно для проверки!) не читать val , а сделать цикл по ВСЕМ возможным значениям val и вывести то. что получается
 
  • Лойс +1
Реакции: xentry

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

★★★★★★★
14 Авг 2019
4,360
1,331
Москва
@xentry, При значении val в 230 единиц , что будет происходить? А я скажу, выключится обогрев, хотя еще должно как то вентилироваться еще
 

xentry

✩✩✩✩✩✩✩
11 Май 2026
5
0
@Старик Похабыч,там впринципе val 230 и не может быть, там 170,примерноприходит и следующее 300 уже, тоесть там вообще не линейный обогрев
 

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

★★★★★★★
14 Авг 2019
4,360
1,331
Москва
Хорошо иметь такую уверенность )
Это потенциальная проблема. Сделать обработку интервала 221-239 куда проще чем потом искать что не так.
 

microsystems

★✩✩✩✩✩✩
Мало того, что код проверки с "дырками", вот эта строчка к тому же еще и никогда не выполнится:
C++:
//обогрев
if (val >=1024 && val <= 940){analogWrite(8, 250);}
Хотя-бы поменяйте местами 1024 и 940.

А лучше будет вот так:
C++:
//обогрев
if (val >= 940){analogWrite(8, 250);}

И еще. Сплошные if-ы, мягко говоря, просто бесят. Удивляет, но не видел здесь ни одного кода, кто бы делал по нормальному.
Делайте if /else if.
C++:
// --- Вентиляция (Пин 9) ---
if (val >= 500) {
  digitalWrite(9, LOW);     // Выключено, если 500 и выше
}
else if (val >= 360) {
  analogWrite(9, 60);       // От 360 до 499
}
else if (val >= 230) {
  analogWrite(9, 130);      // От 230 до 359
}
else if (val >= 120) {
  analogWrite(9, 200);      // От 120 до 229
}
else {
  analogWrite(9, 250);      // меньше 120
}

// --- Обогрев (Пин 8) ---
if (val >= 940) {
  analogWrite(8, 250);      // От 940 и выше (максимум 1023)
}
else if (val >= 790) {
  analogWrite(8, 170);      // От 790 до 939
}
else if (val >= 650) {
  analogWrite(8, 80);       // От 650 до 789
}
else {
  digitalWrite(8, LOW);     // Выключено, если меньше 650
}
 
Изменено:
  • Лойс +1
Реакции: xentry и bort707

xentry

✩✩✩✩✩✩✩
11 Май 2026
5
0
@microsystems, благодарю, основная проблема была не в коде, так же благодарю @Старик Похабыч ,вывел val в монитор порта, увидел что ардуино некорректно видела напряжение, добавил конденсатор 1000мкф, все заработало, с кодом обогрева тоже жестко тупанул, спасибо что пнул, тоже долго не мог понять что не так, ну и не заметил что в 8 выводе ардуино нет шим. если вдруг кому понадобится код для похожих задач, то делюсь им тут:
C++:
int val = 10;   
int res = 10;
int res2 =30;

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

void loop() {
  // put your main code here, to run repeatedly:
val = analogRead(15); 
//вентиляция
if (val >= 600 || val <=50) res = 10; //выключение при обогреве и сбое питания
else if (val >= 70 && val <= 180) res=200;
else if (val >= 190 && val <= 290) res=130;
else if (val >= 320 && val <= 495) res=60;

//обогрев
if (val <= 780) res2=10; //выключение при вентиляции
else if (val >= 980) res2=230;
else if (val >= 900 && val <= 980) res2=170;
else if (val >= 800 && val <= 890) res2=80;

if (res == 200){analogWrite(9, 200);}
else if (res == 130){analogWrite(9, 130);}
else if (res == 60){analogWrite(9, 60);}
else if (res == 10){digitalWrite(9,LOW);}
//обогрев
if (res2 == 230){analogWrite(10, 230);}
else if (res2 == 170){analogWrite(10, 170);}
else if (res2 == 80){analogWrite(10, 80);}
else if (res2 == 10){digitalWrite(10,LOW);}

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