===== Эксперимент 41. Двухзонный термометр с LCD дисплеем ===== Теперь у нас есть опыт создания аналогового термометра с термистором в качестве датчика, и цифрового с датчиком DS18B20. Почему бы не объединить эти датчики, чтобы сделать двухзонный термометр. Учитывая исполнение датчиков, с помощью DS18B20 можно измерять температуру в комнате, а термистор в корпусе вывести на улицу, чтобы видеть на дисплее данные о температуре в комнате и на улице одновременно. ==== Схема эксперимента ==== {{ :products:esp-iot:exp19.1_mon.png?direct&600 |}} //Рисунок 1. Монтажная схема эксперимента// ==== Программный код эксперимента ==== from machine import Pin, I2C from esp8266_i2c_lcd import I2cLcd import time import math import onewire import ds18x20 _init() Bcoef = 3950 R1 = 10000 Rtnom = 10000 T0 = 273.15 adc = machine.ADC(0) ow = onewire.OneWire(Pin(12)) ds = ds18x20.DS18X20(ow) DEFAULT_I2C_ADDR = 0x3F # Или 0x27 в зависимости от модели микросхемы на плате i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16) lcd.backlight_on() while True: value = adc.read() R = (-R1 * value)/(value-1023) temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0 outodor_temp = round(temp,1) roms = ds.scan() ds.convert_temp() temp = ds.read_temp(roms[0]) inroom_temp = round(temp,1) print("Outodor: " + str(inroom_temp)) print('In room: ' + str(outodor_temp)) lcd.clear() lcd.putstr("Outodor: " + str(outodor_temp)) lcd.move_to(0,1) lcd.putstr("In room: " + str(inroom_temp)) time.sleep(5) Код программы состоит из кода двух экспериментов, посвящённых [[products:laboratory_iot:exp33|термометру на термисторе]] и [[products:laboratory_iot:exp40|термометру на DS18B20]]. Сначала подключаем необходимые библиотеки: from machine import Pin, I2C from esp8266_i2c_lcd import I2cLcd import time import math import onewire import ds18x20 Определяем константы, необходимые для вычисления температуры с помощью терморезистора (подробно разбиралось в [[products:laboratory_iot:exp32|Проекте 3. "Термометр"]]). Bcoef = 3950 R1 = 10000 Rtnom = 10000 T0 = 273.15 Создаем объекты АЦП, шины 1-Wire на выводе 12 и датчика DS18B20: adc = machine.ADC(0) ow = onewire.OneWire(Pin(12)) ds = ds18x20.DS18X20(ow) Определяем адрес [[products:laboratory_iot:lcd1602|контроллера LCD дисплея]] на [[theory:i2c|шине I2C]]: DEFAULT_I2C_ADDR = 0x3F Создаем объект шины I2C и настраиваем ее. Создаем объект LCD дисплея и настраиваем его. Включаем подсветку дисплея: i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16) lcd.backlight_on() В основном цикле программы мы получаем данные с АЦП, к которому подключен делитель напряжения с нижнем плече с термистором: value = adc.read() Определяем сопротивление термистора, из которого вычисляем температуру ([[products:laboratory_iot:exp32|подробно рассматривалось в эксперименте 32]]). Округляем температуру до десятых (1 знак после десятичной точки) и сохраняем в переменной ''outodor_temp'': R = (-R1 * value)/(value-1023) temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0 outodor_temp = round(temp,1) Считываем температуру из датчика DS18B20, округляем температуру до десятых (1 знак после десятичной точки) и сохраняем в переменной ''inroom_temp'': roms = ds.scan() ds.convert_temp() temp = ds.read_temp(roms[0]) inroom_temp = round(temp,1) Выводим температуру в комнате и на улице в терминал. Перед выводом температур преобразовываем их из чисел в строки с помощью оператора ''str()'': print("Outodor: " + str(inroom_temp)) print('In room: ' + str(outodor_temp)) Очищаем дисплей (при этом курсор дисплея перемещается в верхний левый угол), выводим строку с информацией о температуре на улице. lcd.clear() lcd.putstr("Outodor: " + str(outodor_temp)) Перемещаем курсор дисплея на нулевой (самый левый) символ второй строки и выводим информацию о температуре в комнате: lcd.move_to(0,1) lcd.putstr("In room: " + str(inroom_temp)) Пауза на 5 секунд перед следующим измерением: time.sleep(5)