MD_parola e display max7219

Ciao a tutti, sto facendo una sveglia per il mio comodino che visualizzi l'ora e le temperature interne ed esterne.
sto avendo particolari difficoltà con la libreria MD_parola che sto usando il display. Innanzitutto penso che il mio problema principale nasca tutto dal dividere il display in 2 zone. La superiore dove andrà sempre visualizzato l'orario e l'inferiore dove devono scorrere i vari dati di temperatura e umidità.
Per fare questo utilizzo i comandi di visualizzazione sul display:

if (P.displayAnimate())
    P.displayZoneText(1, buf1, PA_LEFT, P.getSpeed(), P.getPause(), PA_NO_EFFECT, PA_NO_EFFECT);
    
    if (P.displayAnimate())
    P.displayZoneText(0, temperatura , PA_LEFT, P.getSpeed(), P.getPause(), PA_SCROLL_DOWN, PA_SCROLL_DOWN);
    
    if (P.displayAnimate())
    P.displayZoneText(0, umidita , PA_LEFT, P.getSpeed(), P.getPause(), PA_SCROLL_DOWN, PA_SCROLL_DOWN);

ma mi ritrovo con l'orario visualizzato correttamente, il valore di temperatura che ha un'animazione lentissima indifferentemente dal valore "Speed " ( probabilmente perchè ogni aggiornamento dell'animazione è per lei un giro completo di tutto il programma ) e una volta che questa va via ricomincia l'animazione della temperatura mentre l'umidità non esce mai.
Adesso sono un paio di giorni che cerco una soluzione a questo.
Quindi che il programma si blocchi per un attimo fino a quando non sono terminate tutte le animazioni in maniera da non avere animazioni a rallentatore e che tutte siano visualizzate correttamente.
Che strada posso intraprendere secondo voi?
Grazie.

ciao...posta il codice per intero...ad ogni modo ho la sensazione che il problema lo troveremo nell'uso del delay()...

ecco il codice:

#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <RTClib.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include "ThingSpeak.h"
#include <stdio.h>
#include <SPI.h>
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    5
#define MAX_DEVICES 8
#define MAX_ZONES 2
unsigned long weatherStationChannelNumber = 2024221;
const char *ssid     = "Vodafone-casa";
const char *password = "Panda2000punto2001";
WiFiClient  client;
//wifi
int j=0;
//thinghspeak
int statusCode = 0;
int field[8] = {1,2,3,4,5,6,7,8};
char temperatura[5] = "";
char umidita[5] = "";
// Define NTP Client to get time
WiFiUDP ntpUDP;
//scelta server ntp
//NTPClient timeClient(ntpUDP, "pool.ntp.org");
NTPClient timeClient(ntpUDP, "it.pool.ntp.org");
RTC_DS1307 rtc;
//Week Days
String weekDays[7]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//Month names
String months[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
boolean aggiornamento= false;
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

void setup() {  
  // Initialize Serial Monitor
  Serial.begin(115200);  
   //connessione wifi
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("Attempting to connect to SSID: ");
    //Serial.println(SECRET_SSID);
     while((WiFi.status() != WL_CONNECTED) ||(j<50)){    
      WiFi.begin(ssid, password);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
      Serial.print(".");
      delay(500); 
      j++;
    } 
    j=0;
  }
// Initialize a NTPClient to get time
  timeClient.begin();
  // Set offset time in seconds to adjust for your timezone, for example:
  // GMT +1 = 3600
  // GMT +8 = 28800
  // GMT -1 = -3600
  // GMT 0 = 0
  timeClient.setTimeOffset(7200);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
    if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    }
    P.begin(MAX_ZONES); 
    P.setZone(0,0,3);
    P.setZone(1,4,7);   
    P.setSpeed(100);
    P.setPause(1000);
    P.setIntensity(1);  
  ThingSpeak.begin(client); 
}

