#include "Segment.h"
#include "DHT.h"
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int segment[] = {2, 3, 4, 5};
uint8_t arrs[] = {6, 7, 8, 9, 10, 11, 12};
SiteSegment seg1(arrs);
int startHours = 15;
int startMinutes = 59;
unsigned long switchMillis = 0;
const long switchInterval = 60000;
const long tempDisplayInterval = 5000;
void intToTime(int timeInt, int& hours, int& minutes) {
hours = timeInt / 100;
minutes = timeInt % 100;
}
String SetNumber(int timeInt) {
int hours, minutes;
intToTime(timeInt, hours, minutes);
char buffer[5];
sprintf(buffer, "%02d%02d", hours, minutes);
return String(buffer);
}
void displayClock() {
unsigned long currentMillis = millis();
int elapsedMinutes = (currentMillis - switchMillis) / 60000;
int totalMinutes = elapsedMinutes % 60;
int displayMinutes = (startMinutes + totalMinutes) % 60;
int displayHours = startHours + (startMinutes + totalMinutes) / 60;
int displayTime = displayHours * 100 + displayMinutes;
String num = SetNumber(displayTime);
for (int i = 2; i < 6; i++) {
seg1.ShowNum(num[i - 2] - '0');
digitalWrite(i, LOW);
digitalWrite(i, HIGH);
}
}
void displayTemperature() {
float temperature = dht.readTemperature();
if (!isnan(temperature)) {
int tempInt = (int)abs(temperature);
seg1.ShowNum(tempInt / 10);
digitalWrite(segment[1], LOW);
digitalWrite(segment[1], HIGH);
seg1.ShowNum(tempInt % 10);
digitalWrite(segment[2], LOW);
digitalWrite(segment[2], HIGH);
int decimalPart = (int)((temperature - tempInt) * 10);
seg1.ShowNum(decimalPart);
digitalWrite(segment[3], LOW);
digitalWrite(segment[3], HIGH);
} else {
Serial.println("Nepodařilo se načíst teplotu ze senzoru DHT!");
}
}
void setup() {
Serial.begin(9600);
dht.begin();
seg1.init();
for (int i : segment) {
pinMode(i, OUTPUT);
digitalWrite(i, HIGH);
}
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - switchMillis >= switchInterval) {
switchMillis = currentMillis;
startMinutes++;
if (startMinutes >= 60) {
startMinutes = 0;
startHours++;
if (startHours >= 24) {
startHours = 0;
}
}
}
if ((currentMillis - switchMillis) < tempDisplayInterval) {
displayTemperature();
} else {
displayClock();
}
delay(100);
}