Вывод с DS18B20 на LCD дисплей
Задача
- Вывести показания с датчика температуры DS18B20 на LCD дисплей 1602
- Усложнить задачу, вывести изменение температуры с момента перезагрузки
- Вывести температуру с двух датчиков и разницу между ними
Базовые уроки
Подключение
- Дисплей подключается к питанию и шине I2C
- Датчик подключается на любой цифровой пин
- Можно подключить несколько датчиков на один пин
Библиотеки
- LiquidCrystal_I2C для дисплея
- microDS18B20 для термометра
Программа 1
Для начала просто выведем температуру с датчика на дисплей.
#include <LiquidCrystal_I2C.h> // подключаем библиотеку дисплея
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк
#include <microDS18B20.h>
MicroDS18B20<2> sensor; // указываем пин
void setup() {
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
}
void loop() {
sensor.requestTemp(); // запросить температуру
delay(1000); // ждём ответа
lcd.home(); // курсор в 0,0
lcd.print(sensor.getTemp()); // выводим температуру
lcd.write(223); // символ градуса
lcd.print("C "); // С и пара пробелов для очистки
}
Программа 2
Теперь будем выводить такую строку: «температура с момента запуска программы» -> «текущая температура». Может быть полезным для исследования изменения температуры. Нам нужно завести переменную для хранения первого значения, назовём её prevT. При запуске программы запросим температуру с датчика, подождём, запишем результат в переменную и будем выводить на дисплей как в предыдущем примере:
#include <LiquidCrystal_I2C.h> // подключаем библу
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк
#include <microDS18B20.h>
MicroDS18B20<2> sensor;
float prevT; // переменная для хранения температуры
void setup() {
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
sensor.requestTemp(); // запрос температуры
delay(1000); // ждём
prevT = sensor.getTemp(); // запомнили
}
void loop() {
sensor.requestTemp(); // запрос температуры
delay(1000); // ждём
lcd.home(); // курсор в 0,0
lcd.print(prevT, 1); // вывод prevT с точностью 1 знак
lcd.write(223); // градус
lcd.print(' '); // пробел
lcd.write(126); // стрелочка
lcd.print(' '); // пробел
lcd.print(sensor.getTemp(), 1); // текущая температура
lcd.write(223); // градус
}
Также можно вывести время, прошедшее с момента запуска программы, например в формате часы:секунды.
- У нас есть функция
millis(), которая возвращает время работы программы в миллисекундах. millis() / 1000даст нам секунды, запишем в переменнуюsec.- Чтобы получить количество секунд в пределах одной минуты, разделим секунды на 60:
sec / 60 - Чтобы получить количество минут из общего количества секунд — нужно выполнить операцию остаток от деления, опять же на 60:
sec % 60 - Чтобы выводить значения с ведущим нулём (например 03 вместо 3), сделаем простое условие:
if (минуты < 10) lcd.print(0); - Обернём вывод времени в функцию для лучшей читаемости кода
#include <LiquidCrystal_I2C.h> // подключаем библу
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк
#include <microDS18B20.h>
MicroDS18B20<2> sensor;
float prevT; // переменная для хранения температуры
void setup() {
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
sensor.requestTemp(); // запрос температуры
delay(1000); // ждём
prevT = sensor.getTemp(); // запомнили
}
void loop() {
sensor.requestTemp(); // запрос температуры
delay(1000); // ждём
lcd.home(); // курсор в 0,0
lcd.print(prevT, 1); // вывод prevT с точностью 1 знак
lcd.write(223); // градус
lcd.print(' '); // пробел
lcd.write(126); // стрелочка
lcd.print(' '); // пробел
lcd.print(sensor.getTemp(), 1); // текущая температура
lcd.write(223); // градус
printTime(); // выводим время
}
// функция вывода времени
void printTime() {
lcd.setCursor(0, 1); // курсор на вторую строку
int sec = millis() / 1000; // общее количество секунд
byte thisM = sec / 60; // количество минут
if (thisM < 10) lcd.print(0); // ведущий 0
lcd.print(thisM); // минуты
lcd.print(':'); // двоеточие
byte thisS = sec % 60; // количество секунд
if (thisS < 10) lcd.print(0); // ведущий 0
lcd.print(thisS); // секунды
}
Программа 3
Следующая задача — опросить два термометра и вывести их текущие показания и разность.
- Для начала прошьём пример address_read из библиотеки microDS18B20
- Поочерёдно подключим два датчика, увидим их адреса и скопируем в блокнот
Далее аналогично примеру one_pin_many_sensors записываем полученные адреса в массивы и создаём два датчика. Дальнейшая работа ведётся с двумя датчиками:
#include <LiquidCrystal_I2C.h> // подключаем библу
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк
// полученные адреса
uint8_t s1_addr[] = {0x28, 0xE1, 0x57, 0xCF, 0x4E, 0x20, 0x1, 0x3D};
uint8_t s2_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
#include <microDS18B20.h>
MicroDS18B20<2, s1_addr> sensor1; // Создаем термометр с адресацией
MicroDS18B20<2, s2_addr> sensor2; // Создаем термометр с адресацией
void setup() {
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
}
void loop() {
// запрашиваем температуру
sensor1.requestTemp();
sensor2.requestTemp();
// ждём
delay(1000);
// получаем и записываем в переменные
float t1 = sensor1.getTemp();
float t2 = sensor2.getTemp();
lcd.home();
lcd.print(t1, 1); // температура 1
lcd.write(223); // градус
lcd.print('-'); // "минус"
lcd.print(t2, 1); // температура 2
lcd.write(223); // градус
lcd.print('='); // "равно"
lcd.print(t1 - t2, 1); // ищем разность и выводим
lcd.write(223); // градус
}
Домашнее задание
- Избавиться от
delay(), использовать асинхронную конструкцию сmillis() - Выводить на дисплей сообщение, если температура выше заданного «порога»
- Подключить два датчика без адресации (на разные пины)






