Кнопочное управление несколькими реле

Я новичок в ардуино и не смог найти/создать рабочий код для своего проекта. Я хотел бы управлять несколькими различными реле (стандартные оптические реле 5 В) с помощью кнопок. Я хочу, чтобы одна кнопка1 включала/выключала реле1, кнопка2 включала/выключала реле 2 и т. д.

Я столкнулся с проблемами, используя операторы задержки в качестве дебаунсеров, потому что я предполагаю, что они блокируют оставшуюся часть кода во время выполнения? Затем я попытался использовать метод пометки, описанный здесь:

https:/ /github.com/VRomanov89/EEEnthusiast/blob/master/03.%20Arduino%20Tutorials/01.%20Advanced%20Button%20Control/ButtonSketch/ButtonSketch.ino

const int numOfInputs = 2;
const int inputPins[numOfInputs] = {2,3};
const int outputPin = 10;

int LEDState = 0;
int inputState[numOfInputs];
int lastInputState[numOfInputs] = {LOW,LOW};
bool inputFlags[numOfInputs] = {LOW,LOW};
int inputCounters[numOfInputs];

long lastDebounceTime[numOfInputs] = {0,0};
long debounceDelay = 50;

void setup() {
  for(int i = 0; i < numOfInputs; i++) {
    pinMode(inputPins[i], INPUT);
    digitalWrite(inputPins[i], HIGH); // подтягивание 20k
  }
  Serial.begin(9600);
  pinMode(outputPin, OUTPUT);
}

void loop() {
  setInputFlags();
  resolveInputFlags();
  resolveOutputs();
}

void setInputFlags() {
  for(int i = 0; i < numOfInputs; i++) {
    int reading = digitalRead(inputPins[i]);
    if (reading != lastInputState[i]) {
      lastDebounceTime[i] = millis();
    }
    if ((millis() - lastDebounceTime[i]) > debounceDelay) {
      if (reading != inputState[i]) {
        inputState[i] = reading;
        if (inputState[i] == HIGH) {
          inputFlags[i] = HIGH;
        }
      }
    }
    lastInputState[i] = reading;
  }
}

void resolveInputFlags() {
  for(int i = 0; i < numOfInputs; i++) {
    if(inputFlags[i] == HIGH) {
      // Логика переключения ввода
      inputCounters[i]++;
      updateLEDState(i); 
      printString(i);
      inputFlags[i] = LOW;
    }
  }
}

void printString(int output) {
      Serial.print("Input ");
      Serial.print(output);
      Serial.print(" was pressed ");
      Serial.print(inputCounters[output]);
      Serial.println(" times.");
}

void updateLEDState(int input) {
  // ввод 0 = состояние 0 и 1
  if(input == 0) {
    if(LEDState == 0) {
      LEDState = 1;
    }else{
      LEDState = 0;
    }
  // ввод 1 = состояние от 2 до 6
  }else if(input == 1) { // 2,3,4,5,6,2,3,4,5,6,2,
    if(LEDState == 0 || LEDState == 1 || LEDState > 5) {
      LEDState = 2;
    }else{
      LEDState++;
    }
  }
}

void resolveOutputs() {
  switch (LEDState) {
    case 0:
      digitalWrite(outputPin, LOW);
      break;
    case 1:
      digitalWrite(outputPin, HIGH);
      break;
    case 2:
      analogWrite(outputPin, 30);
      break;
    case 3:
      analogWrite(outputPin, 70);
      break;
    case 4:
      analogWrite(outputPin, 100);
      break;
    case 5:
      analogWrite(outputPin, 155);
      break;
    case 6:
      analogWrite(outputPin, 255);
      break;
    default: 
    break;
  }
}

Но мне не удалось изменить код, чтобы заставить его работать... Может ли кто-нибудь помочь мне написать немного кода, который позволит мне делать то, что я хочу? Я бы не стал покупать для этого матричный щит, но если придется, куплю.

Что я хочу сделать:

  • Включите реле1 мгновенным нажатием кнопки1
  • Выключите реле 1, нажав кнопку 1 мгновенного действия.
  • Включите реле2 мгновенным нажатием кнопки2
  • Выключите реле2, кратковременно нажав кнопку2.
  • и т. д.
  • и т. д.

Заранее спасибо!

, 👍1


3 ответа


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

0

Чтобы использовать этот скетч, вам понадобится библиотека Bounce2 и два переключателя NO, подключенных между GND и указанными цифровыми выводами Arduino. . Я не уверен, есть ли ограничение на количество объектов Bounce2, которые вы можете создать. Взгляните на файлы Bounce2.h и Bounce2.cpp.

#include <Bounce2.h>
byte buttonOneState = 0;
byte buttonTwoState = 0;
const byte buttonPin1 = 4;
const byte buttonPin2 = 5;
const byte debouncerInterval = 50;

// Создаем ОДИН ИЛИ НЕСКОЛЬКО объектов Bounce2.
Bounce debouncer = Bounce();
Bounce debouncer2 = Bounce();

void setup(){
  Serial.begin(9600);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  debouncer.attach(buttonPin1);
  debouncer.interval(debouncerInterval);
  debouncer2.attach(buttonPin2);
  debouncer2.interval(debouncerInterval);
}

