Терморегулятор DS18B20 + TM1637 (Arduino)

Терморегулятор построен на базе 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; // Расчет температуры и вывод
}

Добавить комментарий

Войти с помощью: