Парсинг чтения 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}
  };

Есть ли эффективный способ получить то, что я ищу?

, 👍2

Обсуждение

Вы можете прочитать файл построчно (конечно, это довольно легко найти в Google). Затем вы можете использовать strtok() для результирующей c-строки (пожалуйста, избегайте класса String). Обратите внимание, что strtok изменяет строку c. Пожалуйста, попробуйте поискать в гугле учебник по strtok и попробуйте его. Может быть, это уже то, что вам нужно. (strtok поначалу немного сложно понять, но это действительно хороший способ токенизации строки), @chrisl

Спасибо! Да, мне удалось прочитать строчку за строчкой, и сегодня я углублюсь в strtok(). Я обновляю этот вопрос, когда перехожу к нему., @s_tatus3