void loop(){

  // Кнопка 1
  if(debouncer.update()){
    if(debouncer.read() == 0){
      if(buttonOneState == 0){
        Serial.println("Turn Relay 1 ON");
        buttonOneState = 1;
      }
      else{
        Serial.println("Turn Relay 1 OFF");
        buttonOneState = 0;
      }
    }
  }

  // Кнопка 2
  if(debouncer2.update()){
    if(debouncer2.read() == 0){
      if(buttonTwoState == 0){
        Serial.println("Turn Relay 2 ON");
        buttonTwoState = 1;
      }
      else{
        Serial.println("Turn Relay 2 OFF");
        buttonTwoState = 0;
      }
    }
  }

}
,

Простите мое невежество: в какой строке указывается выходной контакт для подключения к реле? Большое спасибо за вашу помощь - это гораздо более лаконично, чем мои попытки!, @user3259523

В эскизе не указаны номера контактов реле. Я оставил это на ваше усмотрение, какие из них использовать. Вы можете управлять командами ВКЛ/ВЫКЛ для реле, где операторы "Serial.println..." расположены в скетче. Имейте в виду, что некоторым оптическим релейным модулям требуется НИЗКИЙ сигнал для включения и ВЫСОКИЙ сигнал для их ВЫКЛЮЧЕНИЯ. Важно сначала убедиться, что вы получаете желаемый результат, и операторы печати — это простой способ сделать это., @VE7JRO

Хорошо красиво, спасибо большое! Хорошее замечание по реле; Надо будет проверить даташиты. Я опубликую то, что у меня есть, как только я заработаю., @user3259523


0

Вы можете использовать эту библиотеку кнопок от JChristensen (в GitHub)

Вам нужно только прочитать краткую (хотя и полезную) документацию, и вы сможете контролировать не только состояние многих кнопок, но и читать время нажатия кнопок.

Надеюсь, вы сможете решить свою небольшую проблему :D

СОВЕТ. Попробуйте установить задержку в 50 мс при создании экземпляра объекта кнопки

.
,

0

Вот окончательное решение, которое я реализовал:

/* Спасибо VE7JRO за решение моей проблемы.
* Тема найдена по адресу https://arduinoprosto.ru/q/55540/knopochnoe-upravlenie-neskolkimi-rele.
*/

#include <Bounce2.h>
byte buttonOneState = 0;
byte buttonTwoState = 0;
byte buttonThreeState = 0;
byte buttonFourState = 0;
const byte buttonPin1 = 2;
const byte buttonPin2 = 3;
const byte buttonPin3 = 4;
const byte buttonPin4 = 5;
const byte relayPin1 = 9; // Контакт реле 1
const byte relayPin2 = 10; // Контакт реле 2
const byte relayPin3 = 11; // Контакт реле 3
const byte relayPin4 = 12; // Контакт реле 4
const byte debouncerInterval = 50;

// Создаем ОДИН ИЛИ НЕСКОЛЬКО объектов Bounce2.
Bounce debouncer = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();
Bounce debouncer4 = Bounce();

void setup(){
  Serial.begin(9600);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);
  pinMode(buttonPin4, INPUT_PULLUP);
  debouncer.attach(buttonPin1);
  debouncer.interval(debouncerInterval);
  debouncer2.attach(buttonPin2);
  debouncer2.interval(debouncerInterval);
  debouncer3.attach(buttonPin3);
  debouncer3.interval(debouncerInterval);
  debouncer4.attach(buttonPin4);
  debouncer4.interval(debouncerInterval);
  pinMode(relayPin1, OUTPUT); //Определяем пин как выход
  pinMode(relayPin2, OUTPUT); //Определяем пин как выход
  pinMode(relayPin3, OUTPUT); //Определяем пин как выход
  pinMode(relayPin4, OUTPUT); //Определяем пин как выход
}

void loop(){

  // Кнопка 1
  if(debouncer.update()){
    if(debouncer.read() == 0){
      if(buttonOneState == 0){
        Serial.println("Turn Relay 1 ON");
        digitalWrite(relayPin1, HIGH);
        buttonOneState = 1;
      }
      else{
        Serial.println("Turn Relay 1 OFF");
        digitalWrite(relayPin1, LOW);
        buttonOneState = 0;
      }
    }
  }

  // Кнопка 2
  if(debouncer2.update()){
    if(debouncer2.read() == 0){
      if(buttonTwoState == 0){
        Serial.println("Turn Relay 2 ON");
        digitalWrite(relayPin2, HIGH);
        buttonTwoState = 1;
      }
      else{
        Serial.println("Turn Relay 2 OFF");
        digitalWrite(relayPin2, LOW);
        buttonTwoState = 0;
      }
    }
  }

  // Кнопка 3
  if(debouncer3.update()){
    if(debouncer3.read() == 0){
      if(buttonThreeState == 0){
        Serial.println("Turn Relay 3 ON");
        digitalWrite(relayPin3, HIGH);
        buttonThreeState = 1;
      }
      else{
        Serial.println("Turn Relay 3 OFF");
        digitalWrite(relayPin3, LOW);
        buttonThreeState = 0;
      }
    }
  }
  // Кнопка 4
  if(debouncer4.update()){
    if(debouncer4.read() == 0){
      if(buttonFourState == 0){
        Serial.println("Turn Relay 4 ON");
        digitalWrite(relayPin4, HIGH);
        buttonFourState = 1;
      }
      else{
        Serial.println("Turn Relay 4 OFF");
        digitalWrite(relayPin4, LOW);
        buttonFourState = 0;
      }
    }
  }

}
,