Чередовать 2 реле одной кнопкой
У меня есть очень базовые знания в области программирования, но я хочу добиться того, чтобы попеременно переключать 2 реле с помощью кнопки или входного импульса RPi.
Что-то вроде этого:
- Нажмите кнопку
- Включение и выключение реле 1 (задержка 1 секунда)
- Нажмите кнопку
- Включение и выключение реле 2
- Нажмите кнопку
- Включение и выключение реле 1 (задержка 1 секунда)
- Нажмите кнопку
- Включение и выключение реле 2
- Нажмите кнопку
- Включение и выключение реле 1 (задержка 1 секунда)
- Нажмите кнопку
- Включение и выключение реле 2
- и т. д.
Вот мой код, я подумал, что если бы я просто поставил второе реле после первого else
, все бы работало. Но мне не хватает некоторых базовых знаний, чтобы понять это.
const int ledPin = 2;
const int ledPinA = 3;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPinA, OUTPUT);
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(1);
if (sensorValue > 500) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
if (sensorValue > 500) {
digitalWrite(ledPinA, HIGH);
} else {
digitalWrite(ledPinA, LOW);
}
}
Я думаю, мне следует использовать while
.
@user31208, 👍1
Обсуждение2 ответа
Лучший ответ:
Что-то вроде этого:
просто:
увеличивать счетчик на основе нажатий кнопок;
запустите конечный автомат на этом счетчике, чтобы принять решение о ретрансляционных действиях.
конечный автомат может быть простым оператором switch/case.
Спасибо dannyf. Это было действительно просто. Сделал счетчик, ==1 переключает реле 1, а ==2 переключает другое и сбрасывает счетчик., @user31208
В вашем случае оба блока if
будут оцениваться каждый раз, когда вы вызываете loop()
. Вместо этого вам нужно создать переменную, которая остается «активной» между каждым вызовом loop()
, чтобы отслеживать, какое реле вы хотите активировать:
const int ledPin = 2;
const int ledPinA = 3;
int active_relay = 2; // Переменная состояния для текущего вывода реле
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPinA, OUTPUT);
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(1); // Это задерживает 1 мс, а не 1 с ??
if (sensorValue > 500) { // Получен импульс
digitalWrite(active_relay, HIGH); // Реле на
delay(1000); // Подождать 1 секунду
digitalWrite(active_relay, LOW); // Реле выключено
// Обновить переменную для следующего вызова цикла
if (active_relay == ledPin) {
active_relay = ledPinA; // Менять
}
else {
active_relay = ledPin; // Менять
}
}
// Удалить 2-й блок if
}
Я бы использовал цифровое считывание булавки с некоторым устранением дребезга; если считываемое значение должно быть аналоговым (но это знает только OP), возможно, требуется небольшая фильтрация, @frarugi87
- Как заставить 5-вольтовое реле работать с NodeMCU
- Когда следует использовать транзистор, МОП-транзистор, а когда следует использовать реле?
- Причины, по которым нельзя подключать реле непосредственно к цифровому контакту Arduino
- Esp8266 Vin контакт
- Правильный PIN для активации беспроводного реле с ESP8266 ESP-01
- Несколько неблокирующих таймеров обратного отсчета?
- Как инициализировать цифровой выходной контакт как LOW
- Управление реле 5В с помощью Wemos D1 R1
Вы хотите, чтобы реле включалось ОДИН РАЗ или несколько раз (чтобы они мигали)?, @frarugi87
Можно ли также переключаться между реле долгим нажатием?, @Michael Messer