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 ).