Blink и кнопка

Тема в разделе "Arduino & Shields", создана пользователем Lya-alik496, 30 апр 2020.

  1. Lya-alik496

    Lya-alik496 Нуб

    Код (C++):
    #define BLYNK_PRINT Serial
    #include <ESP8266WiFi.h>
    #include <BlynkSimpleEsp8266.h>
    #define RELE D7
    #define RELE_2 D8
    #define BUTTON D1
    #define BUTTON_2 D2
    bool rele;
    bool rele_2;
    char auth[] = "cjT2ydgF-CMKEJdWyjNzQ2H75Bp0FEAX";
    char ssid[] = "tanalad";
    char pass[] = "50511145051114";
    void setup()
    {
    Serial.begin(115200);
    Blynk.begin(auth, ssid, pass);
    pinMode(RELE, OUTPUT);
    pinMode(BUTTON, INPUT);
    pinMode(RELE_2, OUTPUT);
    pinMode(BUTTON_2, INPUT);
    }
    BLYNK_WRITE(V0)
    {
    rele = param.asInt();
    digitalWrite(RELE, rele);
    }
    BLYNK_WRITE(V1)
    {
    rele_2 = param.asInt();
    digitalWrite(RELE_2, rele_2);
    }
    void loop()
    {
    if(digitalRead(BUTTON))
    {
    rele = !rele;
    digitalWrite(RELE, rele);
    Blynk.virtualWrite(V0, rele);
    delay (1000);}
    if(digitalRead(BUTTON_2))
    {
    rele_2 = !rele_2;
    digitalWrite(RELE_2, rele_2);
    Blynk.virtualWrite(V1, rele_2);
    delay (1000);
    }
    Blynk.run();
    }
    Добрый день, очень простой вопрос но ответа я нигде не нашел.
    А сам уже голову сломал.
    Как сделать чтобы при нажатии кнопки сохранялось положение и не мешало блинку

     

    Вложения:

    Последнее редактирование: 30 апр 2020
  2. NikitOS

    NikitOS Король шутов Администратор

    А код где?
     
    Airbus нравится это.
  3. Airbus

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

    Заведи флаг.В прерывании меняй значение 0—1 и обратно в основном цыкле—блинкай
     
    NikitOS нравится это.
  4. Lya-alik496

    Lya-alik496 Нуб

    Я фото приложил
     
  5. Lya-alik496

    Lya-alik496 Нуб

    Это как?.
    Сорян, я новичок в этой теме
     
  6. NikitOS

    NikitOS Король шутов Администратор

    Я могу бан к этому приложить за 5.10.

    — Ок, Гугл, булевые переменные в Arduino.
     
    parovoZZ нравится это.
  7. Airbus

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

    Бро все просто
    [​IMG]
     
    NikitOS нравится это.
  8. Lya-alik496

    Lya-alik496 Нуб

    Код (C++):
    #define BLYNK_PRINT Serial
    #include <ESP8266WiFi.h>
    #include <BlynkSimpleEsp8266.h>
    #define RELE D7
    #define RELE_2 D8
    #define BUTTON D1
    #define BUTTON_2 D2
    bool rele;
    bool rele_2;
    char auth[] = "cjT2ydgF-CMKEJdWyjNzQ2FEAX";
    char ssid[] = "tanalad";
    char pass[] = "50511145051114";
    void setup()
    {
    Serial.begin(115200);
    Blynk.begin(auth, ssid, pass);
    pinMode(RELE, OUTPUT);
    pinMode(BUTTON, INPUT);
    pinMode(RELE_2, OUTPUT);
    pinMode(BUTTON_2, INPUT);
    }
    BLYNK_WRITE(V0)
    {
    rele = param.asInt();
    digitalWrite(RELE, rele);
    }
    BLYNK_WRITE(V1)
    {
    rele_2 = param.asInt();
    digitalWrite(RELE_2, rele_2);
    }
    void loop()
    {
    if(digitalRead(BUTTON))
    {
    rele = !rele;
    digitalWrite(RELE, rele);
    Blynk.virtualWrite(V0, rele);
    delay (1000);}
    if(digitalRead(BUTTON_2))
    {
    rele_2 = !rele_2;
    digitalWrite(RELE_2, rele_2);
    Blynk.virtualWrite(V1, rele_2);
    delay (1000);
    }
    Blynk.run();
    }
     
  9. NikitOS

    NikitOS Король шутов Администратор

    Нужно избавляться от delay.
     
  10. Lya-alik496

    Lya-alik496 Нуб

    Ну это будет не так грузить плату, ну а проблему то не изменит
     
  11. NikitOS

    NikitOS Король шутов Администратор

    А если проверить?
     
  12. Lya-alik496

    Lya-alik496 Нуб

    Убирал, реле начинают постоянно срабатывать
     
  13. NikitOS

    NikitOS Король шутов Администратор

    Чтобы не срабатывать на зажатую кнопку — второй флаг. Если кнопка нажата и не изменяли состояние пина — изменить. Изменяли — ничего не делать, пока кнопку не отпустят. Отпустили кнопку — опустили флаг на срабатывание.
     
  14. Lya-alik496

    Lya-alik496 Нуб

    Я сейчас пробовал с флагами поработать, но не вышло, кнопка просто перестала работать, может есть какой-то годный пример?
     
  15. SergeiL

    SergeiL Оракул Модератор

    Попробуйте loop() взять отсюда :
    Код (C++):
    void loop()
    {
      uint32_t        cur_ms = millis();
      static uint32_t b1_millis = 0;
      static uint32_t b2_millis = 0;


      static uint8_t but1_prev_state = 0;
      static uint8_t but2_prev_state = 0;

      if(digitalRead(BUTTON))
      {
        if((but1_prev_state == 0 ) && (cur_ms - b1_millis >= 300))
        {
          b1_millis=cur_ms;
          rele = !rele;
          digitalWrite(RELE, rele);
          Blynk.virtualWrite(V0, rele);
        }
        but1_prev_state = 1;
      }
      else if((but1_prev_state == 1 ) && (cur_ms - b1_millis >= 300))
       {
        b1_millis=cur_ms;
        but1_prev_state = 0;
        }

      if(digitalRead(BUTTON_2))
      {
        if((but2_prev_state == 0 ) && (cur_ms - b2_millis >= 300))
        {
          b2_millis=cur_ms;
          rele_2 = !rele_2;
          digitalWrite(RELE_2, rele_2);
          Blynk.virtualWrite(V1, rele_2);
        }
        but2_prev_state = 1;
      }
    else if((but2_prev_state == 1 ) && (cur_ms - b2_millis >= 300))
     {
        b2_millis=cur_ms;
        but2_prev_state = 0;
     }
      Blynk.run();
    }
    Если я конечно задачу понял правильно из Вашего объяснения.
     
    Последнее редактирование: 2 май 2020
    Lya-alik496 нравится это.
  16. Lya-alik496

    Lya-alik496 Нуб

    Ну суть вы правильно поняли, большое спасибо. Но ещё один момент... Когда кнопка выключила виртуальную и осталась нажатой надо чтобы выключеной она оставалось. Даже когда её отпустишь.
     
  17. SergeiL

    SergeiL Оракул Модератор

    И опять не понимаю.
    У вас любые изменения состояния реле и виртуальной кнопки только по нажатию на кнопку. Кнопка без фиксации - нажал состояние изменилось на противоположное. По отпусканию мы меняем флаг состояния кнопки и ничего никуда не отправляем. И виртуальная кнопка будет отображать состояние реле.
     
    Lya-alik496 нравится это.
  18. Lya-alik496

    Lya-alik496 Нуб

    Я пробовал подправить код, но у меня не получилось (пока ещё профан в этом)
    Я делаю автоматические ворота и у меня концевики отключают реле. Когда направляющая косается концевика, то он отключает реле и остаётся в зафиксированом положении.
     
  19. Lya-alik496

    Lya-alik496 Нуб

    Сейчас кнопка работает так: При коротком нажатии она отключает реле все как положено. Но при долгом нажатии она сразу отключает, но когда проходит небольшое время при отпускании кнопки она опять включает реле
     
  20. SergeiL

    SergeiL Оракул Модератор

    Поправил сообщение #15
     
    Lya-alik496 нравится это.