/**
ESP32 + DHT22 Example for Wokwi
https://wokwi.com/arduino/projects/322410731508073042
*/
#include <esp_now.h>
#include <PubSubClient.h>
#include <WiFi.h>
const int pot = 33;
static char strpot[10] = {0};
char clientId[50];
// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t broadcastAddress[] = {0x24,0x0A,0xC4,0x00,0x01,0x10};
// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
char a[32];
int b;
float c;
bool d;
} struct_message;
// Create a struct_message called myData
struct_message myData;
esp_now_peer_info_t peerInfo;
// callback when data is sent
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");
}
//1-declarer le topic
#define TOPIC_PUBLISH_POT "topic_sensor_potentiometre"
//2-configuration du point d accés
const char* ssid = "Wokwi-GUEST";
const char* password = "";
//3-configuration du broker EMQX PORT 1883
const char* mqttServer = "broker.emqx.io";
int port = 1883;
//4-configuration d un clien mqtt (publisher)
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long publishUpdate;
#define PUBLISH_DELAY 2000 //envoi chaque 2s
void setup() {
Serial.begin(115200);
pinMode(pot, INPUT);
// 5-initialisation du wifi
initWiFi();
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
esp_now_register_send_cb(OnDataSent);
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}
// 6-initialisation du broker mqtt
initMQTT();
}
void initWiFi(void)
{
delay(10);
Serial.println("------cnx WI-FI------");
Serial.print("Cnx ready: ");
Serial.println(ssid);
Serial.println("ok");
//reconnection en cas de perte de connexion
reconnectWiFi();
}
void initMQTT(void)
{
client.setServer(mqttServer, port);
}
//en cas de probleme de connexion
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (client.connect(clientId)) {
Serial.print(clientId);
Serial.println(" connected");
//client.subscribe("topicName/led");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
//
void checkWiFIAndMQTT(void)
{
if (!client.connected())
reconnectMQTT();
reconnectWiFi();
}
void reconnectWiFi(void)
{
if (WiFi.status() == WL_CONNECTED)
return;
WiFi.begin(ssid, password); // Conecta na rede WI-FI
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("Cnx success ");
Serial.print(ssid);
Serial.println("IP adresse: ");
Serial.println(WiFi.localIP());
}
void loop() {
//lire la valeur du pot
int val=analogRead(pot);
int v=map(val,0,4095,0,255);
Serial.println(v);
//si la valeur actuelle "millis" depasse un delay de 2s"publishUpdate" on fait un update
if ((millis() - publishUpdate) >= PUBLISH_DELAY) {
publishUpdate = millis();
//verifier la connexion avant l envoie
checkWiFIAndMQTT();
// convertir la valeur de float en chaine
sprintf(strpot, "%d", v);
// envoie de la valeur vers le topic MQTT
client.publish(TOPIC_PUBLISH_POT, strpot);
client.loop();
}
strcpy(myData.a, "THIS IS A CHAR");
myData.b = random(1,20);
myData.c = 1.2;
myData.d = false;
// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Sent with success");
}
else {
Serial.println("Error sending the data");
}
delay(2000);
}