#include <SPI.h>
#include <PubSubClient.h>
#include <WiFi.h>
// Configuration WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Configuration MQTT
const char* mqttServer = "mqtt.flespi.io";
const int mqttPort = 1883;
const char* mqttUser = "FlespiToken a2yOt9pFonz7iqQtUYafnWXDiqEwZoZZeoCxlP0z2nw9DasnWqr9bcAjr5Dgjt6m";
//const char* mqttPassword = "flespi/log/mqtt/+/#";
const char* mqttPassword = "";
const char* mqttTopic = "iot/planningLight"; // Le topic MQTT pour recevoir la matrice
// Configuration MAX7219
const byte NOOP = 0x0;
const byte DECODEMODE = 0x9;
const byte INTENSITY = 0xA;
const byte SCANLIMIT = 0xB;
const byte SHUTDOWN = 0xC;
const byte DISPLAYTEST = 0xF;
byte customMatrix[8] = {0}; // Initialisez avec une matrice vide
unsigned char reverse(unsigned char b) {
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
return b;
}
void max7219(byte reg, byte data) {
digitalWrite(SS, LOW);
SPI.transfer(reg);
SPI.transfer(reverse(data));
digitalWrite(SS, HIGH);
}
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
pinMode(SS, OUTPUT);
digitalWrite(SS, HIGH);
SPI.begin();
max7219(SCANLIMIT, 7);
max7219(DECODEMODE, 0);
max7219(INTENSITY, 8);
max7219(DISPLAYTEST, 0);
max7219(SHUTDOWN, 1);
// Abonnez-vous au topic MQTT pour recevoir la matrice
if (client.connect("ESP32Client", mqttUser, mqttPassword)) {
client.subscribe(mqttTopic);
}
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password,6);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
if (strcmp(topic, mqttTopic) == 0) {
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
int index = row * 8 + col;
Serial.print(payload[index]);
Serial.print(" "); // Ajoute un espace entre les éléments
}
Serial.println(); // Passe à la ligne suivante après chaque ligne de la matrice
}
for (int i = 0; i < 8; i++) {
customMatrix[i] = 48;
}
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
int index = row * 8 + col;
if (payload[index] == '0') {
customMatrix[row] &= ~(1 << col); // Réglez le bit à 0
} else if (payload[index] == '1') {
customMatrix[row] |= (1 << col); // Réglez le bit à 1
}
}
}
Serial.println("Contenu du matice binaire:");
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
int index = row * 8 + col;
Serial.print(customMatrix[index]);
Serial.print(" "); // Ajoute un espace entre les éléments
}
Serial.println(); // Passe à la ligne suivante après chaque ligne de la matrice
}
client.publish("acknowledgmentTopic", ""); // Publie un message vide sur le topic "acknowledgmentTopic"
}
}
void out(byte ch[8]) {
for (byte i = 0; i < 8; i++) {
max7219(i + 1, ch[i]);
delay(0);
}
delay(100);
}
void loop() {
if (!client.connected()) {
reconnect();
}
out(customMatrix); // Afficher la matrice personnalisée sur la matrice LED
client.loop();
}
void reconnect() {
Serial.print("Attempting MQTT connection...");
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client", mqttUser, mqttPassword)) {
Serial.println("connected");
//client.subscribe(mqttTopic);
//Serial.print(client.state());
//Serial.print(client.connected());
client.subscribe("acknowledgmentTopic");
if (client.subscribe(mqttTopic,1)) {
Serial.println("Souscription réussie au topic MQTT.");
} else {
Serial.println("Échec de la souscription au topic MQTT.");
}
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}