#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <DHT.h>
#include <SPI.h>
#include <Wire.h>
#include "Font7Seg.h"
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
#define SPEED_TIME 100
#define PAUSE_TIME 3000
#define MAX_MESG 20
#define DS1307_ADDRESS 0x68
#define DHTPIN 2
#define DHTTYPE DHT22
#define TIMEDHT 2000
uint8_t hours, minutes, seconds;
char szTime[9];
char szMesg[MAX_MESG + 1] = "";
float celsius;
uint32_t timerDHT = 0;
uint32_t timerSerial = 0;
DHT dht(DHTPIN, DHTTYPE);
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
void beginDS1307()
{
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
seconds = bcdToDec(Wire.read());
minutes = bcdToDec(Wire.read());
hours = bcdToDec(Wire.read() & 0x3f);
}
uint8_t decToBcd(uint8_t value)
{
return ((value / 10 * 16) + (value % 10));
}
uint8_t bcdToDec(uint8_t value)
{
return ((value / 16 * 10) + (value % 16));
}
void getTime(char *psz)
{
sprintf(psz, "%02d:%02d", hours, minutes);
}
void getTemperature()
{
if ((millis() - timerDHT) > TIMEDHT) {
timerDHT = millis();
celsius = dht.readTemperature();
}
}
uint16_t calculateChecksum(const char* str)
{
uint16_t checksum = 0;
while (*str)
{
checksum += *str++;
}
return checksum;
}
void setup(void)
{
Wire.begin();
Serial.begin(9600);
P.begin();
P.setInvert(false);
P.setZone(0, MAX_DEVICES - 4, MAX_DEVICES - 1);
P.setZone(1, MAX_DEVICES - 4, MAX_DEVICES - 1);
P.displayZoneText(1, szTime, PA_CENTER, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(0, szMesg, PA_CENTER, SPEED_TIME, PAUSE_TIME, PA_PRINT , PA_NO_EFFECT);
dht.begin();
}
void loop(void)
{
static uint32_t lastTime = 0;
static uint8_t display = 0;
beginDS1307();
getTemperature();
P.displayAnimate();
if (P.getZoneStatus(0))
{
switch (display)
{
case 0:
P.setPause(0, PAUSE_TIME);
P.setTextEffect(0, PA_SCROLL_UP, PA_SCROLL_UP);
display++;
dtostrf(celsius, 4, 1, szMesg);
strcat(szMesg, "C");
break;
case 1:
P.setFont(0, numeric7Seg);
P.setTextEffect(0, PA_SCROLL_UP, PA_SCROLL_UP);
P.setPause(0, PAUSE_TIME);
if ((millis() - lastTime) >= 1000) {
lastTime = millis();
getTime(szMesg);
}
display = 0;
break;
}
P.displayReset(0);
}
if (millis() - timerSerial >= 1000)
{
timerSerial = millis();
char serialMsg[20];
sprintf(serialMsg, ">%02d:%02d+%.1fC<", hours, minutes, celsius);
uint16_t checksum = calculateChecksum(serialMsg);
Serial.print(serialMsg);
Serial.print(" Checksum: ");
Serial.println(checksum);
}
}