Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Ajustem el color d'un NeoPixel des d'una aplicació d'App Inventor

En aquest exemple farem una aplicació d'App Inventor amb la que seleccionarem el valor de les tres components del color d'un NeoPixel i les enviarem al microcontrolador mitjançant Bluetooth. Recomanem haver mirat abans l'exemple anterior.

Suposarem que es disposa d'uns coneixements mínims sobre l'entorn App Inventor 2; si no és així, en aquest espai web es pot trobar un tutorial i exemples. Atès que el nostre objectiu és l'ús de Bluetooth per fer aplicacions d'IoT, no ens entretindrem gaire en personalitzar l'aplicació (colors, posició dels elements, etc.). L'aspecte visual de l'aplicació, amb uns mínims coneixements d'App Inventor, és fàcil de modificar.

Començarem per un programa senzill i després li farem algunes millores. El programa per al microcontrolador és el següent:

#include <ArduinoBLE.h>
#include <Adafruit_NeoPixel.h>
const char* devUuid = "0000FFE0-0000-1000-8000-00805F9B34FB";
const char*  R_Uuid = "0000FFE1-0000-1000-8000-00805F9B34FB";
const char*  G_Uuid = "0000FFE2-0000-1000-8000-00805F9B34FB";
const char*  B_Uuid = "0000FFE3-0000-1000-8000-00805F9B34FB";
String RR, GG, BB;
byte R = 0;
byte G = 0;
byte B = 0;
BLEService Serv(devUuid); 
BLEStringCharacteristic CharacterR(R_Uuid, BLERead | BLEWrite, 512);
BLEStringCharacteristic CharacterG(G_Uuid, BLERead | BLEWrite, 512);
BLEStringCharacteristic CharacterB(B_Uuid, BLERead | BLEWrite, 512);
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(1, 1, NEO_GRB + NEO_KHZ800);
void setup() {
  Serial.begin(9600);
  while (!Serial);  // Espera que s'activi el canal sèrie
  if (!BLE.begin()) {  // Inicialitza BLE
    Serial.println("BLE ha fallat");
    while (1);
  } else {
    Serial.println("BLE inicialitzat");
  }
  // Dona el nom que serà visible
  BLE.setLocalName("MKR Wi-Fi 1010");
  BLE.setAdvertisedService(Serv);
  // Afegeix la característica
  Serv.addCharacteristic(CharacterR);
  Serv.addCharacteristic(CharacterG);
  Serv.addCharacteristic(CharacterB);
  // Activa el servei
  BLE.addService(Serv);
  // Inicialitza el valor per a la característica
  CharacterR.writeValue("0");
  CharacterG.writeValue("0");
  CharacterB.writeValue("0");
  // Fa el dispositiu visible
  BLE.advertise();
  cadena.begin();  // Inicialitza els NeoPixels        
  cadena.show();
}
void loop() {
  // Definim l'element que controla la connexió
  BLEDevice central = BLE.central();
  // Si hi ha un element central connectat
  if (central) {
    Serial.print("Connectat a l'element central ");
    // Agafa l'adreça MAC
    Serial.println(central.address());
    // Instruccions que es faran mentre es mantingui la connexió
    while (central.connected()) {
      // Si detecta que ens han enviat una comanda
      if (CharacterR.written()) {
        RR = CharacterR.value();
        Serial.print(F("R:  "));
        Serial.println(RR);
        R = (byte)RR.toInt();
        cadena.setPixelColor(0, R, G, B);
        cadena.show();
      }
      if (CharacterG.written()) {
        GG = CharacterG.value();
        Serial.print(F("G:  "));
        Serial.println(GG);
        G = (byte)GG.toInt();
        cadena.setPixelColor(0, R, G, B);
        cadena.show();
      }
      if (CharacterB.written()) {
        BB = CharacterB.value();
        Serial.print(F("B:  "));
        Serial.println(BB);
        B = (byte)BB.toInt();
        cadena.setPixelColor(0, R, G, B);
        cadena.show();
      }
    }
    // Si es desconnecta
    Serial.print(F("Desconnectat a l'element central "));
    Serial.println(central.address());
  }
}

Abans de començar a crear l'aplicació, hem de tenir en compte que les funcions per a BLE de l'App Inventor no estan incorporades directament a l'entorn i, per tant, les haurem d'afegir. Un cop estiguem dins de la pantalla de disposició dels elements de l'App Inventor, picarem sobre Extension (a la part inferior del menú de l'esquerra) i farem clic a Import extension. En la finestra que s'obre, picarem URL i en el requadre escriurem l'adreça de l'extensió

http://iot.App Inventor.mit.edu/assets/resources/edu.mit.App Inventor.ble-20181124.aix

També podem descarregar l'extensió al nostre ordinador i carregar-la des d'allà.

La pantalla de l'aplicació contindrà els següents elements:

Propietat Valor Comentaris
Nom Screen1 Aquest nom ja està posat a l'inici i no es pot canviar

Propietat Valor Comentaris
Nom Label_info Aquest nom l'hem de posar en el requadre Components
Width Fill parent
Text Pica Scan per buscar dispositius

Propietat Valor Comentaris
Nom HorizontalArrangement1 Aquest nom l'hem de posar en el requadre Components
AlignVertical Center
Width Fill parent

