|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  Raspberry Pi Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  AutoIt (Programación) Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

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.

_______________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información