Кнопочное управление несколькими реле
Я новичок в ардуино и не смог найти/создать рабочий код для своего проекта. Я хотел бы управлять несколькими различными реле (стандартные оптические реле 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.
- и т. д.
- и т. д.
Заранее спасибо!
@user3259523, 👍1
3 ответа
Лучший ответ:
Чтобы использовать этот скетч, вам понадобится библиотека 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;
}
}
}
}
Вы можете использовать эту библиотеку кнопок от JChristensen (в GitHub)
Вам нужно только прочитать краткую (хотя и полезную) документацию, и вы сможете контролировать не только состояние многих кнопок, но и читать время нажатия кнопок.
Надеюсь, вы сможете решить свою небольшую проблему :D
СОВЕТ. Попробуйте установить задержку в 50 мс при создании экземпляра объекта кнопки
.Вот окончательное решение, которое я реализовал:
/* Спасибо 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;
}
}
}
}
- Несколько кнопок для управления реле
- Управляющие реле с ИК-подсветкой и кнопкой
- управление 3 реле с 1 кнопки
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как переключить светодиод при нажатии кнопки?
- Когда следует использовать транзистор, МОП-транзистор, а когда следует использовать реле?
- Нажать клавишу Windows, используя «keyboard.press();»
- Устранение дребезга кнопки с помощью прерывания
Простите мое невежество: в какой строке указывается выходной контакт для подключения к реле? Большое спасибо за вашу помощь - это гораздо более лаконично, чем мои попытки!, @user3259523
В эскизе не указаны номера контактов реле. Я оставил это на ваше усмотрение, какие из них использовать. Вы можете управлять командами ВКЛ/ВЫКЛ для реле, где операторы "Serial.println..." расположены в скетче. Имейте в виду, что некоторым оптическим релейным модулям требуется НИЗКИЙ сигнал для включения и ВЫСОКИЙ сигнал для их ВЫКЛЮЧЕНИЯ. Важно сначала убедиться, что вы получаете желаемый результат, и операторы печати — это простой способ сделать это., @VE7JRO
Хорошо красиво, спасибо большое! Хорошее замечание по реле; Надо будет проверить даташиты. Я опубликую то, что у меня есть, как только я заработаю., @user3259523