Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| products:laboratory_iot_c:exp42 [2024/12/01 15:40] – [Программный код эксперимента] labuser30 | products:laboratory_iot_c:exp42 [2024/12/01 15:59] (текущий) – [Программный код эксперимента] labuser30 | ||
|---|---|---|---|
| Строка 40: | Строка 40: | ||
| ==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== | ||
| - | < | + | < |
| - | from machine import Pin, I2C | + | #include < |
| - | from esp8266_i2c_lcd import I2cLcd | + | #include < |
| - | import time | + | #include < |
| - | import math | + | #include < |
| - | 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(& |
| - | ds = ds18x20.DS18X20(ow) | + | LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, |
| + | void setup() { | ||
| + | Serial.begin(9600); | ||
| + | Serial.println(); | ||
| + | sensors.begin(); | ||
| + | lcd.init(); | ||
| + | lcd.setBacklight(0); | ||
| + | | ||
| + | LittleFS.format(); | ||
| + | LittleFS.begin(); | ||
| + | | ||
| + | Serial.print(" | ||
| + | | ||
| + | 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 | + | sensors.requestTemperatures(); |
| + | float temp_inroom | ||
| - | + | lcd.clear(); | |
| - | i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) | + | lcd.print(" |
| - | lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, | + | lcd.println(temp_outodor, 1); |
| - | lcd.backlight_on() | + | lcd.print("In room: "); |
| - | + | | |
| - | + | ||
| - | while True: | + | |
| - | | + | |
| - | + | ||
| - | | + | |
| - | temp = 1 / (math.log(R / Rtnom) / Bcoef + 1/(25+T0)) -T0 | + | |
| - | outodor_temp = round(temp,1) | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | | + | |
| - | inroom_temp = round(temp,1) | + | |
| - | + | ||
| - | print(" | + | |
| - | | + | |
| | | ||
| - | | + | |
| - | lcd.putstr("Outodor: " + str(outodor_temp)) | + | |
| - | | + | } |
| - | | + | |
| - | string_inroom_temp = str(inroom_temp) | + | Serial.println(); |
| - | | + | |
| - | string_inroom_temp | + | File f = LittleFS.open("/ |
| - | | + | |
| + | f.close(); | ||
| + | } | ||
| - | f = open(' | + | void loop() { |
| - | | + | } |
| - | f.close() | + | |
| - | + | ||
| - | time.sleep(5) | + | |
| </ | </ | ||
| - | По сравнений с прошлой программой мы добавили код для работы с файлом и подготовки данных для записи в него. Рассмотрим эти части подробнее. | + | По сравнений с прошлой программой мы перенесли код работы с датчиками из бесконечного цикла в конечный, |
| - | Переводим температуру из чисел в строки: | + | Создаем строку из чисел для записи |
| - | < | + | < |
| - | | + | |
| - | string_outodor_temp = str(outodor_temp) | + | |
| </ | </ | ||
| - | Python | + | Arduino |
| - | < | + | < |
| - | | + | s.replace(' |
| - | string_outodor_temp = re.sub(' | + | |
| </ | </ | ||
| Далее идет работа с файлом. Открываем файл. Дескриптор открытого файла оказывается в переменной f. | Далее идет работа с файлом. Открываем файл. Дескриптор открытого файла оказывается в переменной f. | ||
| - | < | + | < |
| - | f = open('temp_data.csv', 'a') | + | |
| </ | </ | ||
| Строка 124: | Строка 128: | ||
| Записываем в файл строку: | Записываем в файл строку: | ||
| - | < | + | < |
| - | | + | f.print(s); |
| </ | </ | ||
| - | Строка состоит из температуры в комнате, | ||
| После записи закрываем файл: | После записи закрываем файл: | ||
| - | < | + | < |
| - | f.close() | + | f.close(); |
| </ | </ | ||
| - | Запустим программу и дадим ей некоторое время поработать, | + | Далее открываем файл уже в режиме чтения - '' |
| - | <span menu-item> | + | <code arduino[enable_line_numbers=" |
| - | <span menu-item> | + | File f = LittleFS.open(" |
| - | </span> или иконка {{: | + | while(f.available()) Serial.write(f.read()); |
| - | + | f.close(); | |
| - | Открывается окно файлового менеджера: | + | </code> |
| - | {{ : | + | |
| - | Выбираем наш файл | + | Запустим программу и дождемся ее выполнения. Это займет 1 минуту, |
| - | {{ : | + | К сожалению при использовании Arduino IDE отсутствует удобный способ скачать созданный файл на компьютер. Поэтому предлагаем создать с помощью блокнота текстовый файл, скопировать в него выведенные в последовательный порт данные и сохранить файл с расширением .csv. |
| - | В файле видим то, чего и ожидали. Данные о температуре в формате CSV. Читать такие данные достаточно неудобно, | + | Читать такие данные достаточно неудобно, |
| {{ : | {{ : | ||