Доброго времени суток всем! Ищу помощи в редактировании кода, так как мои знания нулевые. Суть вот в чем, есть маты подогрева автомобильных сидений, есть ардуино уно, и есть код (не мой). Но этот код для управления одним сидением. Можно ли как то продублировать это на второе сиденье не приобретая отдельную плату. Хотелось бы оправлять всем с одной платы.
Вот код:
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;
}
}
Дело в том что через пару дней на вахту ехать.хотелось бы сейчас сделать.сделаю пока через реле с таймером а там буду учить потихоньку матчасть. Просто как бы временное не стало постоянным .спасибо всем за советы и подсказки.
Вот зачем Ардуино? Для себя я б делал просто тумблер “вкл/выкл”.
Ежели на ардуино, то только для того, чтобы функционал добавить: защита от разряда аккумулятора, таймер работы, ну и ШИМ.
Да можно. Самый простой способ запараллелить подушки.
Если хочется разный нагрев то надо переписать программу. Но тут есть подводные камни в виде управления и индикации второй подушкой. Или надо добавить кнопки и светодиоды в том же количестве как на первой. Или можно добавить 1 светодиод индикации подушки и переключать между подушками длинным нажатием. Какой способ более приемлем?
Как то так. Не проверял. Светодиод на ноге 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);
}