Tutorial del Internet de las Cosas y Bluetooth con el ESP32
Juan Antonio Villalpando
Volver al índice del tutorial
____________________________
160B.- Bluetooth Low Energy. BLE. Dos ESP32 una aplicación. Un ESP32 varias aplicaciones.
- En el tutorial anterior vimos cómo podemos conectar dos ESP32 a una aplicación: 160_Wemos_ESP32_BLE.htm
- Cada ESP32 envía dos números aleatorios a un móvil, observamos en la pantalla la información enviada por BLE1 y BLE2
__________________________________________________
19.- Dos ESP32 envían temperatura y humedad aleatorios a la aplicación. Deslizador común. Notificación.
_____________________________________________________________________
- Ahora vamos a realizar la operación contraria.
_________________________________
1.- Un ESP32 envía datos a varios móviles. Al mismo tiempo.
p110i_esp32_ble_notifica_varios.aia
- Tenemos un ESP32, crea tres números aleatorios: temp_1, temp_2 y humedi.
- Los envía mediante BLE de esta forma: 66,57,183
- Varios móviles pueden conectar al mismo tiemp, mediante BLE al ESP32 y obtener esos números.
_________________________________
- Código para BLE.
BLE_notifica.ino |
// Juan A. Villalpando
// http://kio4.com/arduino/160B_Wemos_ESP32_BLE.htm
#include <BLEDevice.h>
#include <BLEServer.h>
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
BLEDevice::startAdvertising();
};
};
void setup() {
Serial.begin(115200);
BLEDevice::init("ESP32");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_NOTIFY
);
pService->start();
// Start advertising
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
BLEDevice::startAdvertising();
}
void loop() {
String tempe_1 = (String) random(10,100);
String tempe_2 = (String) random(10,100);
String humedit = (String) random(100,200);
String send_data = tempe_1 + "," + tempe_2 + "," + humedit;
pCharacteristic->setValue(send_data.c_str());
pCharacteristic->notify();
int random_delay = random(500,1500);
delay(random_delay);
}
|
_________________________________
- Diseño.
_________________________________
- Bloques.
_________________________________
2.- Un ESP32 envía datos distintos a varios móviles. Al mismo tiempo.
p110i_esp32_ble_notifica_caracter.aia
- Ahora el código del ESP32 enviará dos grupos de datos:
temp_1,humedi
temp_2,humedi
- Esos par de datos se enviarán mediante sus respectivos:
#define CHARACTERISTIC_UUID_1 "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define CHARACTERISTIC_UUID_2 "beb5483f-36e1-4688-b7f5-ea07361b26a8"
- Observa que en el UUID_2 he cambiado una letra e por una f.
- Para distinguir la información enviada he puesto que la tempe_1 solo genere un número de un dígito del 0 al 9
- Y la tempe_2 genere dos dígitos del 10 al 90
_________________________________
- Código para BLE.
BLE_notifica_dos.ino |
// Juan A. Villalpando
// http://kio4.com/arduino/160B_Wemos_ESP32_BLE.htm
#include <BLEDevice.h>
#include <BLEServer.h>
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic_1 = NULL;
BLECharacteristic* pCharacteristic_2 = NULL;
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID_1 "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define CHARACTERISTIC_UUID_2 "beb5483f-36e1-4688-b7f5-ea07361b26a8"
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
BLEDevice::startAdvertising();
};
};
void setup() {
Serial.begin(115200);
BLEDevice::init("ESP32");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pCharacteristic_1 = pService->createCharacteristic(
CHARACTERISTIC_UUID_1,
BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic_2 = pService->createCharacteristic(
CHARACTERISTIC_UUID_2,
BLECharacteristic::PROPERTY_NOTIFY
);
pService->start();
// Start advertising
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
BLEDevice::startAdvertising();
}
void loop() {
String tempe_1 = (String) random(0,9); // ONE DIGIT
String tempe_2 = (String) random(10,90); // TWO DIGITS
String humedit = (String) random(100,200);
// CON CARACTERISTICA 1
String send_data_ch1 = tempe_1 + "," + humedit;
pCharacteristic_1->setValue(send_data_ch1.c_str());
pCharacteristic_1->notify();
// CON CARACTERISTICA 2
String send_data_ch2 = tempe_2 + "," + humedit;
pCharacteristic_2->setValue(send_data_ch2.c_str());
pCharacteristic_2->notify();
int random_delay = random(500,1500);
delay(random_delay);
}
|
_________________________________
- Diseño.
_________________________________
- Bloques.
_________________________________
3.- Un ESP32 recibe datos distintos de varios móviles. Devuelve un aleatorio. Al mismo tiempo.
p110i_esp32_ble_recibe_caracter.aia
- Dos móviles se conectan a la vez a un ESP32. Cada uno envía un mensaje. El mensaje se puede leer en el Monitor Serie. El ESP32 devuelve al móvil un número aleatorio.
- Según pongamos el bloque "WriteStringsWithResponse" o "WriteStrings", devolverá o no el número aleatorio.
_________________________________
- Código para BLE.
BLE_recibe_de_dos.ino |
// Juan A. Villalpando
// http://kio4.com/arduino/160B_Wemos_ESP32_BLE.htm
#include <BLEDevice.h>
#include <BLEServer.h>
BLEServer* pServer = NULL;
BLECharacteristic *pCharacteristic = NULL;
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
BLEDevice::startAdvertising();
};
};
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
String alea = (String) random(1,10000); // Return a random number.
pCharacteristic->setValue(alea.c_str()); // Devuelve un número aleatorio
if (value.length() > 0) {
String valor = "";
for (int i = 0; i < value.length(); i++){
valor = valor + value[i];
}
Serial.println(valor); // Presenta valor.
}
}
};
void setup() {
Serial.begin(115200);
BLEDevice::init("ESP32");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic ->setCallbacks(new MyCallbacks());
pService->start();
// Start advertising
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
BLEDevice::startAdvertising();
}
void loop() {
//
}
|
_________________________________
- Diseño.
_________________________________
- Bloques.
_________________________________
4.- Chat con el ESP32 como servidor.
p110i_esp32_ble_multiconnect_chat.aia
- Vamos a construir un chat utilizando el ESP32 como servidor.
- Un móvil enviará un mensaje al ESP32, ese mensaje retornará a ese móvil, y además se enviará a otro móvil que esté conectado.
- Es decir, el ESP32 será el intermediario de los mensajes, recibirá un mensaje y lo reenviará a todos los móviles conectados a el.
- El reenvío se realiza mediante notificación.
_________________________________
- Código para BLE.
BLE_chat.ino |
// Juan A. Villalpando
// http://kio4.com/arduino/160B_Wemos_ESP32_BLE.htm
#include <BLEDevice.h>
#include <BLEServer.h>
BLEServer* pServer = NULL;
BLECharacteristic *pCharacteristic = NULL;
BLEServer* pServer = NULL;
BLECharacteristic *pCharacteristic = NULL;
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
BLEDevice::startAdvertising();
};
};
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
if (value.length() > 0) {
String valor = "";
for (int i = 0; i < value.length(); i++){
valor = valor + value[i];
}
pCharacteristic->setValue(valor.c_str());
pCharacteristic->notify();
Serial.println(valor); // Presenta valor.
}
}
};
void setup() {
Serial.begin(115200);
BLEDevice::init("ESP32");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic ->setCallbacks(new MyCallbacks());
pService->start();
// Start advertising
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
BLEDevice::startAdvertising();
}
void loop() {
//
}
|
_________________________________
- Diseño.
_________________________________
- Bloques.
_________________________________
5.- Comentarios.
- Con los Clásicos Bluetooth HC-05 y HC-06, no se puede conectar dos dispositivos al mismo tiempo.
_______________________________
|