/*
* LED matrix Clock
* Author: Uncle Da
* Bilibili: https://space.bilibili.com/328004983
* Last Update is 2023-12-28, by uncle da
*/
/*
#ifdef ESP8266
#include <ESP8266WiFi.h>
#endif
#ifdef ESP32
#include <WiFi.h>
#endif
*/
#include <WiFi.h> //#include <ESP8266WiFi.h>
#include <MD_Parola.h> //For MAX7219 Matrix LED
//#include <MD_MAX72xx.h> //For MAX7219 SPI LED Driver
#include <SPI.h> //For SPI Communication
#include <DHT.h>
#include <time.h> //For Time Based Application
#include "Font.h"
#define buzzerPin 13
// These are for the temperature
#define DHTPIN 14
#define DHTTYPE DHT22
float hum, temp;
DHT dht(DHTPIN, DHTTYPE);
char mesg[20] = "";
//********** User Config Setting ******************************/
const char *ssid = "Wokwi-GUEST"; //改成自家WIFI SSID
const char *password = ""; //密码
const char *NTPServer = "ntp.aliyun.com";
const int gmtOffset_sec = 8*3600; //28800
const int daylightOffset_sec = 0; //夏令时
//=====MAX7219================================
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW //一般设备是FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN 18
#define DATA_PIN 23
#define CS_PIN 5
MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
#define SPEED_TIME 70 //数字越小越快,0最快
//=============================================
uint8_t h, m, s;
char szTime[9]; // mm:ss\0
char szData[15]; //日期
char szWeek[10]; //星期
//=============================================
void getTime()
{
time_t now = time(nullptr); //获取当前时间戳
struct tm *timeinfo = localtime(&now); //转为本地时间
h = timeinfo->tm_hour;
m = timeinfo->tm_min;
s = timeinfo->tm_sec;
// 将时间转换为字符串: srtftime(存储产生的结果,最大size,tm中对应的值)
strftime(szTime,9, "%X", timeinfo); //R = HH:MM, X(or T) = HH:MM:SS
strftime(szData,15, "%m-%d", timeinfo); // %Y-%m-%d
//strftime(szData,15, "%F", timeinfo); // F:yyyy-mm-dd ;
strftime(szWeek,10, "%a", timeinfo); //A-英文全称 a-缩写
//sprintf(szTime, "%02d%c%02d", h, (':'), m);
//Serial.println(timeinfo,"%F %T %A");
}
/*
void buff() //获取全部
{
char szBuff[80];
//strftime(szbuff,80, "%Y/%m/%d,%X,%a \n", timeinfo);
h = timeinfo->tm_hour;
m = timeinfo->tm_min;
s = timeinfo->tm_sec;
year = timeinfo->tm_year + 1900;
mon = timeinfo->tm_mon + 1;
day = timeinfo->tm_mday;
*/
// ============SmartConfig 一键配网/自动重连/微信扫码配网====================
void SmartConfig()
{
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig...");
WiFi.beginSmartConfig();
while (1)
{
Serial.print(".");
delay(500);
if (WiFi.smartConfigDone())
{
Serial.println("SmartConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
break;
}
}
}
bool AutoConfig() //上电自动重连
{
//WiFi.begin();
for (int i = 0; i < 20; i++) //如果[20]秒还没连接成功
{
int wstatus = WiFi.status();
if (wstatus == WL_CONNECTED)
{
Serial.println("WIFI SmartConfig Success");
Serial.printf("SSID:%s", WiFi.SSID().c_str());
Serial.printf(", PSW:%s\r\n", WiFi.psk().c_str());
Serial.print("LocalIP:");
Serial.print(WiFi.localIP());
Serial.print(" ,GateIP:");
Serial.println(WiFi.gatewayIP());
return true;
}
else
{
Serial.print("WIFI AutoConfig Waiting......");
Serial.println(wstatus);
delay(1000);
}
}
Serial.println("WIFI AutoConfig Faild!" );
return false;
}
//===================================================
void setup(void)
{
Serial.begin(9600);
delay(100);
P.begin(); //默认1个
P.setInvert(false); //显示屏阴阳显示(false=0=阳显;true=1=反转)
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting to ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
P.displayText("WiFi->",PA_CENTER, 50,3000,PA_SCROLL_UP, PA_SCROLL_DOWN);
while (!P.displayAnimate());
}
Serial.println("WiFi Connected");
delay(2000);
//
getTimeNTP();
if (!AutoConfig())
{
SmartConfig();
}
/*
//=============================================
P.setZone(0, 0, 3);
P.setZone(1, 0, 3);
P.setFont(0, dig3x7);
P.setFont(1, GF4x7p);
//P.setFont(2, GF3x5p);
P.displayZoneText(1, szTime, PA_CENTER, SPEED_TIME, 0, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(0, szData, PA_CENTER, SPEED_TIME, 0, PA_PRINT, PA_NO_EFFECT);
//(滚动效果:显示区域、显示字符串、对齐方式、动画速度、文本显示时间、动画进入效果、动画退出效果)
*/
dht.begin();
}
//=============================================
void loop(void) {
//static uint32_t lastTime = 0; // millis() memory
static uint8_t display = 0; // Current display mode
//static bool flasher = false; // seconds passing flasher
getTime();
if(P.displayAnimate())
{
switch (display)
{
case 0: // Temp
temp = dht.readTemperature();
dtostrf(temp,3,1,mesg);
strcat(mesg,"'c");
P.displayText(mesg,PA_CENTER, SPEED_TIME, 2000, PA_SCROLL_UP_RIGHT, PA_SCROLL_DOWN_RIGHT);
display++;
break;
case 1: // Humidity
hum = dht.readHumidity();
dtostrf(hum,3,0,mesg);
strcat(mesg,"%RH");
P.displayText(mesg, PA_LEFT, SPEED_TIME, 2000, PA_SCROLL_UP, PA_SCROLL_DOWN);
display++;
break;
case 2: // Clock
P.setPause(0, 0);
P.setFont(0, dig3x7);
P.displayZoneText(0,szTime, PA_CENTER, SPEED_TIME, 0, PA_PRINT, PA_NO_EFFECT);
if (s == 30) {
display++;
//P.setTextEffect(0, PA_PRINT, PA_WIPE_CURSOR);
P.setTextEffect(0, PA_PRINT, PA_WIPE);
}
break;
case 3: // Day of week
P.setFont(0, GYD_PHP5X7);
P.displayZoneText(0,szWeek, PA_CENTER, SPEED_TIME, 1000, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
display++;
break;
default: // Calendar
P.displayZoneText(0,szData, PA_CENTER, SPEED_TIME, 1000, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
display = 0;
break;
}
P.displayReset();
}
if ((s == 00) ) { //整点Bee一声(h==0 && m==0 & s==0)
tone(13, 587, 150); // 13引脚, 587Hz, 150毫秒
delay(300);
}
}
//=============================================
void getTimeNTP()
{
configTime(gmtOffset_sec, daylightOffset_sec, NTPServer);
while(!time(nullptr)){
delay(500);
Serial.print(".");
}
Serial.print("NTP Time Update");
}