Как выполнять программы на основе полученного значения 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)
}
@Raptor452, 👍0
Обсуждение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)
}
,
@Raptor452
Смотрите также:
- Пример кода для ESP32 в качестве медиа-контроллера для Android/iPhone Media Apps
- Библиотека ардуино или код для ESP32 для сканирования устройств Bluetooth?
- Имена синтаксического анализа обнаружения Bluetooth ESP32
- Веб-страница с использованием Bluetooth?
- Можно ли использовать WiFi и Bluetooth/BLE в одном проекте ESP32?
- ESP32 запускает BLE после глубокого сна
- Максимальная скорость ESP32 Bluetooth SPP
- ESP32 Arduino Bluetooth Serial не подключается повторно после отключения
Непонятно, куда вы что посылаете. В своем тексте вы указываете, чтобы отправить "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