Чередовать 2 реле одной кнопкой

У меня есть очень базовые знания в области программирования, но я хочу добиться того, чтобы попеременно переключать 2 реле с помощью кнопки или входного импульса RPi.

Что-то вроде этого:

  1. Нажмите кнопку
  2. Включение и выключение реле 1 (задержка 1 секунда)
  3. Нажмите кнопку
  4. Включение и выключение реле 2
  5. Нажмите кнопку
  6. Включение и выключение реле 1 (задержка 1 секунда)
  7. Нажмите кнопку
  8. Включение и выключение реле 2
  9. Нажмите кнопку
  10. Включение и выключение реле 1 (задержка 1 секунда)
  11. Нажмите кнопку
  12. Включение и выключение реле 2
  13. и т. д.

Вот мой код, я подумал, что если бы я просто поставил второе реле после первого 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.

, 👍1

Обсуждение

Вы хотите, чтобы реле включалось ОДИН РАЗ или несколько раз (чтобы они мигали)?, @frarugi87

Можно ли также переключаться между реле долгим нажатием?, @Michael Messer


2 ответа


Лучший ответ:

0

Что-то вроде этого:

просто:

  1. увеличивать счетчик на основе нажатий кнопок;

  2. запустите конечный автомат на этом счетчике, чтобы принять решение о ретрансляционных действиях.

конечный автомат может быть простым оператором switch/case.

,

Спасибо dannyf. Это было действительно просто. Сделал счетчик, ==1 переключает реле 1, а ==2 переключает другое и сбрасывает счетчик., @user31208


1

В вашем случае оба блока 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