Это старая версия документа!


Эксперимент 41. Двухзонный термометр с LCD дисплеем

Теперь у нас есть опыт создания аналогового термометра с термистором в качестве датчика, и цифрового с датчиком DS18B20. Почему бы не объединить эти датчики, чтобы сделать двухзонный термометр. Учитывая исполнение датчиков, с помощью DS18B20 можно измерять температуру в комнате, а термистор в корпусе вывести на улицу, чтобы видеть на дисплее данные о температуре в комнате и на улице одновременно.

Схема эксперимента

Рисунок 1. Монтажная схема эксперимента

Программный код эксперимента

Exp41.py
  1. from machine import Pin, I2C
  2. from esp8266_i2c_lcd import I2cLcd
  3. import time
  4. import math
  5. import onewire
  6. import ds18x20
  7. _init()
  8.  
  9. Bcoef = 3950
  10. R1 = 10000
  11. Rtnom = 10000
  12. T0 = 273.15
  13.  
  14. adc = machine.ADC(0)
  15. ow = onewire.OneWire(Pin(12))
  16. ds = ds18x20.DS18X20(ow)
  17.  
  18. DEFAULT_I2C_ADDR = 0x3F
  19.  
  20. i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
  21. lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
  22. lcd.backlight_on()
  23.  
  24.  
  25. while True:
  26. value = adc.read()
  27.  
  28. R = (-R1 * value)/(value-1023)
  29. temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0
  30. inroom_temp = round(temp,1)
  31.  
  32. roms = ds.scan()
  33. ds.convert_temp()
  34. temp = ds.read_temp(roms[0])
  35. outodor_temp = round(temp,1)
  36.  
  37. print("Outodor: " + str(inroom_temp))
  38. print('In room: ' + str(outodor_temp))
  39.  
  40. lcd.clear()
  41. lcd.putstr("Outodor: " + str(inroom_temp))
  42. lcd.move_to(0,1)
  43. lcd.putstr("In room: " + str(outodor_temp))
  44.  
  45. time.sleep(5)

Код программы состоит из кода двух экспериментов, посвещенных термометру на термисторе и термометру на DS18B20.

Сначала подключаем необходимые библиотеки:

  1. from machine import Pin, I2C
  2. from esp8266_i2c_lcd import I2cLcd
  3. import time
  4. import math
  5. import onewire
  6. import ds18x20

Определяем константы, необходимые для вычисления температуры с помощью терморезистора (подробно разбиралось в Проекте 3. «Термометр»).

  1. Bcoef = 3950
  2. R1 = 10000
  3. Rtnom = 10000
  4. T0 = 273.15

Создаем объекты АЦП, шины 1-Wire на выводе 12 и датчика DS18B20:

  1. adc = machine.ADC(0)
  2. ow = onewire.OneWire(Pin(12))
  3. ds = ds18x20.DS18X20(ow)

Определяем адрес контроллера LCD дисплея на шине I2C