Использование термостата в проектах на arduino

Примеры работы для Arduino

Один датчик

Рассмотрим простой пример — подключения одного датчика.

Сенсор подключается к управляющей плате через один сигнальный пин.
При подключении к Arduino в компактном формфакторе, например Arduino Micro или Iskra Nano Pro, воспользуйтесь макетной платой и парочкой нажимных клеммников.

Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.


При коммуникации сенсора со стандартными платами Arduino формата Rev3, Arduino Uno или Iskra Neo, используйте Troyka Slot Shield совместно с модулем подтяжки.

Код программы

Выведем температуру сенсора в Serial-порт.

simple.ino
// библиотека для работы с протоколом 1-Wire
#include <OneWire.h>
// библиотека для работы с датчиком DS18B20
#include <DallasTemperature.h>
 
// сигнальный провод датчика
#define ONE_WIRE_BUS 5
 
// создаём объект для работы с библиотекой OneWire
OneWire oneWire(ONE_WIRE_BUS);
 
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensor(&oneWire);
 
void setup(){
  // инициализируем работу Serial-порта
  Serial.begin(9600);
  // начинаем работу с датчиком
  sensor.begin();
  // устанавливаем разрешение датчика от 9 до 12 бит
  sensor.setResolution(12);
}
 
void loop(){
  // переменная для хранения температуры
  float temperature;
  // отправляем запрос на измерение температуры
  sensor.requestTemperatures();
  // считываем данные из регистра датчика
  temperature = sensor.getTempCByIndex();
  // выводим температуру в Serial-порт
  Serial.print("Temp C: ");
  Serial.println(temperature);
  // ждём одну секунду
  delay(1000);
}

Серия датчиков

Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.

Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.

Код программы

Просканируем все устройства на шине и выведем температуру каждого сенсора отдельно в Serial-порт.

multipleSensors.ino
// библиотека для работы с протоколом 1-Wire
#include <OneWire.h>
// библиотека для работы с датчиком DS18B20
#include <DallasTemperature.h>
 
// сигнальный провод датчика
#define ONE_WIRE_BUS 5
 
// создаём объект для работы с библиотекой OneWire
OneWire oneWire(ONE_WIRE_BUS);
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire);
// создаём указатель массив для хранения адресов датчиков
DeviceAddress *sensorsUnique;
// количество датчиков на шине
int countSensors;
 
// функция вывода адреса датчика
void printAddress(DeviceAddress deviceAddress){
  for (uint8_t i = ; i < 8; i++){
    if (deviceAddressi < 16) Serial.print("0");
    Serial.print(deviceAddressi, HEX);
  }
}
 
void setup(){
  // инициализируем работу Serial-порта
  Serial.begin(9600);
  // ожидаем открытия Serial-порта
  while(!Serial);
  // начинаем работу с датчиком
  sensors.begin();
  // выполняем поиск устройств на шине
  countSensors = sensors.getDeviceCount();
  Serial.print("Found sensors: ");
  Serial.println(countSensors);
  // выделяем память в динамическом массиве под количество обнаруженных сенсоров
  sensorsUnique = new DeviceAddresscountSensors;
 
  // определяем в каком режиме питания подключены сенсоры
  if (sensors.isParasitePowerMode()) {
    Serial.println("Mode power is Parasite");
  } else {
    Serial.println("Mode power is Normal");
  }
 
  // делаем запрос на получение адресов датчиков
  for (int i = ; i < countSensors; i++) {
    sensors.getAddress(sensorsUniquei, i);
  }
  // выводим полученные адреса
  for (int i = ; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Address: ");
    printAddress(sensorsUniquei);
    Serial.println();
  }
  Serial.println();
  // устанавливаем разрешение всех датчиков в 12 бит
  for (int i = ; i < countSensors; i++) {
    sensors.setResolution(sensorsUniquei, 12);
  }
}
 
