#include <WiFi.h>
#include <DHT.h>
#include "time.h"
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include<HardwareSerial.h>
#define MAX_DEVICES 4
#define DATA_PIN 23
#define CLK_PIN 18
#define CS_PIN 5
#define HARDWARE_TYPE MD_MAX72XX:: PAROLA_HW // tente FC16_HW se PAROLA_HW inverter o texto
#define DHTPIN 15
#define DHTTYPE DHT11
// ===== WIFI =====
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset = -10800;
const int dstOffset = 0;
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
DHT dht(DHTPIN, DHTTYPE);
char msg[60];
uint8_t etapa = 0; // 0=hora 1=data 2=sensor
uint16_t pausa = 2000;
textEffect_t efeitoAtual = PA_SCROLL_LEFT;
void setup() {
Serial.begin(115200);
myDisplay.begin();
myDisplay.setIntensity(6);
myDisplay.displayClear();
dht.begin();
// WiFi primeiro
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
// NTP depois
configTime(gmtOffset, dstOffset, ntpServer);
struct tm t;
while (!getLocalTime(&t)) delay(500);
}
void efeito()
{
myDisplay.displayText(msg, PA_CENTER, 50, pausa,efeitoAtual,efeitoAtual);
}
void loop()
{
if (myDisplay.displayAnimate())
{
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
myDisplay.displayText("Erro NTP", PA_CENTER,
50, 1000,
PA_SCROLL_LEFT, PA_SCROLL_LEFT);
myDisplay.displayReset();
return;
}
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// monta a mensagem conforme o turno
switch (etapa) {
case 0: // ── HORA ──────────────────────────
sprintf(msg, "%02d:%02d",
timeinfo.tm_hour,
timeinfo.tm_min);
efeitoAtual = PA_SCROLL_DOWN;
pausa=2000;
break;
case 1: // ── DATA ──────────────────────────
sprintf(msg,"%02d/%02d/%04d",
timeinfo.tm_mday,
timeinfo.tm_mon + 1, // mês começa em 0
timeinfo.tm_year + 1900); // ano desde 1900
efeitoAtual = PA_SCROLL_LEFT;
pausa=0;
break;
case 2: // ── TEMPERATURA
sprintf(msg,"T:%.1fC",temp);
efeitoAtual = PA_FADE;
pausa=1000;
break;
case 3: // ── UMIDADE ──
sprintf(msg," U:%.0f%%",hum);
efeitoAtual = PA_SCROLL_UP;
pausa=1000;
break;
}
// avança para próxima etapa
etapa = (etapa + 1) % 4; // 0 → 1 → 2 → 3 →0 → 1 → 2 →3...
efeito();
}
}