Propietat Valor Comentaris
Nom Button_scan Aquest nom l'hem de posar en el requadre Components
Text Scan

Propietat Valor Comentaris
Nom ListPicker_conn Aquest nom l'hem de posar en el requadre Components
Text Connect

Propietat Valor Comentaris
Nom Button_enviar Aquest nom l'hem de posar en el requadre Components
Text Envia

Propietat Valor Comentaris
Nom Label_color Aquest nom l'hem de posar en el requadre Components
Text 0\n0\n0
BackgroundColor White
TextAlignment Center
Width 25 %

Propietat Valor Comentaris
Nom VerticalArrangement1 Aquest nom l'hem de posar en el requadre Components
AlignHorizontal Center
Width Fill parent

Propietat Valor Comentaris
Nom SliderR Aquest nom l'hem de posar en el requadre Components
ColorLeft Red
Width 90 %
MaxValue 255.0
MinValue 0.0
ThumbPosition 0.0

Propietat Valor Comentaris
Nom SliderG Aquest nom l'hem de posar en el requadre Components
ColorLeft Green
Width 90 %
MaxValue 255.0
MinValue 0.0
ThumbPosition 0.0

Propietat Valor Comentaris
Nom SliderB Aquest nom l'hem de posar en el requadre Components
ColorLeft Blue
Width 90 %
MaxValue 255.0
MinValue 0.0
ThumbPosition 0.0

Propietat Valor Comentaris
Nom BluetoothLE1 Aquest nom l'hem de posar en el requadre Components

La presentació dels elements serà la següent:

Disposició dels elements

El programa és el següent:

Programa
Programa
Programa

A l'hora d'emprar l'aplicació, primer haurem de picar el botó Scan i esperar que ens indiqui que ha trobat dispositius. Llavors picarem el botó Connect i triarem el nostre dispositiu. Un cop connectats, podem fer servir els controlas lliscants per ajustar el color, que podrem enviar amb el botó Envia.

A l'hora de provar el programa del microcontrolador, hem de tenir en compte que aquest no s'iniciarà fins que no obrim el monitor sèrie. Així ens assegurem que no perdem cap informació. Si no ens interessa aquest bloqueig, haurem de suprimir la línia que hem marcat en color.

En el programa anterior fèiem servir tres característiques per enviar els colors. En el programa següent ho farem amb una sola característica i enviarem el color en el típic format de sis dígits hexadecimals. Tant en l'App Inventor com en el microcontrolador crearem una funció per facilitar la conversió. El programa del microcontrolador és el següent:

#include <ArduinoBLE.h>
#include <Adafruit_NeoPixel.h>
const char* devUuid = "0000FFE0-0000-1000-8000-00805F9B34FB";
const char* charUuid = "0000FFE1-0000-1000-8000-00805F9B34FB";
String color;
byte R = 0;
byte G = 0;
byte B = 0;
BLEService Serv(devUuid); 
BLEStringCharacteristic Character(charUuid, BLERead | BLEWrite, 512);
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(1, 1, NEO_GRB + NEO_KHZ800);
void setup() {
  Serial.begin(9600);
  while (!Serial);  // Espera que s'activi el canal sèrie
  if (!BLE.begin()) {  // Inicialitza BLE
    Serial.println("BLE ha fallat");
    while (1);
  } else {
    Serial.println("BLE inicialitzat");
  }
  // Dona el nom que serà visible
  BLE.setLocalName("MKR Wi-Fi 1010");
  BLE.setAdvertisedService(Serv);
  // Afegeix la característica
  Serv.addCharacteristic(Character);
  // Activa el servei
  BLE.addService(Serv);
  // Inicialitza el valor per a la característica
  Character.writeValue("000000");
  // Fa el dispositiu visible
  BLE.advertise();
  cadena.begin();  // Inicialitza els NeoPixels        
  cadena.show();
}
void loop() {
  // Definim l'element que controla la connexió
  BLEDevice central = BLE.central();
  // Si hi ha un element central connectat
  if (central) {
    Serial.print("Connectat a l'element central ");
    // Agafa l'adreça MAC
    Serial.println(central.address());
    // Instruccions que es faran mentre es mantingui la connexió
    while (central.connected()) {
      // Si detecta que ens han enviat una comanda
      if (Character.written()) {
        color = Character.value();
        color.toUpperCase();
        Serial.print(F("Rebut:  "));
        Serial.println(color);
        R = ASCIItoNum(color[0]);
        R = 16 * R + ASCIItoNum(color[1]);
        G = ASCIItoNum(color[2]);
        G = 16 * G + ASCIItoNum(color[3]);
        B = ASCIItoNum(color[4]);
        B = 16 * B + ASCIItoNum(color[5]);
        cadena.setPixelColor(0, R, G, B);  // Pixel 0 verd
        cadena.show();
      }
    }
    // Si es desconnecta
    Serial.print(F("Desconnectat a l'element central "));
    Serial.println(central.address());
  }
}
char ASCIItoNum(char lletra){
  char resp = 0;
  if ((lletra > 47) && (lletra < 58)){
    resp = lletra - 48;
  }
  if ((lletra > 64) && (lletra < 71)){
    resp = lletra - 65 + 10;
  }
  return resp;
}

Pel que fa a l'App Inventor, la distribució dels components serà la mateixa i només canviarà el programa.

Programa
Programa
Programa

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.