Tras dejar los mandos montados, lo que tenemos que hacer es preparar el programa que van a llevar los mandos y dejarlos listos para jugar con la pantalla LED. Empezamos con la prueba de lectura del potenciómetro. Probamos este sencillo programa:
#define potPin 10
void setup() {
// Init Serial Monitor
Serial.begin(115200);
// Activa patilla del potenciómetro
pinMode(potPin,INPUT);
}
void loop()
{
int valorPot = analogRead(potPin);
Serial.print("Pot:");
Serial.println(valorPot);
delay(500);
}
Estamos usando unos módulos ESP32 de la marca AZDelivery, que son un modelo similar al WROOM pero con algunas diferencias.
Tenemos problemas pues el potenciómetro no nos lee el valor que se mueve. Buscando información, descubrimos que la patilla 10 no está asociada a un conversor analógico-digital, que hace falta para leer el valor del potenciómetro, así que lo cambiamos a la patilla 13 y así funciona, y podemos leer valores del potenciómetro en la pantalla desde 0 a 4095.
Lo siguiente es comunicar los mandos inalámbricos con la pantalla y para ello usamos un modo de comunicación de los microcontroladores Espressif que se llama ESP-NOW, que es mucho más fácil de usar que Bluetooth o Wifi. Este sistema lo tomamos de un magnífico tutorial de random nerd tutorials.
https://randomnerdtutorials.com/esp-now-esp
Entonces lo primero que tenemos que hacer es averiguar la dirección MAC de cada ESP32, con lo que cargamos el programa de prueba que nos lo dice:
#include <WiFi.h>
void setup(){
Serial.begin(115200);
Serial.println();
Serial.print("MAC: ");
Serial.println(WiFi.macAddress());
}
void loop(){
}
Averiguamos las direcciones MAC de los mandos y el servidor central para la pantalla y las anotamos en unos papelitos.
A continuación cargamos el programa de los mandos, que es sencillo, porque es una mezcla del lector del potenciómetro y el de envío de datos por ESP-NOW:
#include <esp_now.h>
#include <WiFi.h>
// Definiciones
#define potPin 13
// Variables globales
// Dirección de la estación base
uint8_t baseAddress[] = {0x80, 0x7D, 0x3A, 0xCB, 0x0E, 0x04};
// Dato de comunicación
typedef struct struct_message {
int pot;
} struct_message;
struct_message myData;
// Función evento de envío de datos
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("\r\nLast Packet Send Status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void setup()
{
// Init Serial Monitor
Serial.begin(115200);
// Activa patilla del potenciómetro
pinMode(potPin,INPUT);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);
// Inicializa ESP-NOW
if (esp_now_init() == ESP_OK)
{
Serial.println("Comunicación ESP-NOW activada");
}
else
{
Serial.println("Error inicializando ESP-NOW");
while (true) delay(1000);
}
// Registra la función de envío de datos
esp_now_register_send_cb(OnDataSent);
// Registra el par
esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, baseAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) == ESP_OK)
{
Serial.println("Conectado a la base");
}
else
{
Serial.println("Fallo en la conexión a la base");
return;
}
}
//////////////////////////////////////////////////
// Programa principal
void loop()
{
int valorPot = analogRead(potPin);
Serial.print("Pot: ");
Serial.println(valorPot);
myData.pot=valorPot;
// Send message via ESP-NOW
esp_err_t result = esp_now_send(baseAddress, (uint8_t *) &myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Sent with success");
}
else {
Serial.println("Error sending the data");
}
delay(500);
}
Deja una respuesta