Различия

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

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

Следующая версия
Предыдущая версия
products:laboratory_iot:exp33 [2020/05/21 13:45] – создано labuser29products:laboratory_iot:exp33 [2024/12/04 12:15] (текущий) – [Программный код эксперимента] labuser30
Строка 1: Строка 1:
 +===== Эксперимент 33. Термометр =====
 +
 +Теперь, наконец добавим вывод результатов изменения температуры на дисплей.
 +
 ==== Схема эксперимента ==== ==== Схема эксперимента ====
-Оставляем схему собранную на прошлом эксперименте. 
 {{ :products:esp-iot:exp13.1_sch.png?nolink |}} {{ :products:esp-iot:exp13.1_sch.png?nolink |}}
 //Рисунок 1. Электрическая принципиальная схема эксперимента// //Рисунок 1. Электрическая принципиальная схема эксперимента//
 +
 +Добавляем подключения дисплея
  
 {{ :products:esp-iot:13.3_mon.png?direct&600 |}} {{ :products:esp-iot:13.3_mon.png?direct&600 |}}
 //Рисунок 2. Монтажная схема эксперимента// //Рисунок 2. Монтажная схема эксперимента//
 +
 +==== Программный код эксперимента ====
 +<file python Exp33.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
 +
 +_init()
 +
 +Bcoef = 3950
 +R1 = 10000
 +Rtnom = 10000
 +T0 = 273.15
 +
 +adc = machine.ADC(0)
 +
 +
 +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
 +
 +    round_temp = round(temp, 1)
 +
 +    print(round_temp)
 +    
 +    lcd.clear()
 +    lcd.putstr("T=" + str(round_temp))
 +    time.sleep(3)
 +</file>
 +
 +К предыдущей программе добавили то, что требуется для работы с дисплеем. Подключение библиотеки дисплея, настройка дисплея и шины I2C, включение подсветки дисплея.
 +
 +Температуру перед выводом на экран округляем до десятых (один знак после точки):
 +<code python[enable_line_numbers="2", start_line_numbers_at="31"]>
 +    round_temp = round(temp, 1)
 +</code>
 +
 +Перед выводом информации очищаем дисплей от старых данных. При этом курсор дисплея устанавливается в левый верхний угол.
 +
 +<code python[enable_line_numbers="2", start_line_numbers_at="35"]>
 +    lcd.clear()
 +</code>
 +
 +Формируем строку для вывода на дисплей. Она состоит из подстроки ''"T="'' и подстроки с температурой. Оператор ''str()'' преобразует число в строку. А оператор ''+'' здесь работает не совсем так, как мы привыкли. Дело в том, что поведение этого оператора зависит от //контекста//. Когда он оказывается среди чисел, то это операция математического сложения. Но в данном случае оператор ''+'' оказался среди строк. В таком контексте этот оператор выполняет операцию //конкатенации// — склейки строк. Вот он и склеивает одну строку из двух половинок. Полученная таким образом строка передается для вывода на дисплей.
 +
 +<code python[enable_line_numbers="2", start_line_numbers_at="36"]>
 +    lcd.putstr("T=" + str(round_temp))
 +</code>
 +
 +==== Дополнительное задание ====
 +<WRAP center round tip 60%>
 +1. Измени программу, чтобы она выводила температуру с точностью до сотых.
 +
 +2. Добавь символ градуса после показаний температуры. Символ градуса [[products:laboratory_iot:exp30|создай самостоятельно]].
 +</WRAP>