Различия

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

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

Следующая версия
Предыдущая версия
products:laboratory_iot:exp42 [2020/05/23 15:50] – создано labuser29products:laboratory_iot:exp42 [2024/12/01 14:13] (текущий) labuser30
Строка 4: Строка 4:
 CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Строка таблицы соответствует строке текста, которая содержит одно или несколько полей, разделенных запятыми. CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Строка таблицы соответствует строке текста, которая содержит одно или несколько полей, разделенных запятыми.
  
-Одна строка файла будет соответствовать одному измерению температуры. Первым числом сбудет температура в комнате, а вторым — на улице. Разделителем данных в строке будет символ точки с запятой. Пример записей в файл:+Одна строка файла будет соответствовать одному измерению температуры. Первым числом будет температура в комнате, а вторым — на улице. Разделителем данных в строке будет символ точки с запятой. Пример записей в файл:
  
 <code> <code>
Строка 11: Строка 11:
 24,1;13,2 24,1;13,2
 </code> </code>
 +
 +Формат CSV имеет широкое распространение, его можно открыть в Excel или OpenOffice Calc и построить графики. Что мы и сделаем.
 +
 +==== Схема эксперимента ====
 +Схема эксперимента остается неизменной
 +{{ :products:esp-iot:exp19.1_mon.png?direct&600 |}}
 +//Рисунок 1. Монтажная схема эксперимента//
 +
 +==== Программный код эксперимента ====
 +<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()
 +
 +Bcoef = 3950
 +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 в зависимости от модели микросхемы на плате
 +
 +
 +i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
 +lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
 +lcd.backlight_on()
 +
 +
 +while True:
 +    value = adc.read()
 +
 +    R = (-R1 * value)/(value-1023)
 +    temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0
 +    outodor_temp = round(temp,1)
 +
 +    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()
 +    lcd.putstr("Outodor: " + str(outodor_temp))
 +    lcd.move_to(0,1)
 +    lcd.putstr("In room: " + str(inroom_temp))
 +
 +    string_inroom_temp = str(inroom_temp)
 +    string_outodor_temp = str(outodor_temp)
 +
 +    string_inroom_temp = re.sub('\.', ',', string_inroom_temp)
 +    string_outodor_temp = re.sub('\.', ',', string_outodor_temp)
 +
 +    f = open('temp_data.csv', 'a')
 +    written = f.write(string_inroom_temp + ';' + string_outodor_temp + "\n")
 +    f.close()
 +
 +    time.sleep(5)
 +</file>
 +
 +По сравнений с прошлой программой мы добавили код для работы с файлом и подготовки данных для записи в него. Рассмотрим эти части подробнее.
 +
 +Переводим температуру из чисел в строки:
 +<code python[enable_line_numbers="2", start_line_numbers_at="49"]>
 +    string_inroom_temp = str(inroom_temp)
 +    string_outodor_temp = str(outodor_temp)
 +</code>
 +
 +Python использует точку как десятичный разделитель. Однако русские версии программ, вроде Excel и OpenOffice Calc используют запятую. Поэтому, чтобы в дальнейшем работать с файлом в этих программах, нам нужно заменить точку на запятую:
 +<code python[enable_line_numbers="2", start_line_numbers_at="52"]>
 +    string_inroom_temp = re.sub('\.', ',', string_inroom_temp)
 +    string_outodor_temp = re.sub('\.', ',', string_outodor_temp)
 +</code>
 +
 +Далее идет работа с файлом. Открываем файл. Дескриптор открытого файла оказывается в переменной f. 
 +<code python[enable_line_numbers="2", start_line_numbers_at="55"]>
 +    f = open('temp_data.csv', 'a')
 +</code>
 +
 +Файл открывается с помощью оператора ''open()'' в качестве параметров ему передается имя файла и опции, описывающие что мы собираемся делать с файлом. Здесь может быть указано ''r'' для чтения, ''w'' для записи файла и ''a'' для дополнения файла. Мы используем ''a'', в таком случае при открытии файл не будет очищен, а будет дополняться новыми записями в конце. Если файл не существует, то при открытии с помощью ''w'' или ''a'' файл будет автоматически создан.
 +
 +Записываем в файл строку:
 +<code python[enable_line_numbers="2", start_line_numbers_at="56"]>
 +    written = f.write(string_inroom_temp + ';' + string_outodor_temp + "\n")
 +</code>
 +Строка состоит из температуры в комнате, символа разделителя данных '';'', температуры на улице и символа перехода на новую строку ''\n''. Без ''\n'' всё записывалось бы в одну строку.
 +
 +После записи закрываем файл:
 +<code python[enable_line_numbers="2", start_line_numbers_at="57"]>
 +    f.close()
 +</code>
 +
 +Запустим программу и дадим ей некоторое время поработать, чтобы она успела накопить несколько измерений в файле. После чего проверим что в него записалось. Для этого открываем файловый менеджер <span menu>
 +<span menu-item>Device</span>
 +<span menu-item>Filemanager</span>
 +</span> или иконка {{:products:2020-05-04_15-35-38.png?nolink|}}
 +
 +Открывается окно файлового менеджера:
 +{{ :products:esp-iot:2020-05-23_16-12-37.png?nolink |}}
 +
 +Выбираем наш файл и нажимаем ''Download...''. Указываем место для сохранения и сохраняем. Для просмотра содержимого откроем файл с помощью обычного Блокнота:
 +
 +{{ :products:esp-iot:2020-05-23_16-17-59.png?nolink |}}
 +
 +В файле видим то, чего и ожидали. Данные о температуре в формате CSV. Читать такие данные достаточно неудобно, поэтому откроем их с помощью Excel:
 +
 +{{ :products:esp-iot:2020-05-23_16-20-37.png?nolink |}}
 +
 +Excel автоматически распознал формат CSV и занес данные с "комнатного" датчика в столбец A, и данные с "уличного" датчика в столбец B. Построим графики температуры:
 +<span menu>
 +<span menu-item>Вставка</span>
 +<span menu-item>График</span>
 +</span>
 +
 +{{ :products:esp-iot:2020-05-23_16-23-50.png?nolink |}}
 +
 +Датчик DS18B20 измерял у нас температуру в комнате, а термистор мы через некоторое время после начала эксперимента погрузили в стакан с теплой водой. Температура термистора резко возросла. Вода в стакане постепенно остывала, что мы хорошо видим на графике.