Project geupdate 19 08 2023
Code werd aangepast met automatische reset functie, daar er soms eens problemen kunnen ontstaan met slechte wifi waardoor display geen updates meer krijgt en vaste waardes blijft weergeven.
Nog maar eens een Display project ! We maken dit keer gebruik van een MAX7219 Display met 16 modules, en hierop gaan we volgende dingen projecteren .
Power en Soc Level van Batterij, en onze gegevens van onze digitale meter Injectie en Verbruik !
Voor deze Display aan de praat te krijgen moet je eerdere projecten al gemaakt hebben ander bolt hier niks van !!!!!
Top BMS to ESP32 Oled and Domoticz
en Node Red moet op je Raspberry Pi Staan, om dat deze ervoor zorgt welke gegevens we gaan te zien krijgen !
Wat we nodig hebben, een display en een Wemos D1, alles natuurlijk van bij ali-express !
Het schema, dit is voor al mijn projecten met displays altijd zo !
Voor de bevestiging heb ik ook een printje in elkaar gesoldeerd en een 3D afscherming gemaakt, zodat we het printje makkenlijk kunnen op de display steken zonder teveel draden !
#include <ESP8266WiFi.h>
#include <MD_MAX72xx.h>
#include <SPI.h>#include "EspMQTTClient.h"#include <MD_Parola.h>#include <ESP8266WiFi.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include "EspMQTTClient.h"
#include <MD_Parola.h>
#define MAX_DEVICES 16
/*
#define CLK_PIN D5 // or SCK
#define DATA_PIN D7 // or MOSI
#define CS_PIN D4 // or SS
*/
#define CLK_PIN D5
#define CS_PIN D6
#define DATA_PIN D7
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#include "Font_Data.h"
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
int teller=0; //reset teller
const uint8_t MESG_SIZE = 255;
char curMessage[MESG_SIZE];
char newMessage[MESG_SIZE];
char curMessage1[MESG_SIZE];
char newMessage1[MESG_SIZE];
char curMessage2[MESG_SIZE];
char newMessage2[MESG_SIZE];
char curMessage3[MESG_SIZE];
char newMessage3[MESG_SIZE];
bool newMessageAvailable = false;
#define SPEED_TIME 0
#define PAUSE_TIME 0
EspMQTTClient client(
"Tenda_Spike", // wifi ssid
"johanveerle22", //Wifi paswoord
"192.168.1.19", // MQTT Broker server ip
"spike", // User MQTT Broker // Can be omitted if not needed
"1234", // Paswoord MQTT BrokerCan be omitted if not needed
"MAX7219_DISPLAY4 verbruik", // Client name that uniquely identify your device
1883 // The MQTT port, default to 1883. this line can be omitted
);
void(* resetFunc) (void) = 0; // declare reset fuction at address 0
void setup()
{
Serial.begin(115200);
curMessage[0] = newMessage[0] = '\0';
sprintf(curMessage, ".BE");
sprintf(curMessage1, "Tech");
sprintf(curMessage2, "Spike");
sprintf(curMessage3, "WWW.");
// Initialising the UI will init the display too.
P.begin(4);//4 zones
P.setZone(0, 0, 3); // zone 0 eerste 4 modules van rechts
P.setZone(1, 4, 7); //zone 1 module 5tem8 (linkerkant
P.setZone(2, 8, 10);
P.setZone(3,11, 15);
P.displayAnimate();
// stel intensiteit in per zone ! van 1 tot 15
P.setIntensity (0,1);
P.setIntensity (1,15); // Rode display is veel intenser dan de groene vandaar dit verschil in intensiteit
P.setIntensity (2,1);
P.setIntensity (3,1);
P.displayZoneText(0, curMessage, PA_CENTER, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(1, curMessage1, PA_CENTER, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(2, curMessage2, PA_CENTER, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(3, curMessage3, PA_CENTER, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
delay(1000);
}
void onConnectionEstablished()
{
//ingectie
client.subscribe("leddisplay1/text", [](const String & payload) { // data van NODE RED
sprintf(curMessage1, payload.c_str());
});
//import van net
client.subscribe("leddisplay7/text", [](const String & payload) {
sprintf(curMessage, payload.c_str());
});
//Node Red Soc
client.subscribe("leddisplay14/text", [](const String & payload) { // data van NODE RED
sprintf(curMessage2, payload.c_str());
});
// Node Red stroom
client.subscribe("leddisplay15/text", [](const String & payload) { // data van NODE RED
sprintf(curMessage3, payload.c_str());
});
}
void loop()
{
teller +=1; //reset teller
P.displayAnimate();
client.loop();
P.displayZoneText(0, curMessage, PA_RIGHT, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(1, curMessage1, PA_RIGHT, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(2, curMessage2, PA_RIGHT, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(3, curMessage3, PA_RIGHT, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
delay(500);
Serial.println(curMessage);
Serial.println(curMessage1);
P.displayReset();
//om de 12 uur reset delay is 500
if (teller==86400){
resetFunc(); //call reset
teller=0;
}
Behuizing voor de display, 2 delen over display schuiven en met mini schroefjes vastzetten.