Это старая версия документа!


Эксперимент 42. Запись данных в файл. Двухзонный регистратор

Добавим функцию записи данных в файл. Для записи выберем формат файла CSV. CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Строка таблицы соответствует строке текста, которая содержит одно или несколько полей, разделенных запятыми.

Одна строка файла будет соответствовать одному измерению температуры. Первым числом сбудет температура в комнате, а вторым — на улице. Разделителем данных в строке будет символ точки с запятой. Пример записей в файл:

23,2;12,0
24,2;13,0
24,1;13,2

Формат CSV имеет широкое распространение, его можно открыть в Excel или OpenOffice Calc и построить графики. Что мы и сделаем.

Схема эксперимента

Схема эксперимента остается неизменной Рисунок 1. Монтажная схема эксперимента

Программный код эксперимента

Exp42.py
  1. from machine import Pin, I2C
  2. from esp8266_i2c_lcd import I2cLcd
  3. import time
  4. import math
  5. import onewire
  6. import ds18x20
  7. import re
  8.  
  9. _init()
  10.  
  11. Bcoef = 3950
  12. R1 = 10000
  13. Rtnom = 10000
  14. T0 = 273.15
  15.  
  16. adc = machine.ADC(0)
  17. ow = onewire.OneWire(Pin(12))
  18. ds = ds18x20.DS18X20(ow)
  19.  
  20.  
  21. DEFAULT_I2C_ADDR = 0x3F
  22.  
  23.  
  24. i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
  25. lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
  26. lcd.backlight_on()
  27.  
  28.  
  29. while True:
  30. value = adc.read()
  31.  
  32. R = (-R1 * value)/(value-1023)
  33. temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0
  34. outodor_temp = round(temp,1)
  35.  
  36. roms = ds.scan()
  37. ds.convert_temp()
  38. temp = ds.read_temp(roms[0])
  39. inroom_temp = round(temp,1)
  40.  
  41. print("Outodor: " + str(outodor_temp))
  42. print('In room: ' + str(inroom_temp))
  43.  
  44. lcd.clear()
  45. lcd.putstr("Outodor: " + str(outodor_temp))
  46. lcd.move_to(0,1)
  47. lcd.putstr("In room: " + str(inroom_temp))
  48.  
  49. string_inroom_temp = str(inroom_temp)
  50. string_outodor_temp = str(outodor_temp)
  51.  
  52. string_inroom_temp = re.sub('\.', ',', string_inroom_temp)
  53. string_outodor_temp = re.sub('\.', ',', string_outodor_temp)
  54.  
  55. f = open('temp_data.csv', 'a')
  56. written = f.write(string_inroom_temp + ';' + string_outodor_temp + "\n")
  57. f.close()
  58.  
  59. time.sleep(5)

По сравнений с прошлой программой мы добавили код для работы с файлом и подготовки данных для записи в него. Рассмотрим эти части подробнее.

Переводим температуру из чисел в строки:

  1. string_inroom_temp = str(inroom_temp)
  2. string_outodor_temp = str(outodor_temp)

Python использует точку как десятичный разделитель. Однако русские версии программ, вроде Excel и OpenOffice Calc использут запятую. Поэтому, чтобы в дальнейшем работать с файлом в этих программах, нам нужно заменить точку на запятую:

  1. string_inroom_temp = re.sub('\.', ',', string_inroom_temp)
  2. string_outodor_temp = re.sub('\.', ',', string_outodor_temp)

Далее идет работа с файлом. Открываем файл. Дескриптор открытого файла оказывается в переменной f.

  1. f = open('temp_data.csv', 'a')

Файл открывается с помощью оператора open() в качестве параметров ему передается имя файла и опции, описывающие что мы собираемся делать с файлом. Здесь может быть указано r для чтения, w для записи файла и a для дополнения файла. Мы испольуем a, в таком случае при открытии файл не будет очищен, а будет дополняться новыми записями в конце. Если файл не существует, то при открытии с помощью w или a файл будет автоматически создан.

Записываем в файл строку:

  1. written = f.write(string_inroom_temp + ';' + string_outodor_temp + "\n")

Строка состоит из температуры в комнате, символа разделителя данных ;, температуры на улице и символа перехода на новую строку \n. Без \n всё записывалось бы в одну строку.

После записи закрываем файл:

  1. f.close()

Запустим программу и дадим ей некоторое время поработать, чтобы она успела накопить несколько измерений в файле. После чего проверим что в него записалось. Для этого открываем файловый менеджер Device Filemanager или иконка

Открывается окно файлового менеджера:

Выбираем наш файл и нажимаем Download…. Указываем место для сохранения и сохраняем. Для просмотра содержимого откроем файл с помощью обычного Блокнота: