Наличие как ручных, так и автоматических c функций для светодиодов - PullRequest
0 голосов
/ 05 марта 2020

Итак, у меня возникла проблема, когда я не могу выбраться из всех oop после того, как нахожусь в ней. Мой проект состоит в том, чтобы иметь две функции, одну для ручной и другую для автоматических c, которые будут работать вечно, но я хочу, чтобы, когда я буду в автоматических c, я мог выйти, нажав кнопку ручного управления на моем Телефон. Я не знаю, имеет ли это смысл, но мне действительно нужна помощь.

//Program to control LED (ON/OFF) from ESP32 using Serial Bluetooth

#include <Arduino.h>
#include <BluetoothSerial.h> //Header File for Serial Bluetooth, will be added by default into Arduino

BluetoothSerial ESP_BT; //Object for Bluetooth

int incoming;
int yellow_led = 13;

void setup() {
  Serial.begin(9600); //Start Serial monitor in 9600
  ESP_BT.begin("ESP32_LED_Control"); //Name of your Bluetooth Signal
  Serial.println("Bluetooth Device is Ready to Pair");

  pinMode (yellow_led, OUTPUT);//Specify that LED pin is output
}



void automatic()
{
  while (incoming != 51)
  {
    digitalWrite(yellow_led, HIGH);
    ESP_BT.println("LED turned ON");

    delay(1000);

    digitalWrite(yellow_led, LOW);
    ESP_BT.println("LED turned OFF");

    delay(1000);
  }
}

void manual()
{
    if (incoming == 49)
    {
      digitalWrite(yellow_led, HIGH);
      ESP_BT.println("LED turned ON");    
    }
    else if(incoming == 48)
    {
      digitalWrite(yellow_led, LOW);
      ESP_BT.println("LED turned OFF");    
    }
}

void loop() {

  if (ESP_BT.available()) //Check if we receive anything from Bluetooth
  {
    incoming = ESP_BT.read(); //Read what we recevive 
    Serial.print("Received:"); Serial.println(incoming);

    if (incoming == 51) //#3
        {
          ESP_BT.println("In Manual Mode");
          manual();
        }

    else if (incoming == 52) //#4
        {
          ESP_BT.println("In Automatic Mode");
          automatic();
        }
  }
  delay(20);
}

1 Ответ

0 голосов
/ 05 марта 2020

Функция while l oop в автомате c не нужна. Вы уже бесконечно зацикливаетесь на loop(), так что этого должно быть достаточно. Добавление другого l oop, даже если на первый взгляд может показаться, что оно сломается, оказывается бесконечным l oop. Я вернусь к этому через секунду.

Так что все, что вам нужно сделать, это избавиться от while l oop, и оно должно работать. Однако это работает только в том случае, если вы гарантированно получите значение incoming для каждого раза в l oop, как это выглядит в вашем коде.

Другая проблема, которую я вижу здесь, заключается в том, что если вы введите скажем manual(), на самом деле нет ничего, что изменяет значение incoming, вы обязательно должны иметь 51, так как вы повторно используете предыдущее значение, и ничего, никакой желаемый путь к коду не будет запущен. То же самое относится и к automatic(), надеюсь, вы сможете увидеть, как из-за этого l oop становится бесконечным.

Так что вам также нужно кое-что в следующих строках.

void manual()
{
    if (!ESP_BT.available())
        return;
    incoming = ESP_BT.read();
    if (incoming == 49)
    {
        digitalWrite(yellow_led, HIGH);
        ESP_BT.println("LED turned ON");    
    }
    else if(incoming == 48)
    {
        digitalWrite(yellow_led, LOW);
        ESP_BT.println("LED turned OFF");    
    }
}

И, наконец, need help lol, please and thank you может быть недостаточно описательным, чтобы кто-нибудь мог помочь с вашей проблемой, пожалуйста, с go через, как задать хороший вопрос для следующей публикации.

...