Различия

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

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

Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp42 [2024/12/01 14:14] – создано labuser30products:laboratory_iot_c:exp42 [2024/12/01 15:59] (текущий) – [Программный код эксперимента] labuser30
Строка 19: Строка 19:
 //Рисунок 1. Монтажная схема эксперимента// //Рисунок 1. Монтажная схема эксперимента//
  
-==== Программный код эксперимента ==== +===== Эксперимент 42. Запись данных в файл. Двухзонный регистратор =====
-<file python Exp42.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 +
-import re+
  
-_init()+Добавим функцию записи данных в файл. Для записи выберем формат файла CSV.  
 +CSV (от англ. Comma-Separated Values — значения, разделённые запятыми— текстовый формат, предназначенный для представления табличных данных. Строка таблицы соответствует строке текста, которая содержит одно или несколько полей, разделенных запятыми.
  
-Bcoef = 3950 +Одна строка файла будет соответствовать одному измерению температурыПервым числом будет температура в комнате, а вторым — на улице. Разделителем данных в строке будет символ точки с запятой. Пример записей в файл:
-R1 = 10000 +
-Rtnom = 10000 +
-T0 = 273.15+
  
-adc = machine.ADC(0) +<code> 
-ow = onewire.OneWire(Pin(12)) +23,2;12,0 
-ds = ds18x20.DS18X20(ow)+24,2;13,0 
 +24,1;13,2 
 +</code>
  
 +Формат CSV имеет широкое распространение, его можно открыть в Excel или OpenOffice Calc и построить графики. Что мы и сделаем.
  
-DEFAULT_I2C_ADDR 0x3F # Или 0x27 в зависимости от модели микросхемы на плате+==== Схема эксперимента ==== 
 +Схема эксперимента остается неизменной 
 +{{ :products:esp-iot:exp19.1_mon.png?direct&600 |}} 
 +//Рисунок 1. Монтажная схема эксперимента//
  
 +==== Программный код эксперимента ====
 +<file arduino Exp42.ino[enable_line_numbers="2", start_line_numbers_at="1"]>
 +#include <OneWire.h>
 +#include <DallasTemperature.h>
 +#include <LCDI2C_Multilingual.h>
 +#include <LittleFS.h>
  
-i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) +#define ACD_PIN A0 
-lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16) +#define BUS_PIN 12 
-lcd.backlight_on()+#define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT
  
 +const int Bcoef = 3950;
 +const int R1 = 10000;
 +const int Rtnom = 10000;
 +const float T0 = 273.15;
  
-while True: +OneWire oneWire(BUS_PIN); 
-    value = adc.read()+DallasTemperature sensors(&oneWire); 
 +LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2);
  
-    R = (-R1 * value)/(value-1023) +void setup() { 
-    temp = 1 / (math.log(/ Rtnom) / Bcoef + 1/(25+T0)) -T0 +  Serial.begin(9600); 
-    outodor_temp = round(temp,1)+  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;
  
-    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)+
  
-    print("Outodor:+ str(outodor_temp)+    lcd.clear(); 
-    print('In room: ' + str(inroom_temp))+    lcd.print("Outodor: "); 
 +    lcd.println(temp_outodor, 1); 
 +    lcd.print("In room: ")
 +    lcd.print(temp_inroom, 1);  
          
-    lcd.clear() +    String s = String(temp_outodor, 1";" +  String(temp_inroom, 1+ "\n"; 
-    lcd.putstr("Outodor: " + str(outodor_temp)+    s.replace('.'','); 
-    lcd.move_to(0,1+     
-    lcd.putstr("In room: + str(inroom_temp)) +    File f = LittleFS.open("/temp_data.csv", "a"); 
- +    f.print(s)
-    string_inroom_temp = str(inroom_temp+    f.close(); 
-    string_outodor_temp = str(outodor_temp)+     
 +    Serial.print("."); 
 +    delay(2000);  
 +  }
  
-    string_inroom_temp = re.sub('\.', ',', string_inroom_temp+  Serial.println(); 
-    string_outodor_temp = re.sub('\.', ',', string_outodor_temp)+  Serial.println("Reading data from file");
  
-    f = open('temp_data.csv''a'+  File f = LittleFS.open("/temp_data.csv""r"); 
-    written = f.write(string_inroom_temp + ';' + string_outodor_temp + "\n"+  while(f.available()) Serial.write(f.read()); 
-    f.close()+  f.close()
 +}
  
-    time.sleep(5)+void loop() 
 +}
 </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>
  
Строка 104: Строка 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 |}}