Как выполнять программы на основе полученного значения bluetooth - wake-up-light (ESP32)

Я пытаюсь выполнять программы на своем arduino на основе значений, полученных через Bluetooth. Хотя я много экспериментировал, я не могу заставить код работать.

Я создал простое приложение для Android с тремя кнопками, которое отправляет значение "11", "21" или "31" на arduino по Bluetooth, что должно инициировать код для работы DIY wake-up-light (ESP32 + NeoPixels). Кто-нибудь может сказать мне, что я делаю не так? Заранее спасибо!

#include "BluetoothSerial.h" 
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

// init Class:
BluetoothSerial ESP_BT; 

#define LED_PIN    5
#define LED_COUNT 7

Adafruit_NeoPixel matrix = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  matrix.begin();
  matrix.show(); // Инициализировать все пиксели в положение " выкл."

  Serial.begin(19200);
  ESP_BT.begin("Wake_Up_Light"); //Имя интерфейса Bluetooth
}

int led_pin_1 = 5;
int incoming;


void loop() {

// ------------ вызов программы пробуждения или программы gotosleep ----------------
  if (ESP_BT.available()) 
  {
    incoming = ESP_BT.read(); //Read what we receive 


    int rnumber = incoming;
    
    switch (rnumber) {
      case 1:  
        Serial.print("11"); //----- Activate wake-up light after 6 hours -----
          6hours();
          wakeup();
          ledsoff();
        break;
      
      case 2:  
        Serial.print("21"); //----- Activate go-to-sleep mode -----
          gotosleep();
        break;
      
      case 3:  
        Serial.print("31"); //----- Activate powernap mode -----
          gotosleep();
          wakeupdelay();
          wakeup(); 
          ledsoff();
        break;
      }
  }
}

void wakeup() {

    uint16_t i, j;

  for (j = 1; j < 10; j++) {
    for (i = 0; i <LED_COUNT; i++) {
      matrix.setBrightness(255);
      matrix.setPixelColor(i, 3, j, j);
    }
    matrix.show();
    delay(18000); //-------- 180.000ms (3 minutes) / 10 steps = 18.000 ---------
  }
}

void gotosleep() {

    uint16_t i, j;
  for (j = 10; j > 0; j--) {
    for (i = 0; i <LED_COUNT; i++) {
      matrix.setBrightness(255);
      matrix.setPixelColor(i, 3, j, j);
    }
    matrix.show();
    delay(16363); // ---- 180000ms (3 minutes) / 11 steps = 16363 --------
  }
  matrix.setBrightness(0);
  delay(40000); // ---- 40 seconds delay
  }

void wakeupdelay() {
  delay(1200000);
}

void ledsoff() {
    matrix.setBrightness(0);
}

void 6hours() {
  delay(21600000)
}

, 👍0

Обсуждение

Непонятно, куда вы что посылаете. В своем тексте вы указываете, чтобы отправить "11" и т. Д. Из приложения Android в ESP. Но ваш код реагирует на двоичные данные со значениями от 1 до 3 от Bluetooth и сам отправит "11" и т. Д. Просьба уточнить, @chrisl

почему вы не печатаете полученное значение? ... это было бы первое, что нужно сделать при отладке ... кроме того, почему вы не говорите, в чем проблема?, @jsotola

Весь код загружается на ESP32. Я подключаю свой телефон к ESP32 через Bluetooth и отправляю номер 11, 21 или 31 в ESP32 (метод Send1ByteNumber). ESP32 должен прослушивать все, что принимается по Bluetooth, и, например, при получении значения 11 он должен запускать 6hours(); wakeup(); и ledsoff(); друг за другом, а затем ждать дальнейших инструкций (вход Bluetooth). Ничего не нужно отправлять обратно на телефон/приложение., @Raptor452

Значения "case" внутри вашего оператора "switch" в настоящее время сравнивают полученное значение с 1, 2 и 3, а не с 11, 21 и 31, как кажется на первый взгляд., @StarCat


1 ответ


1

Спасибо за ответы. Я предпринял еще один попытку и смог заставить код работать. Я выложу его здесь. Еще не закончил на 100%, но в основном делал то, что хотел.

#include "esp_bt_main.h"
#include "esp_bt_device.h"
#include "BluetoothSerial.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

#define LED_PIN    5
#define LED_COUNT 7

Adafruit_NeoPixel matrix = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

String  Recvd;
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

BluetoothSerial ESP_BT;
void printDeviceAddress() {

const uint8_t* point = esp_bt_dev_get_address();

for (int i = 0; i < 6; i++) {
   char str[3];
   sprintf(str, "%02X", (int)point[i]);
   Serial.print(str);
   if (i < 5){
   Serial.print(":");}
}
Serial.println();
}

void setup()
{
Recvd = "";

Serial.begin(19200);

  ESP_BT.begin("Wake_Up_Light");
  Serial.println("Address:");
  printDeviceAddress();

}

int led_pin_1 = 5;
int incoming;

void loop()
{
matrix.setBrightness(0);
matrix.show();
    if (ESP_BT.available()) {
      Recvd = (ESP_BT.read());
      Serial.println("Received value:");
      Serial.println(Recvd);
      if (Recvd == "11") {
        Serial.println("Running wake-up>6hr mode");
        sixhours();
        wakeup();
        ledsoff();

      }
      if (Recvd == "21") {
        Serial.println("Running go-to-sleep mode");
        gotosleep();

      }
      if (Recvd == "31") {
        Serial.println("Running powernap mode");
        gotosleep();
        wakeupdelay();
        wakeup(); 
        ledsoff();

      }

    }

}

void wakeup() {

    uint16_t i, j;

  for (j = 1; j < 10; j++) {
    for (i = 0; i <LED_COUNT; i++) {
      matrix.setBrightness(255);
      matrix.setPixelColor(i, 3, j, j);
    }
    matrix.show();
    delay(18000); //-------- 180.000ms (3 minutes) / 10 steps = 18.000 ---------
  }
}

void gotosleep() {

    uint16_t i, j;
  for (j = 10; j > 0; j--) {
    for (i = 0; i <LED_COUNT; i++) {
      matrix.setBrightness(255);
      matrix.setPixelColor(i, 3, j, j);
    }
    matrix.show();
    delay(16363); // ---- 180000ms (3 minutes) / 11 steps = 16363 --------
  }
  matrix.setBrightness(0);
  delay(40000); // ---- 40 seconds delay
  }

void wakeupdelay() {
  delay(1200000); // (20 minutes)
}

void ledsoff() {
    matrix.setBrightness(0);
}

void sixhours() {
  delay(21600000); // (6 hours)
}
,