Эксперимент 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. outodor_temp = round(temp,1)
  31.  
  32. roms = ds.scan()
  33. ds.convert_temp()
  34. temp = ds.read_temp(roms[0])
  35. inroom_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(outodor_temp))
  42. lcd.move_to(0,1)
  43. lcd.putstr("In room: " + str(inroom_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:

  1. DEFAULT_I2C_ADDR = 0x3F

Создаем объект шины I2C и настраиваем ее. Создаем объект LCD дисплея и настраиваем его. Включаем подсветку дисплея:

  1. i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
  2. lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
  3. lcd.backlight_on()

В основном цикле программы мы получаем данные с АЦП, к которому подключен делитель напряжения с нижнем плече с термистором:

  1. value = adc.read()

Определяем сопротивление термистора, из которого вычисляем температуру (подробно рассматривалось в эксперименте 32). Округляем температуру до десятых (1 знак после десятичной точки) и сохраняем в переменной outodor_temp:

  1. R = (-R1 * value)/(value-1023)
  2. temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0
  3. outodor_temp = round(temp,1)

Считываем температуру из датчика DS18B20, округляем температуру до десятых (1 знак после десятичной точки) и сохраняем в переменной inroom_temp:

  1. roms = ds.scan()
  2. ds.convert_temp()
  3. temp = ds.read_temp(roms[0])
  4. inroom_temp = round(temp,1)

Выводим температуру в комнате и на улице в терминал. Перед выводом температур преобразовываем их из чисел в строки с помощью оператора str():

  1. print("Outodor: " + str(inroom_temp))
  2. print('In room: ' + str(outodor_temp))

Очищаем дисплей (при этом курсор дисплея перемещается в верхний левый угол), выводим строку с информацией о температуре на улице.

  1. lcd.clear()
  2. lcd.putstr("Outodor: " + str(outodor_temp))

Перемещаем курсор дисплея на нулевой (самый левый) символ второй строки и выводим информацию о температуре в комнате:

  1. lcd.move_to(0,1)
  2. lcd.putstr("In room: " + str(inroom_temp))

Пауза на 5 секунд перед следующим измерением:

  1. time.sleep(5)