Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
products:laboratory_iot:exp41 [2020/05/23 15:02] – [Схема эксперимента] labuser29 | products:laboratory_iot:exp41 [2024/11/24 12:28] (текущий) – [Программный код эксперимента] labuser30 | ||
---|---|---|---|
Строка 27: | Строка 27: | ||
ds = ds18x20.DS18X20(ow) | ds = ds18x20.DS18X20(ow) | ||
- | DEFAULT_I2C_ADDR = 0x3F | + | DEFAULT_I2C_ADDR = 0x3F # Или 0x27 в зависимости от модели микросхемы на плате |
i2c = I2C(scl=Pin(5), | i2c = I2C(scl=Pin(5), | ||
Строка 39: | Строка 39: | ||
R = (-R1 * value)/ | R = (-R1 * value)/ | ||
temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0 | temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0 | ||
- | | + | |
roms = ds.scan() | roms = ds.scan() | ||
ds.convert_temp() | ds.convert_temp() | ||
temp = ds.read_temp(roms[0]) | temp = ds.read_temp(roms[0]) | ||
- | | + | |
print(" | print(" | ||
Строка 50: | Строка 50: | ||
| | ||
lcd.clear() | lcd.clear() | ||
- | lcd.putstr(" | + | lcd.putstr(" |
lcd.move_to(0, | lcd.move_to(0, | ||
- | lcd.putstr(" | + | lcd.putstr(" |
time.sleep(5) | time.sleep(5) | ||
</ | </ | ||
+ | Код программы состоит из кода двух экспериментов, | ||
+ | |||
+ | Сначала подключаем необходимые библиотеки: | ||
+ | <code python[enable_line_numbers=" | ||
+ | from machine import Pin, I2C | ||
+ | from esp8266_i2c_lcd import I2cLcd | ||
+ | import time | ||
+ | import math | ||
+ | import onewire | ||
+ | import ds18x20 | ||
+ | </ | ||
+ | |||
+ | Определяем константы, | ||
+ | <code python[enable_line_numbers=" | ||
+ | Bcoef = 3950 | ||
+ | R1 = 10000 | ||
+ | Rtnom = 10000 | ||
+ | T0 = 273.15 | ||
+ | </ | ||
+ | |||
+ | Создаем объекты АЦП, шины 1-Wire на выводе 12 и датчика DS18B20: | ||
+ | <code python[enable_line_numbers=" | ||
+ | adc = machine.ADC(0) | ||
+ | ow = onewire.OneWire(Pin(12)) | ||
+ | ds = ds18x20.DS18X20(ow) | ||
+ | </ | ||
+ | |||
+ | Определяем адрес [[products: | ||
+ | <code python[enable_line_numbers=" | ||
+ | DEFAULT_I2C_ADDR = 0x3F | ||
+ | </ | ||
+ | |||
+ | Создаем объект шины I2C и настраиваем ее. Создаем объект LCD дисплея и настраиваем его. Включаем подсветку дисплея: | ||
+ | <code python[enable_line_numbers=" | ||
+ | i2c = I2C(scl=Pin(5), | ||
+ | lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, | ||
+ | lcd.backlight_on() | ||
+ | </ | ||
+ | |||
+ | В основном цикле программы мы получаем данные с АЦП, к которому подключен делитель напряжения с нижнем плече с термистором: | ||
+ | <code python[enable_line_numbers=" | ||
+ | value = adc.read() | ||
+ | </ | ||
+ | |||
+ | Определяем сопротивление термистора, | ||
+ | <code python[enable_line_numbers=" | ||
+ | R = (-R1 * value)/ | ||
+ | temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0 | ||
+ | outodor_temp = round(temp, | ||
+ | </ | ||
+ | |||
+ | Считываем температуру из датчика DS18B20, округляем температуру до десятых (1 знак после десятичной точки) и сохраняем в переменной '' | ||
+ | <code python[enable_line_numbers=" | ||
+ | roms = ds.scan() | ||
+ | ds.convert_temp() | ||
+ | temp = ds.read_temp(roms[0]) | ||
+ | inroom_temp = round(temp, | ||
+ | </ | ||
+ | |||
+ | Выводим температуру в комнате и на улице в терминал. Перед выводом температур преобразовываем их из чисел в строки с помощью оператора '' | ||
+ | <code python[enable_line_numbers=" | ||
+ | print(" | ||
+ | print(' | ||
+ | </ | ||
+ | |||
+ | Очищаем дисплей (при этом курсор дисплея перемещается в верхний левый угол), выводим строку с информацией о температуре на улице. | ||
+ | <code python[enable_line_numbers=" | ||
+ | lcd.clear() | ||
+ | lcd.putstr(" | ||
+ | </ | ||
+ | |||
+ | Перемещаем курсор дисплея на нулевой (самый левый) символ второй строки и выводим информацию о температуре в комнате: | ||
+ | <code python[enable_line_numbers=" | ||
+ | lcd.move_to(0, | ||
+ | lcd.putstr(" | ||
+ | </ | ||
+ | |||
+ | Пауза на 5 секунд перед следующим измерением: | ||
+ | <code python[enable_line_numbers=" | ||
+ | time.sleep(5) | ||
+ | </ |