Парсинг чтения SD-файла в 2 переменные
Недавно я начал некоторые тесты управления водонагревателем с данными датчика температуры, как описано подробно здесь
До сих пор я тестировал небольшой набор данных для контроля температуры воды, который довольно легко записать самостоятельно.
#include <NTPClient.h>
#include <WiFi.h>
#include <WiFiUdp.h>
//WiFi Conf
const char *ssid = "ssid_addr";
const char *password = "wifi_password";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
unsigned long current_time;
// Sensors Conf (фиксированное значение только для проверки реакции реле)
float temperature = 30.5;
//Relay Conf
const int relay = 26;
struct SetPoint {
unsigned long time;
float temperature;
};
#define DATA_SIZE 8
SetPoint scen1[DATA_SIZE] = {
{1616952559, 32.4},
{1616952739, 10.2},
{1616952859, 10.4},
{1616952867, 40.2},
{1616952927, 20.4},
{1616952928, 35.2},
{1616952945, 22.4},
{1616952947, 28.2}
};
unsigned int pos = 0;
void setup() {
Serial.begin(115200);
pinMode(relay, OUTPUT);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
}
void loop() {
timeClient.update();
long current_time = timeClient.getEpochTime();
if (pos < DATA_SIZE && current_time >= scen1[pos].time) {
set_thermostat(/*data[pos].temperature, temperature*/);
pos++;
}
Serial.println(timeClient.getEpochTime());
Serial.println(timeClient.getFormattedTime());
Serial.println(pos);
delay(3000);
}
void set_thermostat() {
if (temperature < scen1[pos].temperature) {
digitalWrite (relay, HIGH);
}
else if (temperature > scen1[pos].temperature) {
digitalWrite (relay, LOW);
}
}
Но теперь я планирую использовать файл большего размера с различными точками данных, и вариант заключается в том, чтобы хранить их в SD-карте, а затем микроконтроллер анализирует каждую строку, чтобы контролировать температуру с интервалом в три часа.
Будет около 720 линий со следующей структурой ("Scen" - это сценарии моделирования температуры, которые будут использоваться для включения или выключения реле):
Time,UNIX,Scen1,Scen2,Scen3
21/04/2021 00:00:00,1618963200,"27.45","29.01","30.85"
21/04/2021 21:00:00,1619038800,"26.16","27.82","29.75"
21/04/2021 06:00:00,1618984800,"25.28","26.83","29.02"
21/04/2021 09:00:00,1618995600,"24.62","26.49","28.51"
21/04/2021 12:00:00,1619006400,"27.19","29.47","29.53"
21/04/2021 15:00:00,1619017200,"30.65","34.07","30.50"
21/04/2021 18:00:00,1619028000,"31.87","35.78","31.78"
21/04/2021 21:00:00,1619038800,"30.43","35.20","30.88"
22/04/2021 00:00:00,1619049600,"28.45","31.86","29.47"
Проблема в том, что трудно выяснить, как разбить данные из файла на две переменные (UNIX Time и temperature) для каждого температурного сценария, как используется здесь:
struct SetPoint {
unsigned long time;
float temperature;
};
#define DATA_SIZE 8
//scenario 1 array
SetPoint scen1[DATA_SIZE] = {
{1616952559, 32.4},
{1616952739, 10.2},
{1616952859, 10.4},
{1616952867, 40.2},
{1616952927, 20.4},
{1616952928, 35.2},
{1616952945, 22.4},
{1616952947, 28.2}
};
Есть ли эффективный способ получить то, что я ищу?
@s_tatus3, 👍2
Обсуждение0
- Воспроизведение смоделированных температурных данных с помощью Arduino
- Регистрация данных при просмотре меню на ЖК-экране
- Невозможно сохранить данные RFID в следующих 5 байтах массива.
- Датчики/регистрация данных Температура и влажность на расстоянии 50 футов
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- BMP280 возвращает 0
- Колебания показаний датчика температуры LM35 (+- 5°C) с Arduino UNO
Вы можете прочитать файл построчно (конечно, это довольно легко найти в Google). Затем вы можете использовать
strtok()
для результирующей c-строки (пожалуйста, избегайте классаString
). Обратите внимание, что strtok изменяет строку c. Пожалуйста, попробуйте поискать в гугле учебник по strtok и попробуйте его. Может быть, это уже то, что вам нужно. (strtok поначалу немного сложно понять, но это действительно хороший способ токенизации строки), @chrislСпасибо! Да, мне удалось прочитать строчку за строчкой, и сегодня я углублюсь в strtok(). Я обновляю этот вопрос, когда перехожу к нему., @s_tatus3