Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp42 [2024/12/01 15:39] – [Программный код эксперимента] labuser30products:laboratory_iot_c:exp42 [2024/12/01 15:59] (текущий) – [Программный код эксперимента] labuser30
Строка 1: Строка 1:
 +===== Эксперимент 42. Запись данных в файл. Двухзонный регистратор =====
 +
 +Добавим функцию записи данных в файл. Для записи выберем формат файла CSV. 
 +CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Строка таблицы соответствует строке текста, которая содержит одно или несколько полей, разделенных запятыми.
 +
 +Одна строка файла будет соответствовать одному измерению температуры. Первым числом будет температура в комнате, а вторым — на улице. Разделителем данных в строке будет символ точки с запятой. Пример записей в файл:
 +
 +<code>
 +23,2;12,0
 +24,2;13,0
 +24,1;13,2
 +</code>
 +
 +Формат CSV имеет широкое распространение, его можно открыть в Excel или OpenOffice Calc и построить графики. Что мы и сделаем.
 +
 +==== Схема эксперимента ====
 +Схема эксперимента остается неизменной
 +{{ :products:esp-iot:exp19.1_mon.png?direct&600 |}}
 +//Рисунок 1. Монтажная схема эксперимента//
 +
 ===== Эксперимент 42. Запись данных в файл. Двухзонный регистратор ===== ===== Эксперимент 42. Запись данных в файл. Двухзонный регистратор =====
  
Строка 65: Строка 85:
     lcd.print(temp_inroom, 1);       lcd.print(temp_inroom, 1);  
          
-    Serial.print("."); 
-    File f = LittleFS.open("/temp_data.csv", "a"); 
     String s = String(temp_outodor, 1) + ";" +  String(temp_inroom, 1) + "\n";     String s = String(temp_outodor, 1) + ";" +  String(temp_inroom, 1) + "\n";
     s.replace('.', ',');     s.replace('.', ',');
 +    
 +    File f = LittleFS.open("/temp_data.csv", "a");
     f.print(s);     f.print(s);
     f.close();     f.close();
 +    
 +    Serial.print(".");
     delay(2000);      delay(2000); 
   }   }
Строка 84: Строка 106:
 void loop() { void loop() {
 } }
 +</file>
 +
 +По сравнений с прошлой программой мы перенесли код работы с датчиками из бесконечного цикла в конечный, добавили код для работы с файлом и подготовки данных для записи в него. Рассмотрим эти части подробнее.
 +
 +Создаем строку из чисел для записи в файл. Строка состоит из температуры в комнате, символа разделителя данных '';'', температуры на улице и символа перехода на новую строку ''\n''. Без ''\n'' всё записывалось бы в одну строку.
 +<code arduino[enable_line_numbers="2", start_line_numbers_at="45"]>
 +  String s = String(temp_outodor, 1) + ";" +  String(temp_inroom, 1) + "\n";
 +</code>
 +
 +Arduino использует точку как десятичный разделитель. Однако русские версии программ, вроде Excel и OpenOffice Calc используют запятую. Поэтому, чтобы в дальнейшем работать с файлом в этих программах, нам нужно заменить точку на запятую:
 +<code arduino[enable_line_numbers="2", start_line_numbers_at="46"]>
 +  s.replace('.', ',');
 </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>
  
Строка 94: Строка 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 |}}