void loop() {
  //connessione wifi
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("Attempting to connect to SSID: ");
    //Serial.println(SECRET_SSID);
     while((WiFi.status() != WL_CONNECTED) ||(j<50)){    
      WiFi.begin(ssid, password);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
      Serial.print(".");
      delay(500); 
      j++;
    } 
    j=0;
  }
  //fine connessione wifi   
  DateTime now = rtc.now(); 
  char buf1[] = "hh:mm";
  Serial.print("orario aggiornato: ");
  Serial.println(now.toString(buf1));
  //thingspeak
  statusCode = ThingSpeak.readMultipleFields(weatherStationChannelNumber);
   if(statusCode == 200)
    {
      // Fetch the stored data
      float tempesterna  = ThingSpeak.getFieldAsFloat(field[0]); // Field 1
      float  umidi = ThingSpeak.getFieldAsFloat(field[1]); // Field 2      
      dtostrf(tempesterna, 2, 1, temperatura);
      dtostrf(umidi, 2, 1, umidita);
      Serial.print("temperatura esterna: ");
      Serial.println (tempesterna);
      Serial.print("umidita: ");
      Serial.println (umidita);
      //Serial.println("umidità " + String(umidita));
      }
    else{
      Serial.println("Problem reading channel. HTTP error code " + String(statusCode)); 
    }
    if (P.displayAnimate()) 
    P.displayZoneText(1, buf1 , PA_LEFT, P.getSpeed(), P.getPause(), PA_NO_EFFECT, PA_NO_EFFECT);   
    if (P.displayAnimate())
    P.displayZoneText(0, temperatura , PA_LEFT, P.getSpeed(), P.getPause(), PA_SCROLL_DOWN, PA_SCROLL_DOWN);
    if (P.displayAnimate())
    P.displayZoneText(0, umidita , PA_LEFT, P.getSpeed(), P.getPause(), PA_SCROLL_DOWN, PA_SCROLL_DOWN);  
  //ZONE INTENSITA
  //Display.setIntensity(0, 10);
  //Display.setIntensity(1, 10);
}

La lentezza del codice è data che ogni volta deve interrogare thing speak ( ancora non ho implementato la lettura del dht 22 per la temp interna ) e quindi ovviamente ci mette tempo. é vero che posso ovviare a questo facendo una lettura ogni tot minuti con la funzione mills però vorrei sapere se è possibile fermare il programma fino a quando non si completano tutte le animazioni ( visto che l'ultima con la variabile umidità nemmeno parte ).

Ciao
Per cortesia, se togli quelle 80 righe vuote inutili il codice diventa più compatto e più facilmente leggibile, senza dover scorrere continuamente.

Grazie.
Gianluca

ok, ho modificato il codice togliendo le righe vuote...

buongiorno, ho risolto modificando il codice cosi:

switch (stato) {  

      case 0 :
        if (P.displayAnimate()) {
         P.displayZoneText(0, temperaturaest , PA_LEFT, P.getSpeed(), P.getPause(), PA_SCROLL_LEFT, PA_SCROLL_DOWN);
         stato= stato +1;
        Serial.print("caso=0 ");
        }
        break ;
       case 1 :
        if (P.displayAnimate()) {
        P.displayZoneText(0, umiditaest , PA_LEFT, P.getSpeed(), P.getPause(), PA_SCROLL_LEFT, PA_SCROLL_DOWN);
        stato=stato +1;
        Serial.print("caso=1 ");
        }
        break;

        case 2 :
        if (P.displayAnimate()) {
        P.displayZoneText(0, temperaturaint , PA_LEFT, P.getSpeed(), P.getPause(), PA_SCROLL_LEFT, PA_SCROLL_DOWN);
        stato=stato +1;
        Serial.print("caso=2 ");
        }
        break;

        case 3 :
        if (P.displayAnimate()) {
        P.displayZoneText(0, umiditaint , PA_LEFT, P.getSpeed(), P.getPause(), PA_SCROLL_LEFT, PA_SCROLL_DOWN);
        stato=0;
        Serial.print("caso=3 ");
        }
        break;  
    }

adesso però ho un altro problema: dovrei stampare il simbolo dei gradi (c°) e anche il simbolo della casa per discriminare se se la temperatura si riferisce all'interno o all'esterno. Come posso fare?
ps: ho riportato solo il pezzo di codice modificato per evitare ripetizioni inutili.

ciao...forse QUESTO ti può aiutare

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.