/* ***************************
Description of displaying on led matrix
******************************
most bottom row means 2^0 = 1
most top row means 2^7 = 182
pureBinary mode - collumns from the left
day of week number, 1 = Monday, ..., 7 = Sunday
space
year number - 2000
month number
day of month number
hour
minute
second
BCD mode - collumns from the left
hour - tens
hour - ones
space
minute - tens
minute - ones
space
second - tens
second - ones
*******************************
*/
#include <Wire.h>
#include "RTClib.h"
#include <dht.h>
#include <LedControl.h>
// vytvoření instance DS1307 z knihovny RTClib
RTC_DS1307 DS1307;
dht Dht22;
#define Dht22_PIN 2
// vytvoření pole seznamDni s názvy jednotlivých dní
char seznamDni[7][8] = {"pondeli", "utery", "streda", "ctvrtek", "patek", "sobota", "nedele"};
//Max7219
#define pinMaxDIN 10
#define pinMaxCS 11
#define pinMaxCLK 13
#define mojeMat 0
byte sekunda, minuta, hodina, den, mesic, rok, dentydne;
LedControl ledMat=LedControl(pinMaxDIN, pinMaxCLK, pinMaxCS, mojeMat);
void setup () {
// komunikace přes sériovou linku rychlostí 9600 baud
Serial.begin(115200);
//Serial.println("dht22_test.ino");
//Serial.print("LIBRARY VERSION: ");
//Serial.println(DHT_LIB_VERSION);
Serial.println("Startuji!");
Serial.println();
Serial.println();
//Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)\tTime (us)");
ledMat.shutdown(mojeMat,false);
ledMat.setIntensity(mojeMat,1);
ledMat.clearDisplay(mojeMat);
// kontrola připojeného obvodu reálného času
if (! DS1307.begin()) {
Serial.println("Hodiny nejsou pripojeny!");
while (1);
}
// kontrolu spuštění obvodu reálného času
if (! DS1307.isrunning()) {
Serial.println("Hodiny nejsou spusteny! Spoustim nyni..");
}
// pro nastavení času v obvodu reálného času použijte jednorázově(!)
// následující příkaz v pořadí rok, měsíc, den, hodina, minuta, vteřina
// příklad: 26.4.2016 9:10:11
//DS1307.adjust(DateTime(2023, 5, 5, 16, 40, 11));
}
void loop () {
// načtení aktuálního času a data do proměnné datumCas
DateTime datumCas = DS1307.now();
// vypsání informací o aktuálním času a datu po sériové lince
sekunda = datumCas.second();
minuta = datumCas.minute();
hodina = datumCas.hour();
den = datumCas.day();
mesic = datumCas.month();
rok = datumCas.year() - 2000;
dentydne = datumCas.dayOfTheWeek();
if (dentydne == 0) {
dentydne = 7;
}
int chk = Dht22.read22(Dht22_PIN);
float h = Dht22.humidity;
float t = Dht22.temperature;
if (sekunda>=0 && sekunda <=5){
PrintTime();
Serial.print(F("Vlhkost: "));
Serial.print(h);
Serial.print(F("% Teplota: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.println();
Serial.println();
}
if (minuta == 0) {
scrollPlnyCas(rok, mesic, den, hodina, minuta, sekunda, dentydne);
} else if ((minuta > 0) && ((minuta % 15)==0)){
scrolCas(rok, mesic, den, hodina, minuta, sekunda, dentydne);
} else if ((minuta > 0) && ((minuta % 2) > 0)) {
pureBinaryWokWi(sekunda, minuta, hodina, den, mesic, rok, dentydne);
} else {
bcdWokWi(sekunda, minuta, hodina);
}
}
byte swapBits(byte n, byte p1, byte p2)
{ /* Move p1'th to rightmost side */
byte bit1 = (n >> p1) & 1;
/* Move p2'th to rightmost side */
byte bit2 = (n >> p2) & 1;
/* XOR the two bits */
byte x = (bit1 ^ bit2);
/* Put the xor bit back to their original positions */
x = (x << p1) | (x << p2);
/* XOR 'x' with the original number so that the
two sets are swapped */
byte result = n ^ x;
return result;
}
byte flipByte (byte co) {
byte pom1, pom2, pom3, pom4;
pom1 = swapBits(co, 0, 7);
pom2 = swapBits(pom1, 1, 6);
pom3 = swapBits(pom2, 2, 5);
pom4 = swapBits(pom3, 3, 4);
return pom4;
}
void pureBinary(byte sekunda1, byte minuta1, byte hodina1, byte den1, byte mesic1, byte rok1, byte dentydne1) {
ledMat.setRow(mojeMat,7,flipByte(sekunda1));
ledMat.setRow(mojeMat,6,flipByte(minuta1));
ledMat.setRow(mojeMat,5,flipByte(hodina1));
ledMat.setRow(mojeMat,4,flipByte(den1));
ledMat.setRow(mojeMat,3,flipByte(mesic1));
ledMat.setRow(mojeMat,2,flipByte(rok1));
ledMat.setRow(mojeMat,1,0);
ledMat.setRow(mojeMat,0,flipByte(dentydne1));
}
void bcd(byte sekunda1, byte minuta1, byte hodina1) {
byte secdes, secjed, mindes, minjed, hoddes, hodjed;
secdes = sekunda1 / 10;
secjed = sekunda1 - secdes * 10;
mindes = minuta1 / 10;
minjed = minuta1 - mindes * 10;
hoddes = hodina1 / 10;
hodjed = hodina1 - hoddes * 10;
ledMat.setRow(mojeMat,7,flipByte(secjed));
ledMat.setRow(mojeMat,6,flipByte(secdes));
ledMat.setRow(mojeMat,5,0);
ledMat.setRow(mojeMat,4,flipByte(minjed));
ledMat.setRow(mojeMat,3,flipByte(mindes));
ledMat.setRow(mojeMat,2,0);
ledMat.setRow(mojeMat,1,flipByte(hodjed));
ledMat.setRow(mojeMat,0,flipByte(hoddes));
}
void scrollPlnyCas(byte rok1, byte mesic1, byte den1, byte hodina1, byte minuta1, byte sekunda1, byte dentydne1) {
bcd(sekunda1, minuta1, hodina1);
}
void scrolCas(byte rok1, byte mesic1, byte den1, byte hodina1, byte minuta1, byte sekunda1, byte dentydne1) {
pureBinary(sekunda1, minuta1, hodina1, den1, mesic1, rok1, dentydne1);
}
void pureBinaryWokWi(byte sekunda1, byte minuta1, byte hodina1, byte den1, byte mesic1, byte rok1, byte dentydne1) {
ledMat.setRow(mojeMat,0,flipByte(sekunda1));
ledMat.setRow(mojeMat,1,flipByte(minuta1));
ledMat.setRow(mojeMat,2,flipByte(hodina1));
ledMat.setRow(mojeMat,3,flipByte(den1));
ledMat.setRow(mojeMat,4,flipByte(mesic1));
ledMat.setRow(mojeMat,5,flipByte(rok1));
ledMat.setRow(mojeMat,6,0);
ledMat.setRow(mojeMat,7,flipByte(dentydne1));
}
void bcdWokWi(byte sekunda1, byte minuta1, byte hodina1) {
byte secdes, secjed, mindes, minjed, hoddes, hodjed;
secdes = sekunda1 / 10;
secjed = sekunda1 - secdes * 10;
mindes = minuta1 / 10;
minjed = minuta1 - mindes * 10;
hoddes = hodina1 / 10;
hodjed = hodina1 - hoddes * 10;
ledMat.setRow(mojeMat,0,flipByte(secjed));
ledMat.setRow(mojeMat,1,flipByte(secdes));
ledMat.setRow(mojeMat,2,0);
ledMat.setRow(mojeMat,3,flipByte(minjed));
ledMat.setRow(mojeMat,4,flipByte(mindes));
ledMat.setRow(mojeMat,5,0);
ledMat.setRow(mojeMat,6,flipByte(hodjed));
ledMat.setRow(mojeMat,7,flipByte(hoddes));
}
void PrintTime() {
Serial.print(seznamDni[dentydne - 1]);
Serial.print(", ");
Serial.print(den);
Serial.print(".");
Serial.print(mesic);
Serial.print(".");
Serial.print(rok);
Serial.print(" ");
Serial.print(hodina);
Serial.print(":");
Serial.print(minuta);
Serial.print(":");
Serial.println(sekunda);
}