Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
products:laboratory_iot_c:exp41 [2024/11/24 12:25] – labuser30 | products:laboratory_iot_c:exp41 [2024/12/01 14:08] (текущий) – labuser30 | ||
---|---|---|---|
Строка 9: | Строка 9: | ||
==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== | ||
- | < | + | < |
- | from machine import Pin, I2C | + | #include < |
- | from esp8266_i2c_lcd import I2cLcd | + | #include < |
- | import time | + | #include < |
- | import math | + | |
- | import onewire | + | |
- | import ds18x20 | + | |
- | _init() | + | |
- | Bcoef = 3950 | + | #define ACD_PIN A0 |
- | R1 = 10000 | + | #define BUS_PIN 12 |
- | Rtnom = 10000 | + | #define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT |
- | T0 = 273.15 | + | |
- | adc = machine.ADC(0) | + | const int Bcoef = 3950; |
- | ow = onewire.OneWire(Pin(12)) | + | const int R1 = 10000; |
- | ds = ds18x20.DS18X20(ow) | + | const int Rtnom = 10000; |
+ | const float T0 = 273.15; | ||
- | DEFAULT_I2C_ADDR | + | OneWire oneWire(BUS_PIN); |
+ | DallasTemperature sensors(& | ||
+ | LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2); | ||
- | i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) | + | void setup() { |
- | lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, | + | sensors.begin(); |
- | lcd.backlight_on() | + | lcd.init(); |
+ | lcd.setBacklight(0); | ||
+ | } | ||
+ | void loop() { | ||
+ | int value = analogRead(ACD_PIN); | ||
+ | float R2 = (-R1 * value) / (value - 1023); | ||
+ | float temp_outodor = 1 / (log(R2 / Rtnom) / Bcoef + 1/(25 + T0)) - T0; | ||
- | while True: | + | sensors.requestTemperatures(); |
- | | + | float temp_inroom |
- | R = (-R1 * value)/ | + | lcd.clear(); |
- | temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0 | + | lcd.print(" |
- | | + | lcd.println(temp_outodor, |
- | + | lcd.print("In room: "); | |
- | roms = ds.scan() | + | lcd.print(temp_inroom, 1); |
- | ds.convert_temp() | + | delay(1000); |
- | temp = ds.read_temp(roms[0]) | + | } |
- | inroom_temp = round(temp, | + | |
- | + | ||
- | | + | |
- | print(' | + | |
- | | + | |
- | lcd.clear() | + | |
- | lcd.putstr("Outodor: " | + | |
- | lcd.move_to(0,1) | + | |
- | | + | |
- | + | ||
- | time.sleep(5) | + | |
</ | </ | ||
- | Код программы состоит из кода двух экспериментов, | + | Код программы состоит из кода двух экспериментов, |
Сначала подключаем необходимые библиотеки: | Сначала подключаем необходимые библиотеки: | ||
- | < | + | < |
- | from machine import Pin, I2C | + | #include < |
- | from esp8266_i2c_lcd import I2cLcd | + | #include < |
- | import time | + | #include < |
- | import math | + | |
- | import onewire | + | |
- | import ds18x20 | + | |
</ | </ | ||
- | Определяем константы, необходимые для | + | Задаем псевдонимы для |
- | < | + | < |
- | Bcoef = 3950 | + | #define ACD_PIN A0 |
- | R1 = 10000 | + | #define BUS_PIN 12 |
- | Rtnom = 10000 | + | #define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT5; |
- | T0 = 273.15 | + | |
</ | </ | ||
- | Создаем объекты | + | Определяем константы, необходимые для вычисления температуры с помощью терморезистора (подробно разбиралось в [[products:laboratory_iot_c: |
- | < | + | < |
- | adc = machine.ADC(0) | + | const int Bcoef = 3950; |
- | ow = onewire.OneWire(Pin(12)) | + | const int R1 = 10000; |
- | ds = ds18x20.DS18X20(ow) | + | const int Rtnom = 10000; |
+ | const float T0 = 273.15; | ||
</ | </ | ||
- | Определяем адрес [[products: | + | Создаем объекты шины 1-Wire, датчика DS18B20 и дисплея: |
- | < | + | < |
- | DEFAULT_I2C_ADDR | + | OneWire oneWire(BUS_PIN); |
+ | DallasTemperature sensors(& | ||
+ | LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2); | ||
</ | </ | ||
- | Создаем объект шины I2C и настраиваем ее. Создаем объект | + | В функции '' |
- | < | + | < |
- | i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) | + | |
- | lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, | + | lcd.init(); |
- | lcd.backlight_on() | + | lcd.setBacklight(0); |
</ | </ | ||
В основном цикле программы мы получаем данные с АЦП, к которому подключен делитель напряжения с нижнем плече с термистором: | В основном цикле программы мы получаем данные с АЦП, к которому подключен делитель напряжения с нижнем плече с термистором: | ||
- | < | + | < |
- | value = adc.read() | + | |
</ | </ | ||
- | Определяем сопротивление термистора, | + | Определяем сопротивление термистора, |
- | < | + | < |
- | | + | float R2 = (-R1 * value) / (value - 1023); |
- | | + | float temp_outodor |
- | outodor_temp = round(temp, | + | |
</ | </ | ||
- | Считываем температуру из датчика DS18B20, округляем температуру до десятых (1 знак после десятичной точки) | + | Считываем температуру из датчика DS18B20 и сохраняем в переменной '' |
- | < | + | < |
- | roms = ds.scan() | + | |
- | | + | float temp_inroom |
- | temp = ds.read_temp(roms[0]) | + | |
- | inroom_temp = round(temp, | + | |
</ | </ | ||
- | Выводим температуру в комнате и на улице в терминал. Перед выводом температур преобразовываем их из чисел в строки с помощью оператора '' | + | '' |
- | < | + | < |
print(" | print(" | ||
print(' | print(' | ||
- | </ | + | </ |
- | Очищаем дисплей (при этом курсор дисплея перемещается в верхний левый угол), выводим строку с информацией о температуре на улице. | + | Очищаем дисплей (при этом курсор дисплея перемещается в верхний левый угол), выводим строку с информацией о температуре на улице. Функция '' |
- | < | + | < |
- | lcd.clear() | + | lcd.clear(); |
- | lcd.putstr(" | + | lcd.print(" |
+ | lcd.println(temp_outodor, | ||
</ | </ | ||
Перемещаем курсор дисплея на нулевой (самый левый) символ второй строки и выводим информацию о температуре в комнате: | Перемещаем курсор дисплея на нулевой (самый левый) символ второй строки и выводим информацию о температуре в комнате: | ||
- | < | + | < |
- | lcd.move_to(0, | + | lcd.print("In room: "); |
- | lcd.putstr("In room: " | + | lcd.print(temp_inroom, |
</ | </ | ||
- | Пауза на 5 секунд перед следующим измерением: | + | Пауза на 1 секунду перед следующим измерением: |
- | < | + | < |
- | | + | |
</ | </ |