Rcswitch библиотека - помогите.

Тема в разделе "Arduino & Shields", создана пользователем Wertybrolog, 13 мар 2021.

  1. Wertybrolog

    Wertybrolog Нуб

    Всем хай.
    Дело такое:
    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
     
  2. b707

    b707 Гуру

    откуда этот кривой код? Функция feedbackRadio переменные выключателя берет из параметров, а код кнопки - из локальной переменной. Так только индусы пишут.
    По делу - нужно поменять Action с Toogle на ON и написать функцию, которая держит ваше реле включенным в течении, скажем, 200мс после прихода последней команды. Как тайм аут истек - реле выключаем.

    Но если вы новичок - вам в 10 раз проще будет сделать одну кнопку на "Вкл", одну на "Выкл"
     
  3. Wertybrolog

    Wertybrolog Нуб

    От сюда)
    Это только кусок кода

    По делу
    Что это даст? где читать?

    Это таймер городить нужно какой то?

    Я новичок, но быстро учусь. Не нашел подобных примеров и статей.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Блок Switch (Action) 10 строчек заменить на
    if (Action==ON) {RF_State=true;}
    else if (Action==OFF) {RF_State=false;}
    Далее со всеми остановками.