void loop(){
  // переменная для хранения температуры
  float temperature10;
  // отправляем запрос на измерение температуры всех сенсоров
  sensors.requestTemperatures();
  // считываем данные из регистра каждого датчика по очереди
  for (int i = ; i < countSensors; i++) {
    temperaturei = sensors.getTempCByIndex(i);
  }
  // выводим температуру в Serial-порт по каждому датчику
  for (int i = ; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Temp C: ");
    Serial.print(temperaturei);
    Serial.println();
  }
  Serial.println();
  // ждём одну секунду
  delay(1000);
}

Исходный код программы

Полный код программы представлен в конце статьи, здесь же сначала рассмотрим его наиболее важные фрагменты.

Для выполнения математических операций в программе мы должны подключить заголовочный файл библиотеки “#include <math.h>”, а для работы с ЖК дисплеем – подключить библиотеку “#include <LiquidCrystal.h>». Далее в функции setup() мы должны инициализировать ЖК дисплей.

Arduino

Void setup(){
lcd.begin(16,2);
lcd.clear();
}

1
2
3
4

Voidsetup(){

lcd.begin(16,2);

lcd.clear();

}

Значение температуры мы будем рассчитывать в программе с помощью рассмотренного выше уравнения Стейнхарта-Харта.

Arduino

float a = 1.009249522e-03, b = 2.378405444e-04, c = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) {
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Stein-Hart
Tc = T — 273.15; // переводим температуру из кельвинов в градусы Цельсия
Tf = (Tc * 1.8) + 32.0; // переводим температуру в шкалу Фаренгейта
return T;
}

1
2
3
4
5
6
7
8
9

floata=1.009249522e-03,b=2.378405444e-04,c=2.019202697e-07;

floatT,logRt,Tf,Tc;

floatThermistor(intVo){

logRt=log(10000.0*((1024.0Vo-1)));

T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Stein-Hart

Tc=T-273.15;// переводим температуру из кельвинов в градусы Цельсия

Tf=(Tc*1.8)+32.0;// переводим температуру в шкалу Фаренгейта

returnT;

}

Также в программе мы считываем значение с аналогового входа платы Arduino.

Arduino

lcd.print((Thermistor(analogRead(0))));

1 lcd.print((Thermistor(analogRead())));

Внешний вид работы нашего проекта показан на следующем рисунке – на ЖК дисплее выводятся значения температуры в кельвинах, градусах Цельсия и по шкале Фаренгейта.

Схему можно запитать по кабелю USB или использовать адаптер на 12 В.

Далее представлен полный текст программы.

Arduino

