Это старая версия документа!
Теперь у нас есть опыт создания аналогового термометра с термистором в качестве датчика, и цифрового с датчиком DS18B20. Почему бы не объединить эти датчики, чтобы сделать двухзонный термометр. Учитывая исполнение датчиков, с помощью DS18B20 можно измерять температуру в комнате, а термистор в корпусе вывести на улицу, чтобы видеть на дисплее данные о температуре в комнате и на улице одновременно.
#include <OneWire.h> #include <DallasTemperature.h> #include <LCDI2C_Multilingual.h> #define ACD_PIN A0 #define BUS_PIN 12 #define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT OneWire oneWire(BUS_PIN); DallasTemperature sensors(&oneWire); LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2); const int Bcoef = 3950; const int R1 = 10000; const int Rtnom = 10000; const float T0 = 273.15; void setup() { sensors.begin(); lcd.init(); lcd.setBacklight(0); } void loop() { 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, 2); lcd.print("In room: "); lcd.print(temp_inroom, 2); }
Код программы состоит из кода двух экспериментов, посвещенных термометру на термисторе и термометру на DS18B20.
Сначала подключаем необходимые библиотеки:
from machine import Pin, I2C from esp8266_i2c_lcd import I2cLcd import time import math import onewire import ds18x20
Определяем константы, необходимые для вычисления температуры с помощью терморезистора (подробно разбиралось в Проекте 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)
Определяем адрес контроллера LCD дисплея на шине 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()
Определяем сопротивление термистора, из которого вычисляем температуру (подробно рассматривалось в эксперименте 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)