Что не так с кодом кнопок?
- Войдите на сайт для отправки комментариев
#include <Arduino.h>
//для удобства обзываем выводы
#define rel1 11 //вывод на реле вытяжки
#define rel2 12 //вывод на реле света
void setup()
{
pinMode(2, INPUT_PULLUP); //сообщаем ардуине о том, что
pinMode(3, INPUT_PULLUP); //пины 2-4 используются как
pinMode(4, INPUT_PULLUP); //кнопки с внутренней подтяжкой
pinMode(13, OUTPUT); //тестовый вывод; будет зажигаться в режиме ожидания
pinMode(11, OUTPUT); //реле вытяжки
pinMode(12, OUTPUT); //реле света
}
void loop()
{
int btn2 = digitalRead(2); //кнопка2, вход D2
int btn3 = digitalRead(3); //кнопка3, вход D3
int btn4 = digitalRead(4); //кнопка4, вход D4
int btn4state = 0; //хранилище текущего стейта кнопки
int btn4state_old = 0; //хранилище прошлого состояния кнопки
int lightstate = 0; //переменная, в которую мы кладём статус света
begin:
if (btn2 == HIGH) //если кнопка 2 отпущена
{
digitalWrite(rel1, LOW); //то ничего не делаем
if (btn3 == HIGH) //если кнопка 3 отпущена
{
digitalWrite(rel1, LOW); //то ничего не делаем
btn4state = btn4;
if ((btn4state == LOW) && (btn4state_old == HIGH)) //если кнопка 4 нажата, а до этого была отпущена
{
lightstate = 1 - lightstate; //то делаем магию
delay(50); //защита от дребезга кнопки
}
btn4state_old = btn4state; //теперь значение btn4 старое, записываем
if (lightstate == 1) //если lightstate стал равен одному
{
digitalWrite(13, HIGH); //то включаем свет
}
else
{
digitalWrite(13, LOW); //если нет, выключаем
goto begin;
}
}
else
{
digitalWrite(rel1, HIGH); //врубаем вытяжку
delay(3600000); //ждем час
digitalWrite(rel1, LOW); //вырубаем
goto begin;
}
}
else
{
digitalWrite(rel1, HIGH); //врубаем вытяжку
delay(1800000); //ждем 30 минут
digitalWrite(rel1, LOW); //вырубаем
goto begin;
}
goto begin;
}
Команда goto не дает опрашивать состояния кнопок.
Куто вас вообще надоумил?
Да и с вложенными условиями у вас похоже что-то не то...
чето я не понял как именно устройство должно работать....
чето я не понял как именно устройство должно работать....
жмёшь кпопы и оно работает.
Станднртаная кухонная вытяжка из котороый был выкинут вентилятор (стоит приточка).
По результатам переделки - есть 4 кнопки (используем пока 3) и два реле (220В)
Одно реле отвечает rel2 отвечает как на всех вытяжках за освещение. Т.е нажал кнопку btn4 - свет есть. Нажал - света нет.
Второе реле rel 1 подает 220В на клапан вентиляции (при подаче закрывается - отрубая другие ветки).
И вот по нажатию кнопки btn2 и btn3 подает напряжение на 1ое реле на полчаса и час соответсвенно.
то есть 4 кнопки....
первая - включает и выключает реле
вторая - включает и выключает клапан вытяжки
третья - включает клапан вытяжки на пол часа
четвертая - включает клапан вытяжки на час
я правильно все понял?????
Да.
Но "вторая - включает и выключает клапан вытяжки" - сейчас в коде не прописана
а если вытяжка уже работает (по кнопкам 2-4, неважно кто инициатор), и повторно нажата кнопка 2 или 3, то что делать? Остановить или продлить еще на полчаса/час?
На самом деле не так важно. Сейчас бы запустить базовый функционал.
В идеале думаю - продлить на полчаса.
Отменить все и вернутся в исходное состояние думаю как раз будет со временем 4я кнопка
Получился вот такой код
чой-то заморочено очень, да и комменты на буржуйском тяжело воспринимать.
При таком раскладе получаем обращение к outPins[1], т.е. второму элементу массива, а у тебя изначально задан только один элемент: {11}.
Аналогично обращаемся всегда ко второму элементу states[i] , но никогда не используем первый элемент. Зачем тогд тратить под него память?
В примере изначально был массив из 3х элекментов. 3 кнопки - 3события на выводе. У меня же элемент один.
Здесь проблемы только в чистоте кода - или все таки код получается рабчоим?