Терморегулятор построен на базе Arduino Nano, в качестве датчика температуры используется DS18B20 (модуль), информация от текущей температуре и температуре регулирования выводится на семисегментный четырех разрядный индикатор TM1637 (модуль).
Параметры компонентов схемы терморегулятора:
Arduino Nano:
- Микроконтроллер: ATmega328P
- Напряжение питания: 5 В
- Тактовая частота: 16 МГц
- Память Flash: 32 КБ
- Оперативная память (RAM): 2 КБ
- Постоянная память (EEPROM): 1 КБ
- Количество цифровых выводов: 14
- Количество аналоговых входов: 8
- Размеры платы: приблизительно 45 x 18 мм
DS18B20:
- Тип датчика: цифровой датчик температуры
- Измерительный диапазон: от -55°C до +125°C
- Точность измерения: ±0.5°C
- Протокол подключения: 1-Wire
- Питание: 3.0–5.5 В
- Ток потребления: до 1 мА
- Время преобразования: максимум 750 мс (для разрешения 12 бит)
TM1637:
- Устройство: модуль четырёхразрядного семисегментного индикатора
- Соединение: интерфейс 2-wire (2 линии)
- Число символов: 4 разряда
- Цвет свечения: обычно красный, реже зелёный или синий
- Яркость: регулируется программно (8 уровней)
- Напряжение питания: 3.3–5.5 В
- Потребляемый ток: около 0.1 мА в дежурном режиме
- Габаритные размеры: около 45 х 15 мм
Регулировка температуры осуществляется при помощи 2-х кнопок, при нажатии на кнопку температура регулирования выводится на индикатор в течении 2-х секунд, после чего показания индикатора сменяются на текущую температуру.
Основные параметры терморегулятора
- Температура регулирования от 0,0 до 99,9 °С с шагом регулировки 0,1 °С
- Измерение температуры в диапазоне от -55 до 99,9 °С
- Гистерезис 0,5 °С (указан с скетче)
![]() |
![]() |
Скетч
#include <ESP32_TM1637_4LED.h> // http://rcl-radio.ru/wp-content/uploads/2022/01/ESP32_TM1637_4LED.zip #include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip #include <EEPROM.h> ESP32_TM1637_4LED tm(2,3);// CLK, DIO OneWire ds(4); // Вход датчика 18b20 int temper; int reg; bool w; unsigned long times; int gis=5; // гистерезис 0,5 градуса void setup() { delay(100); tm.brig(7); pinMode(5,INPUT_PULLUP);// кнопка + pinMode(6,INPUT_PULLUP);// кнопка - pinMode(13, OUTPUT); // выход реле if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}} reg=EEPROM.read(0)*256+EEPROM.read(1); } void loop() { if(digitalRead(5)==LOW){reg+=1;if(reg>=999){reg=999;}delay(100);times=millis();w=1;} if(digitalRead(6)==LOW){reg-=1;if(reg<=0){reg=0;}delay(100);times=millis();w=1;} temper = dsRead(0)*10; if(millis()-times<=2000){ tm.print(reg,1, 0b0,-1,-1,-1); } else{ if(temper<0){ tm.print(abs(temper/10),0, 0b01111000,0b01000000,-1,-1);} else if(temper>999){tm.print(0,0, 0b01000000,0b01000000,0b01000000,0b01000000);} else{tm.print(temper,1, 0b01111000,-1,-1,-1);} } delay(100); if(reg >= temper + gis){digitalWrite(13,HIGH);} if(reg <= temper - gis){digitalWrite(13,LOW);} if(w==1){EEPROM.update(0, highByte(reg));EEPROM.update(1, lowByte(reg));w=0;} } float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод }



