Простой термостат на Arduino и цифровом термодатчике DS18B20

IMGP1240Понадобится : arduino UNO, микросхема MAX 7219 , 7 сегментный индикатор с общим катодом для динамической индикации, переменный резистор на 10 кОм , резистроы на 9,5  и 4,7  кОм, термодатчик DS18B20, макетная плата, провода.
Подробнее о подключении 7 сегментных индикаторов можно прочитать здесь.

С остальным проблем возникнуть не должно , DS18B20 подключается очень просто : у него всего 3 вывода 2 из них питание и собственно выход который не забудьте соединить с плюсом через резистор 4,7 кОма. Выход подключаем на 8 порт ардуино.

DS18 B20 Connection

Кнопка расположена между землёй и 2 портом, Средний вывод переменного резистора подключаем к аналоговому входу A0, 2 оставшихся  к плюсу и минусу.

// 12---1 (MOSI)
// 11---13(CLK)
// 10---12 (CS LOAD)
#include <LedControl.h>
#include <OneWire.h>
#include <DallasTemperature.h>
LedControl lc=LedControl(12,11,10,1);
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float T;        //переменная для хранения температуры
int T1;// переменная текущей температуры
int hist=1;//гистерезис
float Tset;
const int buttonPin1 = 2;//кнопка  режима установки температуры
int ones;
int tens;
int hundreds;
int ones2;
int tens2;
int hundreds2;

void setup() 

{
 
pinMode(13, OUTPUT);
pinMode(buttonPin1, INPUT);
digitalWrite(buttonPin1, HIGH);

lc.clearDisplay(0);// очистить экран
lc.shutdown(0,false);// выключение режима сохранения энергии
lc.setIntensity(0,5);// установка яркости(0~15)
lc.setScanLimit(1, 3); 
sensors.begin(); 
}

void loop(void)
{ 
 
int valrez=analogRead(A0);
Tset= map(valrez,0,1023,100,500);



while(digitalRead(buttonPin1)== LOW)
{
int valrez=analogRead(A0);
Tset=map(valrez,0,1023,100,500);


     
hundreds2 = Tset/100;
tens2=(Tset-hundreds2*100)/10;
ones2=Tset-(hundreds2*100+tens2*10);

lc.setDigit(0,0,hundreds2,false);
lc.setDigit(0,1,tens2,true);  
lc.setDigit(0,3,ones2,false);


delay (100);


}

sensors.requestTemperatures(); // запрос на получение температуры
T=(sensors.getTempCByIndex(0)); 

T1 = T*10;
     
hundreds = T1/100;
tens=(T1-hundreds*100)/10;
ones=T1-(hundreds*100+tens*10);
    
lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true);  
lc.setDigit(0,3,ones,false);

if (T>(Tset/10)+hist)digitalWrite(13, HIGH);
if (T<(Tset/10))digitalWrite(13, LOW );


}

 

Пользоваться термостатом очень просто , при нажатии накнопку экран переключается в режим установки температуры , установка производится переменным резистором , при достижении выставленной температуры + гистерезис ( прописан в скетче как hist и равен по умолчанию 1 градусу) и более , на 13 порт arduino будет подана логическая единица. При падении температуры ниже выставленного значения на 13 порт arduino будет подан логический ноль. Подключив к 13 порту релейный модуль можно управлять охлаждающим вентилятором или нагревателем.

Скачать скетч и библиотеки.

Простой термостат на Arduino и цифровом термодатчике DS18B20: 4 комментария

  1. Александр

    Здравствуйте. Я новичек, поэтому не судите строго. А можно в данном проекте использовать уже готовый дисплей на 4 сигмента на микросхеме TM1637 или чтото подобное? А то на МАХ собранный идет на все 8 сигментов, сильно большой, да и задействовано меньше половины. Заранее благодарен.

    1. E.

      Тоже задался этим вопросом.
      Погуглив, понял что можно. Но так как эти индикаторы на TM1637 заточены под отображение времени, библиотеки от их производителя не совсем подходят для отображения температуры. Однако, в сети я нашёл библиотеку, допиленную «народным умельцем» 🙂 Как дождусь индакатор из китая — буду пробовать.

  2. sg

    Добрый вечер не могу скомпилировать ваш скеч.
    Выдаёт ошибку-

    Arduino: 1.6.12 (Windows XP), Плата:»Arduino/Genuino Uno»

    C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\DallasTemperature\DallasTemperature.cpp:698:54: warning: unused parameter ‘deviceAddress’ [-Wunused-parameter]

    void DallasTemperature::defaultAlarmHandler(uint8_t* deviceAddress)

    C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\DallasTemperature\DallasTemperature.cpp: In member function ‘float DallasTemperature::calculateTemperature(uint8_t*, uint8_t*)’:

    C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\DallasTemperature\DallasTemperature.cpp:456:1: warning: control reaches end of non-void function [-Wreturn-type]

    collect2.exe: error: ld returned 5 exit status

    exit status 1
    Ошибка компиляции для платы Arduino/Genuino Uno.

    Помогите найти причину. Я в Arduino чайник, но хочется научиться.
    За ранее благодарен.

Добавить комментарий для Александр Отменить ответ

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code