#include <math.h>
#include «LiquidCrystal.h»
LiquidCrystal lcd(44,46,40,52,50,48);
float A = 1.009249522e-03, B = 2.378405444e-04, C = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) { // функция для расчета значения температуры
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt)); // рассчитываем значение температуры в кельвинах по формуле Стейнхарта-Харта
Tc = T — 273.15; // переводим температуру из кельвинов в градусы
Tf = (Tc * 1.8) + 32.0; // переводим температуру в шкалу Фаренгейта
return T;
}
void setup(){
lcd.begin(16,2);
lcd.clear();
}
void loop()
{
lcd.setCursor(0,0);
lcd.print(«Temp:»);
lcd.print((Thermistor(analogRead(0))));
lcd.print(«k «);

lcd.setCursor(0,1);
lcd.print((Tc));
lcd.print(» C ;»);
lcd.setCursor(9,1);
lcd.print((Tf));
lcd.print(» F»);
delay(800);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

#include <math.h>
#include «LiquidCrystal.h»

LiquidCrystallcd(44,46,40,52,50,48);

floatA=1.009249522e-03,B=2.378405444e-04,C=2.019202697e-07;

floatT,logRt,Tf,Tc;

floatThermistor(intVo){// функция для расчета значения температуры

logRt=log(10000.0*((1024.0Vo-1)));

T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Стейнхарта-Харта

Tc=T-273.15;// переводим температуру из кельвинов в градусы

Tf=(Tc*1.8)+32.0;// переводим температуру в шкалу Фаренгейта

returnT;

}

voidsetup(){

lcd.begin(16,2);

lcd.clear();

}

voidloop()

{

lcd.setCursor(,);

lcd.print(«Temp:»);

lcd.print((Thermistor(analogRead())));

lcd.print(«k «);

lcd.setCursor(,1);

lcd.print((Tc));

lcd.print(» C ;»);

lcd.setCursor(9,1);

lcd.print((Tf));

lcd.print(» F»);

delay(800);

}

Видеоинструкция

Внимание!

Работа с высоким напряжением опасна для вашего здоровья и жизни.
На плате существуют области, прикосновение к которым приведёт к поражению электрическим током. Это винты контактных колодок и места пайки выводов контактных колодок и реле. Не работайте с платой, если она подключена к бытовой сети. Для готового устройства используйте изолированный корпус.

Если вы сомневаетесь как подключить к реле электроприбор, работающий от общей сети 220 В и у вас есть сомнения, вопросы на тему того как это делается, остановитесь: вы можете устроить пожар или убить себя. Убедитесь, что у вас в голове — кристальное понимание принципа работы устройства и опасностей, которые связаны с высоким напряжением.

Библиотека OneWire для работы с DS18B20

DS18B20 использует для обмена информацией с ардуино протокол 1-Wire, для которого уже написана отличная библиотека. Можно и нужно использовать ее, чтобы не реализовывать все функции вручную. Скачать OneWire можно здесь. Для установки библиотеки скачайте архив, распакуйте в папку library вашего каталога Arduino. Подключается библиотека с помощью команды #include <OneWire.h>

Основные команды библиотеки OneWire:

  • search(addressArray) – ищет температурный датчик, при нахождении в массив addressArray записывается его код, в ином случае – false.
  • reset_search() – производится поиск на первом приборе.
  • reset() – выполнение сброса шины перед тем, как связаться с устройством.
  • select(addressArray) – выбирается устройство после операции сброса, записывается его ROM код.
  • write(byte) – производится запись байта информации на устройство.
  • write(byte, 1) – аналогично write(byte), но в режиме паразитного питания.
  • read() – чтение байта информации с устройства.
  • crc8(dataArray, length) – вычисление CRC кода. dataArray – выбранный массив, length – длина кода.

Важно правильно настроить режим питания в скетче. Для паразитного питания в строке 65 нужно записать ds.write(0x44, 1);

Для внешнего питания в строке 65 должно быть записано ds.write(0x44).

Write позволяет передать команду на термодатчик. Основные команды, подаваемые в виде битов:

  • 0x44 – измерить температуру, записать полученное значение в SRAM.
  • 0x4E – запись 3 байта в третий, четвертый и пятый байты SRAM.
  • 0xBE – последовательное считывание 9 байт SRAM.
  • 0х48 – копирование третьего и четвертого байтов SRAM в EEPROM.
  • 0xB8 – копирование информации из EEPROM в третий и четвертый байты SRAM.
  • 0xB4 – возвращает тип питания (0 – паразитное, 1 – внешнее).

Скетч

climate-controlSPI.ino
// библиотека для работы с датчиком DHT11
#include <TroykaDHT.h>
// Подключаем библиотеку для работы с дисплеем
#include <QuadDisplay2.h>
 
// номер цифрового пина реле 1
#define RELAY_1_PIN  A4
// номер цифрового пина реле 2
#define RELAY_2_PIN  A2
 
// создаём объект класса DHT11 и передаём номер пина к которому подключён датчик
DHT dht(4, DHT11);
 
QuadDisplay qd(9);
 
// переменная для хранения состояние системы
// а именно какую информацию выводить на дисплей
// температуру или влажность
bool state = true;
 
// переменная для хранения показателя температуры окружающей среды
float temperature = ;
// переменная для хранения показателя влажности окружающей среды
float humidity = ;
 
long currentMillis = ;
void setup()
{
  // открываем последовательный порт для мониторинга действий в программе
  Serial.begin(9600);
  qd.begin();
  // начало работы с датчиком DHT11
  dht.begin();
  // назначаем 2 пина в режиме выхода
  pinMode(RELAY_1_PIN, OUTPUT);
  pinMode(RELAY_2_PIN, OUTPUT);
  currentMillis = millis();
}
 
void loop()
{
 
  // если прошёл заданный интервал времени 
  // считывам показания датчика
  if (millis() - currentMillis > 3000) {
    state = !state;
    currentMillis = millis();
    dht.read();
  }
 
  switch (dht.getState()) {
    // всё OK
    case DHT_OK
      // считываем показания температуры и влажности с датчика
      temperature = dht.getTemperatureC();
      humidity = dht.getHumidity();
      // выводим показания температуры или влажности
      // переключать результаты можно кнопкой
      if (state) {
        qd.displayTemperatureC(temperature);
      } else {
        qd.displayHumidity(humidity);
      }
      break;
    // если ошибка выводим на дисплей «Err»
    default
      qd.displayDigits(QD_NONE, QD_E, QD_r, QD_r);
      break;
  }
  // если температура превысила 35 градусов
  if (temperature > 35) {
    // включаем реле 1
    digitalWrite(RELAY_1_PIN, HIGH);
  } else {
    // иначе выключаем реле
    digitalWrite(RELAY_1_PIN, LOW);
  }
  // если влажность стала менее 20 %
  if (humidity < 20) {
    // включаем реле 2
    digitalWrite(RELAY_2_PIN, HIGH);
  } else {
    // иначе выключаем реле 2
    digitalWrite(RELAY_2_PIN, LOW);
  }
  // ждём 1 секунду
  delay(1000);
}

Часто задаваемые вопросы

  • Как установить библиотеку

Да, модуль можно использовать, но скетч, библиотеки и схема сборки отличаются.

Вставьте QuadDisplay в левый нижний слот

climate-control.ino
// библиотека для работы с датчиком DHT11
#include <TroykaDHT.h>
// Подключаем библиотеку для работы с дисплеем
#include <QuadDisplay.h>
 
// номер цифрового пина реле 1
#define RELAY_1_PIN  A4
// номер цифрового пина реле 2
#define RELAY_2_PIN  A2
// номер цифрового пина дисплея
#define DISPLAY_PIN  11
 
// создаём объект класса DHT11 и передаём номер пина к которому подключён датчик
DHT dht(4, DHT11);
 
// переменная для хранения состояние системы
// а именно какую информацию выводить на дисплей
// температуру или влажность
bool state = true;
 
// переменная для хранения показателя температуры окружающей среды
float temperature = ;
// переменная для хранения показателя влажности окружающей среды
float humidity = ;
 
long currentMillis = ;
void setup()
{
  // открываем последовательный порт для мониторинга действий в программе
  Serial.begin(9600);
  // начало работы с датчиком DHT11
  dht.begin();
  // назначаем 2 пина в режиме выхода
  pinMode(RELAY_1_PIN, OUTPUT);
  pinMode(RELAY_2_PIN, OUTPUT);
  currentMillis = millis();
}
 
void loop()
{
  // если прошёл заданный интервал времени
  if (millis() - currentMillis > 3000) {
    state = !state;
    currentMillis = millis();
    dht.read();
  }
  switch (dht.getState()) {
    // всё OK
    case DHT_OK
      // считываем показания температуры и влажности с датчика
      temperature = dht.getTemperatureC();
      humidity = dht.getHumidity();
      // выводим показания температуры или влажности
      if (state) {
        displayTemperatureC(DISPLAY_PIN, temperature);
      } else {
        displayHumidity(DISPLAY_PIN, humidity);
      }
      break;
    // если ошибка выводим на дисплей «Err»
    default
      displayDigits(DISPLAY_PIN, QD_NONE, QD_E, QD_r, QD_r);
      break;
  }
  // если температура превысила 35 градусов
  if (temperature > 35) {
    // включаем реле 1
    digitalWrite(RELAY_1_PIN, HIGH);
  } else {
    // иначе выключаем реле
    digitalWrite(RELAY_1_PIN, LOW);
  }
  // если влажность стала менее 20 %
  if (humidity < 20) {
    // включаем реле 2
    digitalWrite(RELAY_2_PIN, HIGH);
  } else {
    // иначе выключаем реле 2
    digitalWrite(RELAY_2_PIN, LOW);
  }
  // ждём 1 секунду
  delay(1000);
}

Работа схемы

Схема устройства представлена на следующем рисунке.

При изменении температуры изменяется сопротивление терморезистора (термистора). Но в нашей схеме мы не будем измерять сопротивление термистора напрямую, вместо этого мы использовали делитель напряжения, одним из резисторов которого является известное сопротивление 10 кОм, а вторым – наш терморезистор. Средняя точка делителя напряжения подключена к аналоговому входу A0 платы Arduino, поэтому при помощи аналогово-цифрового преобразования (АЦП) на этом контакте мы можем определить падение напряжение на терморезисторе в любой момент времени и, следовательно, и его сопротивление. Благодаря этим данным мы по формулам, приведенным ниже в данной статье, можем определить значение температуры.

Подключение термостата 24 В

Схема подключения термостата обозначается в паспорте на конкретное устройство заводом изготовителем.

Для примера можно показать порядок подключения термостата на Ардуино, на выше обозначенной схеме:

  • Красный цвет, терминал Р, клемма питания переменного тока 24 В. Нередко можно найти 2 красных кабеля RH и RC. В этом случае, оба питаются напряжением 24 В переменного тока, и можно использовать их для отдельного включения тепла и охлаждения.
  • Черный цвет, терминал С, это общее заземление.
  • Белый цвет, терминал В, эта клемма для подачи сигнала на включение теплоносителя.
  • Желтый цвет, терминал Y, эта клемма, которая включает циркуляционный насос.
  • Оранжевый цвет, терминал О, здесь клеммы O и B взаимодействуют с обратным клапаном. Обратный клапан контролирует поток холодной воды в обратном трубопроводе, через подмешивание его с горячим подающем теплоносителем. Таким образом, регулируется температура теплоносителя на нагревательных приборах.
  • Синий, терминал B, аналогичен клемме O, но для подачи тепла. Очень часто можно увидеть, что эти два терминала объединены в один с надписью O/B.
  • Зеленый терминал G, эта клемма управляет вентилятором источника нагрева.

ПРИМЕРЫ

Демо — все возможности библиотеки с комментариями

/*     Пример работы ПИД регулятора в автоматическом режиме по встроенному таймеру     Давайте представим, что на 3 пине у нас спираль нагрева, подключенная через мосфет,     управляем ШИМ сигналом     И есть какой то абстрактный датчик температуры, на который влияет спираль  */  #include "GyverPID.h"    GyverPID regulator(0.1, 0.05, 0.01, 10);  // коэф. П, коэф. И, коэф. Д, период дискретизации dt (мс)  // или так:  // GyverPID regulator(0.1, 0.05, 0.01);// можно П, И, Д, без dt, dt будет по умолч. 100 мс    void setup() {    regulator.setDirection(NORMAL); // направление регулирования (NORMAL/REVERSE). ПО УМОЛЧАНИЮ СТОИТ NORMAL    regulator.setLimits(0, 255);    // пределы (ставим для 8 битного ШИМ). ПО УМОЛЧАНИЮ СТОЯТ 0 И 255    regulator.setpoint = 50;        // сообщаем регулятору температуру, которую он должен поддерживать      // в процессе работы можно менять коэффициенты    regulator.Kp = 5.2;    regulator.Ki += 0.5;    regulator.Kd = 0;  }    void loop() {    int temp;                 // читаем с датчика температуру    regulator.input = temp;   // сообщаем регулятору текущую температуру      // getResultTimer возвращает значение для управляющего устройства    // (после вызова можно получать это значение как regulator.output)    // обновление происходит по встроенному таймеру на millis()    analogWrite(3, regulator.getResultTimer());  // отправляем на мосфет      // .getResultTimer() по сути возвращает regulator.output  }  

Программа

Программа приведена в таблице 1.

Таблица 1.

Первое отличие в том, что заданы порты для управления нагревателями. Это порты D9-D12, заданы они здесь:

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

pinMode(9, OUTPUT);

Можно выбрать другие свободные цифровые порты, после подключения индикатора остались еще D8 и D13. Но автор выбрал именно эти: D9, D10, D11, D12. Второе отличие в том, что для управления нагревателями используется компараторная функция if. В строках:

if(temp < -15)digitalWrite(12, HIGH);

if(temp > -15)digitalWrite(12, LOW);

if(tempi < 1)digitalWrite(11, HIGH);

if(tempi > 1)digitalWrite(11, LOW);

if(temp2 < 20)digitalWrite(10, HIGH);

if(temp2 > 20)digitalWrite(10, LOW);

if(temp3 < 10)digitalWrite(9, HIGH);

if(temp3 > 10)digitalWrite(9, LOW);

В этих строках указывается при какой температуре, какой логический уровень должен быть на соответствующем порту. Например, при температуре первого датчика (Т1) ниже -15°С на порту D12 будет логическая единица. При температуре второго датчика (Т2) ниже 1°С на порту D11 будет логическая единица.

При температуре третьего датчика (ТЗ) ниже 20°С на порту D10 будет логическая единица. При температуре четвертого датчика (Т4) ниже 10°С на порту D9 будет логическая единица. Конечно, температуры можно задать и совсем другие, — любые, которые нужны для конкретного применения данного прибора.

Более того, уже в готовом устройстве, при необходимости их легко изменить. Для этого нужно подключить персональный компьютер к USB-порту платы ARDUINO UNO и загрузить программу с другими данными по температурным порогам. В принципе, для этого можно предусмотреть на корпусе готового прибора разъем USB.

Обычно, в «типовом» терморегуляторе есть петля гистерезиса, то есть, цепь, которая создает разницу между тепера-турой включения нагревателя и температурой его выключения. Это нужно для того чтобы нагреватель включался / выключался не очень часто

Особенно это важно, если нагревателем управляет электромагнитное реле

Потому что контакты реле не рассчитаны на такой режим работы, и могут быстро выйти из строя от подгорания из-за искрения. Но гистерезис вносит погрешность в работу термостата. Здесь было решено не создавать гистерезис, а для того чтобы контакты реле переключались не слишком часто просто замедлить работу прибора. Для этого в строке:

delay(3000);

время индикации увеличено до трех секунд. В результате, измерения повторяются с периодом в три секунды, и в любом случае, реле не может переключаться чаще, чем один раз в три секунды.

Программный код термостата Arduino

Аналогично, как и в схеме подключения, код каждого термостата Arduino будет немного отличаться. Его нужно адаптировать к потребностям тепловой сети.

Эту схему можно модернизировать, например, добавить такие функции:

  1. Датчик движения для включения и выключения источника нагрева, в зависимости от присутствия жителей.
  2. Режим «АВТО», автоматическое ведение тепловым процессом.
  3. Внешние датчики для измерения температуры в помещении в разных местах.
  4. LED-экран для контроля температуры.

Таким образом, функциональные возможности терморегулятора с Arduino огромны. Они могут учесть, практически все, внутридомовые системы отопления. Современная промышленность наладила выпуск комплектующих изделий для такой схемы управления, а используя возможности Arduino и фреймворка MySensors, домашняя «умная» автоматики может быть реализована в каждом доме своими руками.

Обзор датчика DS18B20

Датчик DS18B20 взаимодействует с Arduino через 1-проводную шину. По определению для связи с Arduino требуется только одна линия данных (и земля).

Рабочая температура датчика колеблется от -55° C до + 125° C с точностью ± 0,5° C в диапазоне от -10° C до + 85° C. Кроме того, DS18B20 может получать питание непосредственно от линии передачи данных («паразитный источник питания») без необходимости внешнего источника питания.

Каждый DS18B20 имеет уникальный 64-битный последовательный код или адрес, который позволяет нескольким DS18B20s работать на той же однопроводной шине. Поэтому использование микропроцессора упрощает управление несколькими DS18B20, распределенными по большой площади. Приложения для этой функции включают в себя экологический контроль, системы контроля температуры в зданиях и механическом оборудовании.

Особенности DS18B20

  • Необходим только один однопроводный интерфейс для связи между микроконтроллером и датчиком.
  • Требуется только один внешний компонент: резистор 4,7 кОм.
  • Может питаться от линии передачи данных напрямую, требуя напряжения от 3,0 до 5,5 В.
  • Каждое устройство имеет уникальный 64-битный последовательный код, хранящийся на встроенном ПЗУ.
  • Может измерять температуру в диапазоне от -55° C до + 125° C (от -67° F до + 257° F).
  • Точность ± 0,5° C  в диапазоне от -10° C до + 85° C.

В этом проекте используется DS18B20, который поставляется в форме температурного зонда, который является водонепроницаемым. Использование водонепроницаемого датчика расширяет возможности — датчик температуры сможет измерить температуру жидкостей, таких как вода, химикаты, чай и кофе.

Схема проекта

Схема бесконтактного термометра на основе платы Arduino и датчике температуры MLX90614 представлена на следующем рисунке.

Схема была нарисована с использованием программы Fritzing. Поскольку эта программа не поддерживает датчик MLX90614, мы вместо него на схеме использовали соответствующим образом подписанный прямоугольник, также на схеме мы использовали светодиод красного цвета вместо лазерного диода. Вся схема запитывается от батарейки 9V через кнопку. При нажатии кнопки контакт батарейки подключается к контакту RAW платы Arduino. Это напряжение 9V с помощью встроенного регулятора напряжения платы Arduino преобразуется в стабилизированное напряжение 5V, которое используется для питания OLED дисплея, датчика температуры и лазерного диода.

Если вы будете использовать этот термометр только для измерения температуры человеческого тела или других достаточно крупных объектов, то лазерный диод (он облегчает прицеливание термометра на маленьких объектах) можно из его схемы исключить.

Внешний вид конструкции нашего бесконтактного термометра показан на следующем рисунке.

Версии

  • v1.1 — убраны дефайны
  • v1.2 — возвращены дефайны
  • v1.3 — вычисления ускорены, библиотека облегчена
  • v2.0 — логика работы чуть переосмыслена, код улучшен, упрощён и облегчён
  • v2.1 — integral вынесен в public
  • v2.2 — оптимизация вычислений
  • v2.3 — добавлен режим PID_INTEGRAL_WINDOW
  • v2.4 — реализация внесена в класс
  • v3.0
    • Добавлен режим оптимизации интегральной составляющей (см. доку)
    • Добавлены автоматические калибровщики коэффициентов (см. примеры и доку)
  • v3.1 — исправлен режиме ON_RATE, добавлено автоограничение инт. суммы
  • v3.2 — чуть оптимизации, добавлена getResultNow
  • v3.3 — в тюнерах можно передать другой обработчик класса Stream для отладки

Принципы ШИМ модуляции

Наша конструкция будет состоять из трех частей. В первой части будет измеряться температура с помощью датчика температуры и влажности DHT11. Вторая часть будет считывать значение температуры с выходного контакта DHT11, преобразовывать ее в температуру по шкале Цельсия и управлять скоростью вращения вентилятора постоянного тока с помощью ШИМ. А третья часть проекта будет показывать значение температуры и скорости вращения вентилятора на ЖК дисплее.

В этом проекте мы использовали датчик DHT11, который подробно описан в статье про измерение температуры и влажности с помощью Arduino. Но в этом проекте мы этот датчик будем использовать только для измерения температуры.

Принцип функционирования проекта достаточно прост. Мы будем создавать сигнал ШИМ модуляции на соответствующем контакте ШИМ платы Arduino, который будем подавать на базу транзистора. В соответствии с этим управляющим напряжением транзистор будет изменять значение напряжения на своем выходе, с которого и подается управляющее напряжение на вентилятор.

Пример ШИМ модуляции на цифровом осциллографе представлен на следующем рисунке.

Скорость вращения вентилятора и соответствующие ей значения ШИМ и ее коэффициента заполнения представлены в следующей таблице.

Температура Цикл занятости ШИМ Значение, передаваемое в функцию управления ШИМ в Arduino Скорость вращения вентилятора
менее 26 0% выключен
26 20% 51 20%
27 40% 102 40%
28 60% 153 60%
29 80% 204 80%
больше 29 100% 255 100%

Что такое ШИМ? Простыми словами это такая технология, с помощью которой мы можем управлять напряжением или мощностью. К примеру, мы подаем на электродвигатель напряжение 5 Вольт, которое будет заставлять его вращаться с некоторой скоростью. Если после этого мы снизим подаваемое напряжение на 2 Вольта (т. е. до 3 Вольт), то скорость вращения электродвигателя также уменьшится. Более подробно об использовании ШИМ можно прочитать в следующей статье: управлению яркостью свечения светодиода с помощью ШИМ.

Основная идея ШИМ состоит в использовании цифровых импульсов с определенным коэффициентом заполнения (циклом занятости), который и будет отвечать за скорость вращения вентилятора.

К примеру, мы будем использовать ШИМ с коэффициентом заполнения 50% — это будет означать что на управляемое устройство мы будем подавать половину максимального напряжения импульса.

Формула для расчета коэффициента заполнения будет выглядеть следующим образом:

Duty Cycle= Ton/T

где T – общее время импульса Ton+Toff (сумма его активного и пассивного состояния)
Ton – время активного состояния импульса (означает 1 )
Toff – время пассивного состояния импульса (означает 0)

Более наглядно это представлено на следующих рисунках.

Принципиальная схема вентилятора Ардуино

Принципиальная схема нашего вентилятора выглядит так:

Давайте разберемся с соединением всех деталей. Прежде всего сделайте подключение ЖК-дисплея к Ардуино следующим образом:

  • Подсоедините вывод VSS на ЖК-дисплее к земле Arduino.
  • Подключите контакт VDD к 5V Arduino.
  • Подсоедините вывод V0 к центральному выводу потенциометра 10K. Подключите два других контакта потенциометра к 5V и к земле.
  • Подсоедините штырь RS к контакту 2 Arduino.
  • Подключите контакт R/W к земле Arduino. Это поместит ЖК-дисплей в режим чтения.
  • Подключите контакт E (Enable) к контакту 3 Arduino.
  • Подключите контакты D4-D7 к контакту 4, 5, 6, 7 Ардуино.
  • Подключите контакт 15, который является положительным выводом подсветки светодиода на 5-контактный штырь через резистор 220 Ом.
  • Подключите контакт 16, который является отрицательным выводом подсветки светодиода к земле Arduino.

Затем подключите релейный модуль к Arduino. На стороне входа модуля реле выполните соединения следующим образом:

  • Подключите вывод VCC модуля реле к выводу 5V Arduino.
  • Подключите вывод IN модуля реле к выходу 9 Arduino.
  • Подключите вывод GND модуля реле к GND Ардуино.

На выходной стороне модуля реле подключите минус 9В-батареи к общему (C) модулю реле и подключите NC модуля реле к минусу вентилятора. Затем подключите плюс батареи к плюсу вентилятора.

В конце сделайте соединения для датчика температуры и влажности DHT22.

  • Подключите контакт 1 DHT22, который является выводом VCC, к 5V Ардуино.
  • Подключите контакт 2 DHT22, который является выводом данных к выходу 8 Arduino.
  • Подключите контакт 4 от DHT22, который является заземляющим контактом, к земле Arduino.

Тестирование работы термометра

Когда аппаратная часть проекта будет готова, загрузите программу в плату Arduino Pro Mini. Для этой цели можно использовать TTL programmer или FTDI board. Но если вы в этом проекте будете использовать плату Arduino Nano, то ее можно будет программировать с помощью USB кабеля, подключаемого к компьютеру.

Когда все будет готово, нажмите кнопку – она запустит в работу наш бесконтактный термометр. После этого вы должны увидеть как лазерный луч подсвечивает объект, а на экране OLED дисплея показывается температура этого объекта. Мы с помощью данного термометра проверяли температуру компонентов на печатной плате.

Работа термометра была проверена и на других объектах: паяльник, сопло 3D принтера, кусках льда и т.п. Более подробно работу термометра вы можете посмотреть на видео, приведенном в конце статьи.

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

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

Adblock
detector