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

xentry

✩✩✩✩✩✩✩
11 Май 2026
2
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,434
987
У вас было бы больше шансов получить полезные ответы, если бы вставили код прямо в сообщение вместо того чтобы прикладывать файлы.
Если будете это делать, обратите внимание на правила вставки кода на этом форуме.
 

xentry

✩✩✩✩✩✩✩
11 Май 2026
2
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,355
1,328
Москва
Первое что у видел в неработающем коде - интервал не сплошной.
Далее замените
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 и вывести то. что получается