#include <DHT.h>
#include <TM1637Display.h>
#define DHTTYPE DHT21 // Тип датчика (DHT 21)
#define CLK 6 // Пін клоку для TM1637
#define DIO 5 // Пін даних для TM1637
#define RELAY_OFF LOW
#define RELAY_ON HIGH
const int DHT_PINS[] = {7, 8}; // Піни для датчиків DHT
const int RELAY_PINS[] = {1, 2, 3}; // Піни для реле
DHT dht1(DHT_PINS[0], DHTTYPE);
DHT dht2(DHT_PINS[1], DHTTYPE);
TM1637Display display(CLK, DIO);
const int temperatureHigh = 45; // Верхній поріг температур
const int temperatureLow = 35; // Нижній поріг температур
struct RelayState {
int pin;
int state;
};
RelayState relayStates[] = {
{RELAY_PINS[0], RELAY_OFF}, // relayVen1
{RELAY_PINS[1], RELAY_ON}, // relaySvet2
{RELAY_PINS[2], RELAY_ON} // relayMex3
};
int Temp_Svet_Mex1 = 0;
int Temp_Svet_Mex2 = 0; // Оголошення змінних
void setup() {
for (const auto &relayState : relayStates) {
pinMode(relayState.pin, OUTPUT);
digitalWrite(relayState.pin, relayState.state);
}
dht1.begin();
dht2.begin();
display.setBrightness(0x0a); // Налаштування яскравості дисплея (0x00 - найтемніший, 0x0f - найяскравший)
}
void loop() {
delay(2000); // Затримка для датчиків DHT
float temp1 = dht1.readTemperature();
displayTemperature(temp1, 1);
relayControl(temp1, dht2.readTemperature());
delay(2000);
float temp2 = dht2.readTemperature();
displayTemperature(temp2, 2);
relayControl(dht1.readTemperature(), temp2);
}
void displayTemperature(float temperature, int sensorNumber) {
byte tempDigits[] = {
display.encodeDigit(int(temperature) / 10),
display.encodeDigit(int(temperature) % 10)
};
byte tSymbol[] = { 0b01111000 };
display.setSegments(tSymbol, 1, 0);
// Використовуємо правильний символ для відображення числа 2
byte sensorSymbol = (sensorNumber == 1) ? 0b00000110 : B01011011;
display.setSegments(&sensorSymbol, 1, 1);
display.setSegments(tempDigits, 2, 2);
}
void controlRelay(int pin, int state) {
digitalWrite(pin, state);
}
void relayControl(float temp1, float temp2) {
if (temp1 >= temperatureHigh && Temp_Svet_Mex1 == 0) {
controlRelay(relayStates[0].pin, RELAY_ON);
controlRelay(relayStates[1].pin, RELAY_OFF);
Temp_Svet_Mex1 = 1;
}
if (temp2 >= temperatureHigh && Temp_Svet_Mex2 == 0) {
controlRelay(relayStates[0].pin, RELAY_ON);
controlRelay(relayStates[2].pin, RELAY_OFF);
Temp_Svet_Mex2 = 2;
}
if (temp1 <= temperatureLow && Temp_Svet_Mex1 == 1) {
if (Temp_Svet_Mex2 == 0) {
controlRelay(relayStates[0].pin, RELAY_OFF);
controlRelay(relayStates[1].pin, RELAY_ON);
Temp_Svet_Mex1 = 0;
} else if (Temp_Svet_Mex2 == 2) {
controlRelay(relayStates[1].pin, RELAY_ON);
Temp_Svet_Mex1 = 0;
}
}
if (temp2 <= temperatureLow && Temp_Svet_Mex2 == 2) {
if (Temp_Svet_Mex1 == 0) {
controlRelay(relayStates[0].pin, RELAY_OFF);
controlRelay(relayStates[2].pin, RELAY_ON);
Temp_Svet_Mex2 = 0;
} else if (Temp_Svet_Mex1 == 1) {
controlRelay(relayStates[2].pin, RELAY_ON);
Temp_Svet_Mex2 = 0;
}
}
}