Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp42 [2024/12/01 15:40] – [Программный код эксперимента] labuser30products:laboratory_iot_c:exp42 [2024/12/01 15:59] (текущий) – [Программный код эксперимента] labuser30
Строка 40: Строка 40:
  
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
-<file python Exp42.py[enable_line_numbers="2", start_line_numbers_at="1"]> +<file arduino Exp42.ino[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 +#include <LittleFS.h>
-import onewire +
-import ds18x20 +
-import re+
  
-_init()+#define ACD_PIN A0 
 +#define BUS_PIN 12 
 +#define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT
  
-Bcoef = 3950 +const int Bcoef = 3950; 
-R1 = 10000 +const int R1 = 10000; 
-Rtnom = 10000 +const int Rtnom = 10000; 
-T0 = 273.15+const float T0 = 273.15;
  
-adc = machine.ADC(0+OneWire oneWire(BUS_PIN); 
-ow = onewire.OneWire(Pin(12)+DallasTemperature sensors(&oneWire); 
-ds = ds18x20.DS18X20(ow)+LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2);
  
 +void setup() {
 +  Serial.begin(9600);
 +  Serial.println();
 +  sensors.begin();
 +  lcd.init(); 
 +  lcd.setBacklight(0); 
 +  
 +  LittleFS.format();
 +  LittleFS.begin();
 +  
 +  Serial.print("Writing data to file");
 +  
 +  for(int i = 0; i < 30; i++) {
 +    int value = analogRead(ACD_PIN);
 +    float R2 = (-R1 * value) / (value - 1023);
 +    float temp_outodor = 1 / (log(R2 / Rtnom) / Bcoef + 1/(25 + T0)) - T0;
  
-DEFAULT_I2C_ADDR 0x3F # Или 0x27 в зависимости от модели микросхемы на плате+    sensors.requestTemperatures();  
 +    float temp_inroom sensors.getTempCByIndex(0);
  
- +    lcd.clear()
-i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000+    lcd.print("Outodor: "); 
-lcd = I2cLcd(i2cDEFAULT_I2C_ADDR, 2, 16+    lcd.println(temp_outodor1); 
-lcd.backlight_on() +    lcd.print("In room: "); 
- +    lcd.print(temp_inroom, 1);   
- +     
-while True: +    String s String(temp_outodor, 1) + ";"  String(temp_inroom, 1) + "\n"; 
-    value = adc.read() +    s.replace('.', ','); 
- +     
-    = (-R1 * value)/(value-1023) +    File f LittleFS.open("/temp_data.csv""a"); 
-    temp = / (math.log(R / Rtnom/ Bcoef 1/(25+T0)) -T0 +    f.print(s); 
-    outodor_temp = round(temp,1) +    f.close();
- +
-    roms = ds.scan() +
-    ds.convert_temp() +
-    temp ds.read_temp(roms[0]) +
-    inroom_temp = round(temp,1) +
- +
-    print("Outodor: " + str(outodor_temp)+
-    print('In room: ' + str(inroom_temp))+
          
-    lcd.clear(+    Serial.print("."); 
-    lcd.putstr("Outodor: " + str(outodor_temp)+    delay(2000) 
-    lcd.move_to(0,1+  }
-    lcd.putstr("In room: " + str(inroom_temp))+
  
-    string_inroom_temp = str(inroom_temp+  Serial.println(); 
-    string_outodor_temp = str(outodor_temp)+  Serial.println("Reading data from file");
  
-    string_inroom_temp re.sub('\.'',', string_inroom_temp+  File f LittleFS.open("/temp_data.csv""r"); 
-    string_outodor_temp = re.sub('\.', ',', string_outodor_temp)+  while(f.available()) Serial.write(f.read()); 
 +  f.close(); 
 +}
  
-    f = open('temp_data.csv', 'a'+void loop() { 
-    written = f.write(string_inroom_temp + ';' + string_outodor_temp + "\n"+}
-    f.close() +
- +
-    time.sleep(5)+
 </file> </file>
  
-По сравнений с прошлой программой мы добавили код для работы с файлом и подготовки данных для записи в него. Рассмотрим эти части подробнее.+По сравнений с прошлой программой мы перенесли код работы с датчиками из бесконечного цикла в конечный, добавили код для работы с файлом и подготовки данных для записи в него. Рассмотрим эти части подробнее.
  
-Переводим температуру из чисел в строки: +Создаем строку из чисел для записи в файл. Строка состоит из температуры в комнате, символа разделителя данных '';'', температуры на улице и символа перехода на новую строку ''\n''. Без ''\n'' всё записывалось бы в одну строку. 
-<code python[enable_line_numbers="2", start_line_numbers_at="49"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="45"]> 
-    string_inroom_temp str(inroom_temp) +  String s String(temp_outodor, 1+ ";" +  String(temp_inroom, 1+ "\n";
-    string_outodor_temp = str(outodor_temp)+
 </code> </code>
  
-Python использует точку как десятичный разделитель. Однако русские версии программ, вроде Excel и OpenOffice Calc используют запятую. Поэтому, чтобы в дальнейшем работать с файлом в этих программах, нам нужно заменить точку на запятую: +Arduino использует точку как десятичный разделитель. Однако русские версии программ, вроде Excel и OpenOffice Calc используют запятую. Поэтому, чтобы в дальнейшем работать с файлом в этих программах, нам нужно заменить точку на запятую: 
-<code python[enable_line_numbers="2", start_line_numbers_at="52"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="46"]> 
-    string_inroom_temp = re.sub('\.', ',', string_inroom_temp) +  s.replace('.', ',');
-    string_outodor_temp = re.sub('\.', ',', string_outodor_temp)+
 </code> </code>
  
 Далее идет работа с файлом. Открываем файл. Дескриптор открытого файла оказывается в переменной f.  Далее идет работа с файлом. Открываем файл. Дескриптор открытого файла оказывается в переменной f. 
-<code python[enable_line_numbers="2", start_line_numbers_at="55"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="48"]> 
-    f = open('temp_data.csv''a')+  File f = LittleFS.open("/temp_data.csv""a");
 </code> </code>
  
Строка 124: Строка 128:
  
 Записываем в файл строку: Записываем в файл строку:
-<code python[enable_line_numbers="2", start_line_numbers_at="56"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="49"]> 
-    written = f.write(string_inroom_temp + ';' + string_outodor_temp + "\n")+  f.print(s);
 </code> </code>
-Строка состоит из температуры в комнате, символа разделителя данных '';'', температуры на улице и символа перехода на новую строку ''\n''. Без ''\n'' всё записывалось бы в одну строку. 
  
 После записи закрываем файл: После записи закрываем файл:
-<code python[enable_line_numbers="2", start_line_numbers_at="57"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="50"]> 
-    f.close()+  f.close();
 </code> </code>
  
-Запустим программу и дадим ей некоторое время поработать, чтобы она успела накопить несколько измерений в файле. После чего проверим что в него записалось. Для этого открываем файловый менеджер <span menu> +Далее открываем файл уже в режиме чтения - ''r'', в цикле ''while'' печатаем строки файла в последовательный порт пока файл не закончиться, и закрываем файл.   
-<span menu-item>Device</span+<code arduino[enable_line_numbers="2", start_line_numbers_at="50"]
-<span menu-item>Filemanager</span> +  File f = LittleFS.open("/temp_data.csv", "r"); 
-</spanили иконка {{:products:2020-05-04_15-35-38.png?nolink|}} +  while(f.available()) Serial.write(f.read()); 
- +  f.close(); 
-Открывается окно файлового менеджера: +</code>
-{{ :products:esp-iot:2020-05-23_16-12-37.png?nolink |}}+
  
-Выбираем наш файл и нажимаем ''Download...''. Указываем место для сохранения и сохраняем. Для просмотра содержимого откроем файл с помощью обычного Блокнота:+Запустим программу и дождемся ее выполнения. Это займет 1 минуту, после чего записанные в файл данные будут выведены в последовательный порт.
  
-{{ :products:esp-iot:2020-05-23_16-17-59.png?nolink |}}+К сожалению при использовании Arduino IDE отсутствует удобный способ скачать созданный файл на компьютерПоэтому предлагаем создать с помощью блокнота текстовый файл, скопировать в него выведенные в последовательный порт данные и сохранить файл с расширением .csv.  
  
-В файле видим то, чего и ожидали. Данные о температуре в формате CSV. Читать такие данные достаточно неудобно, поэтому откроем их с помощью Excel:+Читать такие данные достаточно неудобно, поэтому откроем их с помощью Excel:
  
 {{ :products:esp-iot:2020-05-23_16-20-37.png?nolink |}} {{ :products:esp-iot:2020-05-23_16-20-37.png?nolink |}}