Подогрев сидений на Arduino

Доброго времени суток всем! Ищу помощи в редактировании кода, так как мои знания нулевые. Суть вот в чем, есть маты подогрева автомобильных сидений, есть ардуино уно, и есть код (не мой). Но этот код для управления одним сидением. Можно ли как то продублировать это на второе сиденье не приобретая отдельную плату. Хотелось бы оправлять всем с одной платы.
Вот код:

int switchPin = 8;
int pwmPin = 11;
boolean lastButton = LOW;
boolean currentButton = LOW;
int led1 = 5;
int led2 = 6;
int led3 = 7;
static int pwmLevel = 0;
// массив значений
static const uint8_t values[] = { 0, 255, 200, 120 };

// Количество элементов в массиве значений
static const int totalValues = sizeof(values) / sizeof(values[0]);

void setup() {
  Serial.begin(9600);
  pinMode(switchPin, INPUT_PULLUP);
  pinMode(pwmPin, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
}

boolean debounce(boolean last) {
  boolean current = digitalRead(switchPin);
  if (last != current) {
    delay(5);
    current = digitalRead(switchPin);
  }
  return current;
}

void loop() {
  currentButton = debounce(lastButton);
  if (lastButton == HIGH && currentButton == LOW) {

    pwmLevel = (pwmLevel + 1) % totalValues;
  }

  lastButton = currentButton;

  if (pwmLevel > 255) pwmLevel = 0;
  analogWrite(pwmPin, values[pwmLevel]);
  Serial.println(pwmLevel);

  switch (pwmLevel) {
    case 1:
      digitalWrite(5, pwmLevel);
      break;
    case 2:
      digitalWrite(6, pwmLevel == 1 || pwmLevel == 2);
      break;
    case 3:
      digitalWrite(7, pwmLevel == 1 || pwmLevel == 2 || pwmLevel == 3);
      break;
    default:
      digitalWrite(led1, LOW);
      digitalWrite(led2, LOW);
      digitalWrite(led3, LOW);
      break;
  }
}

Управление одной кнопкой, 3 режима работы.

Что отправлять? Электроны, которые тепло дают? И не из Таиланда случаем?)

Можно.

Однако, боюсь, если Ваши

то у Вас не получится. Сначала надо прокачать знания (ну, или заказать эту работу человеку с ненулевыми знаниями – тоже вариант)

ШИМ через задницу сделан. Для пущей безопасности пятой точки не хватает ПИД-регулятора. Иначе может произойти “гамно кипит”.

2 лайка

Для начала можно запараллелить сиденья, думаю.
И все будет с одной платы оправляться.

1 лайк

Одному ещё холодно, у другого кипит)))
@Asmodeus , ссылку на ШИМ-регулятор дать, или мосье предпочитает мазохизм?

Ладно понял. с ардуино не вариант. Буду делать без микроконтроллера тогда.

почему не вариант?
можно, можно еще дисплей подключить, можно датчик температуры, можно еще…
да много чего еще можно, но учитывая это

как сказали, либо скил качать сначала, либо заказывать тому кто может сделать.

Дело в том что через пару дней на вахту ехать.хотелось бы сейчас сделать.сделаю пока через реле с таймером а там буду учить потихоньку матчасть. Просто как бы временное не стало постоянным :smiley:.спасибо всем за советы и подсказки.

это правильно.
За два дня до отьезда я бы и при наличии знаний не посоветовал начинать.

я бы и реле не ставил… в спешке-то… еще коротнете что-нить важное, в итоге все оставшиеся два дня вместо модернизации потратите на ремонт.

Вот зачем Ардуино? Для себя я б делал просто тумблер “вкл/выкл”.
Ежели на ардуино, то только для того, чтобы функционал добавить: защита от разряда аккумулятора, таймер работы, ну и ШИМ.

Да можно. Самый простой способ запараллелить подушки.
Если хочется разный нагрев то надо переписать программу. Но тут есть подводные камни в виде управления и индикации второй подушкой. Или надо добавить кнопки и светодиоды в том же количестве как на первой. Или можно добавить 1 светодиод индикации подушки и переключать между подушками длинным нажатием. Какой способ более приемлем?

Начал уже делать на 555 таймере и реле.

Приложение, чтобы подогрев жопы в копейке, стоящей в гараже в Урюпинске, можно было включать/выключать сидя на тайском пляже. Щас это модно.

2 лайка

Как то так. Не проверял. Светодиод на ноге 6 показывает какой коврик регулируем и соответственно что для него установлено. Длинным нажатием больше 500мс. Короткими нажатиями регулируем ШИМ.

Спойлер
const int pwmPin1 = 9;   // Пин для первого ШИМ вывода
const int pwmPin2 = 10;  // Пин для второго ШИМ вывода

// Пины для светодиодов (отображение режимов и текущего управляемого пина)
const int ledPins[] = {2, 3, 4, 5};  // Массив пинов для светодиодов
const int controlLedPin = 6;         // Пин светодиода для отображения управления

int currentMode = 0;                // Текущий режим (0 - 3)
bool isPwm1Selected = true;         // Флаг, указывающий, управляет ли кнопка первый PWM вывод

// Пины и состояние кнопки
const int buttonPin = 7;             // Пин кнопки
bool lastButtonState = HIGH;        // Предыдущее состояние кнопки
unsigned long pressStartTime = 0;    // Время начала нажатия кнопки

void setup() {
  pinMode(pwmPin1, OUTPUT);
  pinMode(pwmPin2, OUTPUT);

  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
  }

  pinMode(controlLedPin, OUTPUT);

  pinMode(buttonPin, INPUT_PULLUP);  // Используем внутренний подтягивающий резистор
}

void loop() {
  int reading = digitalRead(buttonPin);

  if (reading != lastButtonState) {
    if (reading == LOW) {
      pressStartTime = millis();  // Начало нажатия кнопки
    } else {
      unsigned long pressDuration = millis() - pressStartTime;
      
      if (pressDuration > 500) {
        // Длительное нажатие: переключаем управление между пинами PWM
        isPwm1Selected = !isPwm1Selected;
      } else {
        // Короткое нажатие: переключаем режимы ШИМ
        currentMode++;
        if (currentMode > 3) {
          currentMode = 0;
        }
      }

      updateOutputs();
    }
  }

  lastButtonState = reading;
}

void updateOutputs() {
  // Устанавливаем значение PWM в зависимости от текущего режима и выбранного пина
  int pwmValue = map(currentMode, 0, 3, 0, 255);
  
  if (isPwm1Selected) {
    analogWrite(pwmPin1, pwmValue);
  } else {
    analogWrite(pwmPin2, pwmValue);
  }

  // Обновляем светодиоды для отображения текущего режима и управляемого пина
  for (int i = 0; i < 4; i++) {
    digitalWrite(ledPins[i], (currentMode == i) ? HIGH : LOW);
  }

  digitalWrite(controlLedPin, isPwm1Selected ? HIGH : LOW);
}
1 лайк

Спасибо.немного некорректно работает, но я как раз на нем и попрактикуюсь.

Стоило бы, наверное, поставить отметку “Вопрос решен” не себе, а на тот пост, который реально помог :wink:

Можно подробнее?