Buongiorno, dopo mesi di tempo speso a giochicchiare con arduino, sto provando a fare una scritta scorrevole da vetrina con 8 display max7219 collegati fra loro per ottenere un matrice 16x96. Ora sono al punto in cui ne ho messi 2 e ho una matrice 16x32, poi mi basterà collegare gli altri e modificare le zone, ma non capisco perchè non riesco a visualizzare il testo iniziale, allego il codice:
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <WiFi.h>
#include <WebServer.h>
#include "Font_Data.h" // Includi i dati dei font a doppia altezza
// Definisci il tipo di hardware e il numero di moduli
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_ZONES 2
#define ZONE_SIZE 4 // 12 moduli in orizzontale per zona
#define MAX_DEVICES (MAX_ZONES * ZONE_SIZE)
#define ZONE_LOWER 0
#define ZONE_UPPER 1
// bool invertUpperZone = false;
// Alignment of the two zones
#ifdef INVERT_UPPER_ZONE
// if inverted, alignment should be opposite and
// CENTER may not work well depending on message
#define ALIGN_LOWER PA_LEFT
#define ALIGN_UPPER PA_RIGHT
#else
// if not inverted, should always be the same
#define ALIGN_LOWER PA_CENTER
#define ALIGN_UPPER ALIGN_LOWER
#endif
// Definisci i pin di connessione
#define DATA_PIN 23
#define CLK_PIN 18
#define CS_PIN 5
MD_Parola parola = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
// Credenziali WiFi
const char* ssid = "xxxxx";
const char* password = "xxxxxx";
// Server web
WebServer server(80);
// Testo da visualizzare
String scroller = "Ciao Amici!";
String lastScroller = "";
uint16_t scrollSpeed = 50;
textEffect_t effectIn = PA_SCROLL_LEFT;
textEffect_t effectOut = PA_SCROLL_LEFT;
void handleRoot() {
String html = "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>Scroller By AleDre</title><style>body { font-family: Arial, sans-serif; text-align: center; padding: 50px; } input[type='text'] { width: 80%; padding: 10px; font-size: 18px; } input[type='submit'], select { padding: 10px 20px; font-size: 18px; }</style></head><body><h1>Scroller By AleDre</h1><form action=\"/settext\" method=\"POST\"><input type=\"text\" name=\"text\" value=\"" + scroller + "\"><br><br><label for=\"speed\">Speed:</label><select name=\"speed\" id=\"speed\"><option value=\"50\">Fast</option><option value=\"100\" selected>Medium</option><option value=\"150\">Slow</option></select><br><br><label for=\"effect\">Effect:</label><select name=\"effect\" id=\"effect\"><option value=\"0\">Scroll Left</option><option value=\"1\">Scroll Right</option><option value=\"2\">Slice</option><option value=\"3\">Mesh</option></select><br><br><input type=\"submit\" value=\"Set Text\"></form></body></html>";
server.send(200, "text/html", html);
}
void handleSetText() {
if (server.hasArg("text")) {
scroller = server.arg("text");
}
if (server.hasArg("speed")) {
scrollSpeed = server.arg("speed").toInt();
}
if (server.hasArg("effect")) {
int effect = server.arg("effect").toInt();
switch (effect) {
case 0:
effectIn = PA_SCROLL_LEFT;
effectOut = PA_SCROLL_LEFT;
break;
case 1:
effectIn = PA_SCROLL_RIGHT;
effectOut = PA_SCROLL_RIGHT;
break;
case 2:
effectIn = PA_SLICE;
effectOut = PA_SLICE;
break;
case 3:
effectIn = PA_MESH;
effectOut = PA_MESH;
break;
default:
effectIn = PA_SCROLL_LEFT;
effectOut = PA_SCROLL_LEFT;
break;
}
}
Serial.println("Updated text: " + scroller);
Serial.println("Updated speed: " + String(scrollSpeed));
Serial.println("Updated effect: " + String(effectIn));
parola.displayClear();
parola.displayZoneText(ZONE_LOWER, scroller.c_str(), PA_LEFT, scrollSpeed, 0, effectIn, effectOut);
parola.displayZoneText(ZONE_UPPER, scroller.c_str(), PA_LEFT, scrollSpeed, 0, effectIn, effectOut);
parola.synchZoneStart(); // Sincronizza l'inizio dell'animazione delle zone
server.sendHeader("Location", "/");
server.send(303);
}
void setup() {
uint8_t max = 0;
bool invertUpperZone = (HARDWARE_TYPE == MD_MAX72XX::PAROLA_HW || HARDWARE_TYPE == MD_MAX72XX::GENERIC_HW);
Serial.begin(115200);
parola.begin(MAX_ZONES); // Inizializza Parola con 2 zone
// Configura le zone
parola.setZone(ZONE_LOWER, 0, ZONE_SIZE - 1); // Prima riga (moduli 0-3)
parola.setFont(ZONE_LOWER, BigFontLower);
parola.setZone(ZONE_UPPER, ZONE_SIZE, MAX_DEVICES - 1); // Seconda riga (moduli 4-7)
parola.setFont(ZONE_UPPER, BigFontUpper);
// Effetti per la seconda zona
if (invertUpperZone) {
parola.setZoneEffect(ZONE_UPPER, true, PA_FLIP_UD);
parola.setZoneEffect(ZONE_UPPER, true, PA_FLIP_LR);
}
// Doppia altezza --> doppio spaziamento
parola.setCharSpacing(parola.getCharSpacing() * 2);
parola.setIntensity(0); // Imposta la luminosità (0-15)
parola.displayClear();
// Visualizza il messaggio di connessione WiFi in entrambe le zone
parola.displayZoneText(ZONE_LOWER, "Connessione al Wifi...", PA_CENTER, scrollSpeed, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
parola.displayZoneText(ZONE_UPPER, "Connessione al Wifi...", PA_CENTER, scrollSpeed, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
unsigned long start = millis();
while (millis() - start < 20000) { // Visualizza per 20 secondi
if (parola.displayAnimate()) {
parola.displayReset();
}
}
delay(1000); // Breve pausa prima di continuare
// Configura WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Visualizza l'indirizzo IP ottenuto in entrambe le zone
String ipAddress = WiFi.localIP().toString();
Serial.println("IP Address: " + ipAddress);
parola.displayClear();
parola.displayZoneText(ZONE_LOWER, ipAddress.c_str(), PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
parola.displayZoneText(ZONE_UPPER, ipAddress.c_str(), PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
start = millis(); // Restart the timer after the WiFi connection
while (millis() - start < 20000) { // Visualizza per 20 secondi
if (parola.displayAnimate()) {
parola.displayReset();
}
}
// Configura server web
server.on("/", handleRoot);
server.on("/settext", handleSetText);
server.begin();
Serial.println("Web server started");
// Avvia l'animazione con il testo iniziale
parola.displayClear();
//parola.displayZoneText(ZONE_LOWER, scroller.c_str(), PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
//parola.displayZoneText(ZONE_UPPER, scroller.c_str(), PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
parola.displayZoneText(ZONE_LOWER, "TEST!!", PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
parola.displayZoneText(ZONE_UPPER, "TEST!!", PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
//parola.synchZoneStart(); // Sincronizza l'animazione tra le zone
}
void loop() {
// Gestisce la richiesta del server web
server.handleClient();
// Avvia l'animazione in entrambe le zone
if (parola.displayAnimate()) {
parola.displayReset(); // Reset per prepararsi alla prossima animazione
}
// Dopo il reset, avvia nuovamente l'animazione con il testo corrente
parola.displayZoneText(ZONE_LOWER, scroller.c_str(), PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
parola.displayZoneText(ZONE_UPPER, scroller.c_str(), PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
// Sincronizza l'inizio dell'animazione
parola.synchZoneStart(); // Sincronizza l'animazione tra le due zone
}
In questo modo visualizzo il testo CONNESSIONE AL WIFI... e successivamente l'indirizzo IP, ma non parte il testo impostato nella pater finale del void setup, ovvero l'animazione iniziale, sia che imposti un testo, sia che richiami la stringa...
Se qualcuno mi saprà aiutare, grazie in anticipo!!