Различия

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

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

Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp41 [2024/11/24 12:07] – создано labuser30products:laboratory_iot_c:exp41 [2024/12/01 14:08] (текущий) labuser30
Строка 1: Строка 1:
-==== Программный код эксперимента ==== +===== Эксперимент 41. Двухзонный термометр с LCD дисплеем =====
-<file python Exp41.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 +
-import onewire +
-import ds18x20 +
-_init()+
  
-Bcoef = 3950 +Теперь у нас есть опыт создания аналогового термометра с термистором в качестве датчика, и цифрового с датчиком DS18B20. Почему бы не объединить эти датчики, чтобы сделать двухзонный термометр. Учитывая исполнение датчиков, с помощью DS18B20 можно измерять температуру в комнате, а термистор в корпусе вывести на улицу, чтобы видеть на дисплее данные о температуре в комнате и на улице одновременно.
-R1 = 10000 +
-Rtnom = 10000 +
-T0 = 273.15+
  
-adc machine.ADC(0) +==== Схема эксперимента ====
-ow onewire.OneWire(Pin(12)) +
-ds ds18x20.DS18X20(ow)+
  
-DEFAULT_I2C_ADDR = 0x3F # Или 0x27 в зависимости от модели микросхемы на плате+{{ :products:esp-iot:exp19.1_mon.png?direct&600 |}} 
 +//Рисунок 1. Монтажная схема эксперимента//
  
-i2c I2C(scl=Pin(5), sda=Pin(4), freq=400000) +==== Программный код эксперимента ==== 
-lcd I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16) +<file arduino Exp41.ino[enable_line_numbers="2"start_line_numbers_at="1"]> 
-lcd.backlight_on()+#include <OneWire.h> 
 +#include <DallasTemperature.h> 
 +#include <LCDI2C_Multilingual.h>
  
 +#define ACD_PIN A0
 +#define BUS_PIN 12
 +#define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT
  
-while True: +const int Bcoef = 3950; 
-    value adc.read()+const int R1 = 10000; 
 +const int Rtnom = 10000; 
 +const float T0 273.15;
  
