Всем хай. Дело такое: ESP8266 (wemos d1 mini) Приемник подключил - все работает. Взял нужный мне большой готовый код (ютуб-инженерка), и не могу врубиться где нужное мне подправить. Сейчас работает так - жму коротко один раз на кнопку - Вкл, Жму еще раз - Выкл, Задержка - Вкл. А мне нужно что бы реле повторяло кнопку - держу кнопку - вкл, Отпустил кнопку - Выкл. Вроде мелочь, а в описании библиотеки не могу найти такого... Ну или искать не умею. Что то подскажите? Вот сам кусок кода, который нужно подправить. Код (C++): #include <RCSwitch.h> // Подключаем библиотеку RCSwitch mySwitch = RCSwitch(); // Объявляем класс // Настраиваем прием и передачу void RC_Switch_setup() { mySwitch.enableReceive(digitalPinToInterrupt(GPIO_RF_Receive)); // Receiver прием на прерывании //mySwitch.enableTransmit(GPIO_RF_Transmit); // Transmit передача // Справка digitalPinToInterrupt(GPIO) так назначаются прерывания для ESP8266 // так как приемник должен быть подключен к прерыванию }//RC_Switch_setup enum STATEenum {ON, OFF, TOGGLE}; // Отслеживание нажатие RF кнопок (с организованной защитой от долгого нажатия на RF кнопку // Это сделанно только для того что бы у нас состояние Выключателя в Blynk не менялось // при долгом удержании RF кнопки) // Namber - код RF кнопки (если код совпадет то функция выполнится) // VPIN - номер виртуального пина (обратная связь с виртуальной кнопкой) // GPIO - физический вывод ESP к котору подключено реле // RF_State - переменна хранит текущее состояние реле void feedbackRadio(int32_t Namber, int VPIN, int GPIO, boolean &RF_State, int Action=TOGGLE){ static unsigned long lastTime = 0; // Последнее нажатие unsigned long Delay = 250; // Задержка if (data == Namber){ if ((millis() - lastTime) > Delay) { lastTime = millis(); switch (Action){ case ON: RF_State = true; break; case OFF: RF_State = false; break; case TOGGLE: RF_State = !RF_State; break; } Blynk.virtualWrite(VPIN, RF_State); digitalWrite(GPIO, RLL(RF_State)); Serial.println(RF_State); } else{lastTime = millis();} } }//feedbackRadio // Отслеживаем нажатие RF кнопок // Сюда нужно поместить столько функций feedbackRadio сколько у вас радио кнопок void ReciverButtons(){ // Считывае нажатие Радио кнопок if (mySwitch.available()) { data = mySwitch.getReceivedValue(); feedbackRadio(RF_Push_ButtonCod1, VPIN_BUTTON_SWITCH1, GPIO_RELAY1, RelayState1); // Обратная связь от радио кнопок // feedbackRadio(RF_Push_ButtonCod2R, VPIN_BUTTON_SWITCH1, GPIO_RELAY1, RelayState1); // Обратная связь от радио кнопок // feedbackRadio(RF_Push_ButtonCod2L, VPIN_BUTTON_SWITCH2, GPIO_RELAY2, RelayState2); // Обратная связь от радио кнопок mySwitch.resetAvailable(); } }//ReciverButtons
откуда этот кривой код? Функция feedbackRadio переменные выключателя берет из параметров, а код кнопки - из локальной переменной. Так только индусы пишут. По делу - нужно поменять Action с Toogle на ON и написать функцию, которая держит ваше реле включенным в течении, скажем, 200мс после прихода последней команды. Как тайм аут истек - реле выключаем. Но если вы новичок - вам в 10 раз проще будет сделать одну кнопку на "Вкл", одну на "Выкл"
От сюда) Это только кусок кода По делу Что это даст? где читать? Это таймер городить нужно какой то? Я новичок, но быстро учусь. Не нашел подобных примеров и статей.
Блок Switch (Action) 10 строчек заменить на if (Action==ON) {RF_State=true;} else if (Action==OFF) {RF_State=false;} Далее со всеми остановками.