Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
products:laboratory_iot:exp41 [2020/05/23 14:37] – создано labuser29products:laboratory_iot:exp41 [2024/11/24 12:28] (текущий) – [Программный код эксперимента] labuser30
Строка 2: Строка 2:
  
 Теперь у нас есть опыт создания аналогового термометра с термистором в качестве датчика, и цифрового с датчиком DS18B20. Почему бы не объединить эти датчики, чтобы сделать двухзонный термометр. Учитывая исполнение датчиков, с помощью DS18B20 можно измерять температуру в комнате, а термистор в корпусе вывести на улицу, чтобы видеть на дисплее данные о температуре в комнате и на улице одновременно. Теперь у нас есть опыт создания аналогового термометра с термистором в качестве датчика, и цифрового с датчиком DS18B20. Почему бы не объединить эти датчики, чтобы сделать двухзонный термометр. Учитывая исполнение датчиков, с помощью DS18B20 можно измерять температуру в комнате, а термистор в корпусе вывести на улицу, чтобы видеть на дисплее данные о температуре в комнате и на улице одновременно.
 +
 +==== Схема эксперимента ====
 +
 +{{ :products:esp-iot:exp19.1_mon.png?direct&600 |}}
 +//Рисунок 1. Монтажная схема эксперимента//
 +
 +==== Программный код эксперимента ====
 +<file python Exp41.py[enable_line_numbers="2", start_line_numbers_at="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)
 +</file>
 +
 +Код программы состоит из кода двух экспериментов, посвящённых [[products:laboratory_iot:exp33|термометру на термисторе]] и [[products:laboratory_iot:exp40|термометру на DS18B20]].
 +
 +Сначала подключаем необходимые библиотеки:
 +<code python[enable_line_numbers="2", start_line_numbers_at="1"]>
 +from machine import Pin, I2C
 +from esp8266_i2c_lcd import I2cLcd
 +import time
 +import math
 +import onewire
 +import ds18x20
 +</code>
 +
 +Определяем константы, необходимые для вычисления температуры с помощью терморезистора (подробно разбиралось в [[products:laboratory_iot:exp32|Проекте  3. "Термометр"]]).
 +<code python[enable_line_numbers="2", start_line_numbers_at="9"]>
 +Bcoef = 3950
 +R1 = 10000
 +Rtnom = 10000
 +T0 = 273.15
 +</code>
 +
 +Создаем объекты АЦП, шины 1-Wire на выводе 12 и датчика DS18B20:
 +<code python[enable_line_numbers="2", start_line_numbers_at="14"]>
 +adc = machine.ADC(0)
 +ow = onewire.OneWire(Pin(12))
 +ds = ds18x20.DS18X20(ow)
 +</code>
 +
 +Определяем адрес [[products:laboratory_iot:lcd1602|контроллера LCD дисплея]] на [[theory:i2c|шине I2C]]:
 +<code python[enable_line_numbers="2", start_line_numbers_at="18"]>
 +DEFAULT_I2C_ADDR = 0x3F
 +</code>
 +
 +Создаем объект шины I2C и настраиваем ее. Создаем объект LCD дисплея и настраиваем его. Включаем подсветку дисплея:
 +<code python[enable_line_numbers="2", start_line_numbers_at="20"]>
 +i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
 +lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
 +lcd.backlight_on()
 +</code>
 +
 +В основном цикле программы мы получаем данные с АЦП, к которому подключен делитель напряжения с нижнем плече с термистором:
 +<code python[enable_line_numbers="2", start_line_numbers_at="26"]>
 +    value = adc.read()
 +</code>
 +
 +Определяем сопротивление термистора, из которого вычисляем температуру ([[products:laboratory_iot:exp32|подробно рассматривалось в эксперименте 32]]). Округляем температуру до десятых (1 знак после десятичной точки) и сохраняем в переменной ''outodor_temp'':
 +<code python[enable_line_numbers="2", start_line_numbers_at="28"]>
 +    R = (-R1 * value)/(value-1023)
 +    temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0
 +    outodor_temp = round(temp,1)
 +</code>
 +
 +Считываем температуру из датчика DS18B20, округляем температуру до десятых (1 знак после десятичной точки) и сохраняем в переменной ''inroom_temp'':
 +<code python[enable_line_numbers="2", start_line_numbers_at="32"]>
 +    roms = ds.scan()
 +    ds.convert_temp()
 +    temp = ds.read_temp(roms[0])
 +    inroom_temp = round(temp,1)
 +</code>
 +
 +Выводим температуру в комнате и на улице в терминал. Перед выводом температур преобразовываем их из чисел в строки с помощью оператора ''str()'':
 +<code python[enable_line_numbers="2", start_line_numbers_at="37"]>
 +    print("Outodor: " + str(inroom_temp))
 +    print('In room: ' + str(outodor_temp))
 +</code>
 +
 +Очищаем дисплей (при этом курсор дисплея перемещается в верхний левый угол), выводим строку с информацией о температуре на улице.
 +<code python[enable_line_numbers="2", start_line_numbers_at="40"]>
 +    lcd.clear()
 +    lcd.putstr("Outodor: " + str(outodor_temp))
 +</code>
 +
 +Перемещаем курсор дисплея на нулевой (самый левый) символ второй строки и выводим информацию о температуре в комнате:
 +<code python[enable_line_numbers="2", start_line_numbers_at="42"]>
 +    lcd.move_to(0,1)
 +    lcd.putstr("In room: " + str(inroom_temp))
 +</code>
 +
 +Пауза на 5 секунд перед следующим измерением:
 +<code python[enable_line_numbers="2", start_line_numbers_at="45"]>
 +    time.sleep(5)
 +</code>