===== Эксперимент 41. Двухзонный термометр с LCD дисплеем =====
Теперь у нас есть опыт создания аналогового термометра с термистором в качестве датчика, и цифрового с датчиком DS18B20. Почему бы не объединить эти датчики, чтобы сделать двухзонный термометр. Учитывая исполнение датчиков, с помощью DS18B20 можно измерять температуру в комнате, а термистор в корпусе вывести на улицу, чтобы видеть на дисплее данные о температуре в комнате и на улице одновременно.
==== Схема эксперимента ====
{{ :products:esp-iot:exp19.1_mon.png?direct&600 |}}
//Рисунок 1. Монтажная схема эксперимента//
==== Программный код эксперимента ====
#include
#include
#include
#define ACD_PIN A0
#define BUS_PIN 12
#define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT
const int Bcoef = 3950;
const int R1 = 10000;
const int Rtnom = 10000;
const float T0 = 273.15;
OneWire oneWire(BUS_PIN);
DallasTemperature sensors(&oneWire);
LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2);
void setup() {
sensors.begin();
lcd.init();
lcd.setBacklight(0);
}
void loop() {
int value = analogRead(ACD_PIN);
float R2 = (-R1 * value) / (value - 1023);
float temp_outodor = 1 / (log(R2 / Rtnom) / Bcoef + 1/(25 + T0)) - T0;
sensors.requestTemperatures();
float temp_inroom = sensors.getTempCByIndex(0);
lcd.clear();
lcd.print("Outodor: ");
lcd.println(temp_outodor, 1);
lcd.print("In room: ");
lcd.print(temp_inroom, 1);
delay(1000);
}
Код программы состоит из кода двух экспериментов, посвящённых [[products:laboratory_iot_c:exp33|термометру на термисторе]] и [[products:laboratory_iot_c:exp40|термометру на DS18B20]].
Сначала подключаем необходимые библиотеки:
#include
#include
#include
Задаем псевдонимы для пина АЦП, пина шины 1-Wire и адреса дисплея.
#define ACD_PIN A0
#define BUS_PIN 12
#define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT5;
Определяем константы, необходимые для вычисления температуры с помощью терморезистора (подробно разбиралось в [[products:laboratory_iot_c:exp32|Проекте 3. "Термометр"]]).
const int Bcoef = 3950;
const int R1 = 10000;
const int Rtnom = 10000;
const float T0 = 273.15;
Создаем объекты шины 1-Wire, датчика DS18B20 и дисплея:
OneWire oneWire(BUS_PIN);
DallasTemperature sensors(&oneWire);
LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2);
В функции ''setup()'' инициализируем объекты датчика и дисплея, включаем подсветку.
sensors.begin();
lcd.init();
lcd.setBacklight(0);
В основном цикле программы мы получаем данные с АЦП, к которому подключен делитель напряжения с нижнем плече с термистором:
int value = analogRead(ACD_PIN);
Определяем сопротивление термистора, из которого вычисляем температуру ([[products:laboratory_iot_c:exp32|подробно рассматривалось в эксперименте 32]]) и сохраняем в переменной ''temp_outodor'':
float R2 = (-R1 * value) / (value - 1023);
float temp_outodor = 1 / (log(R2 / Rtnom) / Bcoef + 1/(25 + T0)) - T0;
Считываем температуру из датчика DS18B20 и сохраняем в переменной ''temp_inroom'':
sensors.requestTemperatures();
float temp_inroom = sensors.getTempCByIndex(0);
''!!!!!!!Выводим температуру в комнате и на улице в терминал. Перед выводом температур преобразовываем их из чисел в строки с помощью оператора ''str()'':
print("Outodor: " + str(inroom_temp))
print('In room: ' + str(outodor_temp))
''
Очищаем дисплей (при этом курсор дисплея перемещается в верхний левый угол), выводим строку с информацией о температуре на улице. Функция ''lcd.println()'' переводит курсор на следующую строку после вывода заданного текста.
lcd.clear();
lcd.print("Outodor: ");
lcd.println(temp_outodor, 1);
Перемещаем курсор дисплея на нулевой (самый левый) символ второй строки и выводим информацию о температуре в комнате:
lcd.print("In room: ");
lcd.print(temp_inroom, 1);
Пауза на 1 секунду перед следующим измерением:
delay(1000);