-    R = (-R1 * value)/(value-1023+OneWire oneWire(BUS_PIN); 
-    temp = 1 / (math.log(R / Rtnom/ Bcoef + 1/(25+T0)) -T0 +DallasTemperature sensors(&oneWire); 
-    outodor_temp = round(temp,1)+LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 162);
  
-    roms = ds.scan() +void setup() { 
-    ds.convert_temp() +  sensors.begin(); 
-    temp = ds.read_temp(roms[0]+  lcd.init() 
-    inroom_temp = round(temp,1)+  lcd.setBacklight(0);  
 +}
  
-    print("Outodor: " + str(inroom_temp)+void loop() { 
-    print('In room: ' + str(outodor_temp)+  int value = analogRead(ACD_PIN); 
-     +  float R2 = (-R1 * value) / (value - 1023); 
-    lcd.clear() +  float temp_outodor = 1 / (log(R2 / Rtnom/ Bcoef + 1/(25 T0)) - T0; 
-    lcd.putstr("Outodor:str(outodor_temp)) + 
-    lcd.move_to(0,1+  sensors.requestTemperatures() 
-    lcd.putstr("In room: " + str(inroom_temp))+  float temp_inroom = sensors.getTempCByIndex(0);
  
-    time.sleep(5)+  lcd.clear()
 +  lcd.print("Outodor: "); 
 +  lcd.println(temp_outodor, 1); 
 +  lcd.print("In room: "); 
 +  lcd.print(temp_inroom, 1);   
 +  delay(1000);  
 +}
 </file> </file>
  
-Код программы состоит из кода двух экспериментов, посвещенных [[products:laboratory_iot:exp33|термометру на термисторе]] и [[products:laboratory_iot:exp40|термометру на DS18B20]].+Код программы состоит из кода двух экспериментов, посвящённых [[products:laboratory_iot_c:exp33|термометру на термисторе]] и [[products:laboratory_iot_c:exp40|термометру на DS18B20]].
  
 Сначала подключаем необходимые библиотеки: Сначала подключаем необходимые библиотеки:
-<code python[enable_line_numbers="2", start_line_numbers_at="1"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="1"]> 
-from machine import Pin, I2C +#include <OneWire.h> 
-from esp8266_i2c_lcd import I2cLcd +#include <DallasTemperature.h> 
-import time +#include <LCDI2C_Multilingual.h>
-import math +
-import onewire +
-import ds18x20+
 </code> </code>
  
-Определяем константы, необходимые для вычисления температуры с помощью терморезистора (подробно разбиралось в [[products:laboratory_iot:exp32|Проекте  3. "Термометр"]])+Задаем псевдонимы для пина АЦП, пина шины 1-Wire и адреса дисплея.  
-<code python[enable_line_numbers="2", start_line_numbers_at="9"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="3"]> 
-Bcoef = 3950 +#define ACD_PIN A0 
-R1 = 10000 +#define BUS_PIN 12 
-Rtnom = 10000 +#define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT5;
-T0 = 273.15+
 </code> </code>
  
-Создаем объекты АЦПшины 1-Wire на выводе 12 и датчика DS18B20+Определяем константы, необходимые для вычисления температуры с помощью терморезистора (подробно разбиралось в [[products:laboratory_iot_c:exp32|Проекте  3. "Термометр"]]). 
-<code python[enable_line_numbers="2", start_line_numbers_at="14"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="9"]> 
-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;
 </code> </code>
  
-Определяем адрес [[products:laboratory_iot:lcd1602|контроллера LCD дисплея]] на [[theory:i2c|шине I2C]]+Создаем объекты шины 1-Wire, датчика DS18B20 и дисплея: 
-<code python[enable_line_numbers="2", start_line_numbers_at="18"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="14"]> 
-DEFAULT_I2C_ADDR = 0x3F+OneWire oneWire(BUS_PIN); 
 +DallasTemperature sensors(&oneWire); 
 +LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2);
 </code> </code>
  
-Создаем объект шины I2C и настраиваем ее. Создаем объект LCD дисплея и настраиваем его. Включаем подсветку дисплея: +В функции ''setup()'' инициализируем объекты датчика и дисплеявключаем подсветку. 
-<code python[enable_line_numbers="2", start_line_numbers_at="20"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="19"]> 
-i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000+  sensors.begin(); 
-lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16+  lcd.init() 
-lcd.backlight_on()+  lcd.setBacklight(0)
 </code> </code>
  
 В основном цикле программы мы получаем данные с АЦП, к которому подключен делитель напряжения с нижнем плече с термистором: В основном цикле программы мы получаем данные с АЦП, к которому подключен делитель напряжения с нижнем плече с термистором:
-<code python[enable_line_numbers="2", start_line_numbers_at="26"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="25"]> 
-    value = adc.read()+  int value = analogRead(ACD_PIN);
 </code> </code>
  
-Определяем сопротивление термистора, из которого вычисляем температуру ([[products:laboratory_iot:exp32|подробно рассматривалось в эксперименте 32]]). Округляем температуру до десятых (1 знак после десятичной точки) и сохраняем в переменной ''outodor_temp'': +Определяем сопротивление термистора, из которого вычисляем температуру ([[products:laboratory_iot_c:exp32|подробно рассматривалось в эксперименте 32]])  и сохраняем в переменной ''temp_outodor'': 
-<code python[enable_line_numbers="2", start_line_numbers_at="28"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="26"]> 
-    = (-R1 * value)/(value-1023) +  float R2 = (-R1 * value) / (value - 1023); 
-    temp = 1 / (math.log(/ Rtnom) / Bcoef + 1/(25+T0)) -T0 +  float temp_outodor = 1 / (log(R2 / Rtnom) / Bcoef + 1/(25 + T0)) - T0;
-    outodor_temp = round(temp,1)+
 </code> </code>
  
-Считываем температуру из датчика DS18B20, округляем температуру до десятых (1 знак после десятичной точки) и сохраняем в переменной ''inroom_temp'': +Считываем температуру из датчика DS18B20 и сохраняем в переменной ''temp_inroom'': 
-<code python[enable_line_numbers="2", start_line_numbers_at="32"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="29"]> 
-    roms = ds.scan() +  sensors.requestTemperatures() 
-    ds.convert_temp() +  float temp_inroom sensors.getTempCByIndex(0);
-    temp ds.read_temp(roms[0]) +
-    inroom_temp = round(temp,1)+
 </code> </code>
  
-Выводим температуру в комнате и на улице в терминал. Перед выводом температур преобразовываем их из чисел в строки с помощью оператора ''str()'': +''!!!!!!!Выводим температуру в комнате и на улице в терминал. Перед выводом температур преобразовываем их из чисел в строки с помощью оператора ''str()'': 
-<code python[enable_line_numbers="2", start_line_numbers_at="37"]>+<code arduino[enable_line_numbers="2", start_line_numbers_at="37"]>
     print("Outodor: " + str(inroom_temp))     print("Outodor: " + str(inroom_temp))
     print('In room: ' + str(outodor_temp))     print('In room: ' + str(outodor_temp))
-</code>+</code>''
  
-Очищаем дисплей (при этом курсор дисплея перемещается в верхний левый угол), выводим строку с информацией о температуре на улице. +Очищаем дисплей (при этом курсор дисплея перемещается в верхний левый угол), выводим строку с информацией о температуре на улице. Функция ''lcd.println()'' переводит курсор на следующую строку после вывода заданного текста
-<code python[enable_line_numbers="2", start_line_numbers_at="40"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="32"]> 
-    lcd.clear() +  lcd.clear(); 
-    lcd.putstr("Outodor:+ str(outodor_temp))+  lcd.print("Outodor: ")
 +  lcd.println(temp_outodor, 1);
 </code> </code>
  
 Перемещаем курсор дисплея на нулевой (самый левый) символ второй строки и выводим информацию о температуре в комнате: Перемещаем курсор дисплея на нулевой (самый левый) символ второй строки и выводим информацию о температуре в комнате:
-<code python[enable_line_numbers="2", start_line_numbers_at="42"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="35"]> 
-    lcd.move_to(0,1) +  lcd.print("In room: "); 
-    lcd.putstr("In room: " + str(inroom_temp))+  lcd.print(temp_inroom, 1);  
 </code> </code>
  
-Пауза на секунд перед следующим измерением: +Пауза на секунду перед следующим измерением: 
-<code python[enable_line_numbers="2", start_line_numbers_at="45"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="37"]> 
-    time.sleep(5)+    delay(1000);
 </code> </code>