尝试在 SPIFFS 上使用带有 sqlite 的 ESP8266 并获得内存不足

问题描述

在我目前的观点中,我正在尝试对接这 3 个不兼容的东西。我有一个大草图,信息显示在四个 16x16 的 LED 矩阵显示器上。有一个 RTC、一个 ESP8266 和两个传感器 bme280 和 DS18B20(室内外温度、压力、湿度)。这一切都可以无缝运行。我决定尝试维护一个包含放映的数据库,比如半年。我连接了sqlite库。但不知何故它最终不起作用!输入 24 个条目后,我的内存不足。然后我简化了一切,只使用了一个带有 1 个表的数据库文件。调度程序库每 10 秒填满一次。所以现在112记录了同样的故事。数据库文件的大小只有 6656 字节。我附上草图。所以我不明白为什么在指定大小的肉体内存4兆的情况下,6千字节的内存会耗尽?看,也许我做错了什么?也许我必须以某种方式完成?不知何故可能是清晰的记忆? 所以我用的是ESP8266 NodeMCU V1。

#include <TickerScheduler.h>
#include <sqlite3.h>
#include <vfs.h>
#include <FS.h>

File fsuploadFile;

TickerScheduler ts(1);

void setup() {
  Serial.begin(115200);
  FS_init();
  sqlite_init();
}

void loop() {
  ts.update();

  if (Serial.available() > 0) {
    String str = Serial.readString();
    if (str != "") {
      char query[str.length() + 1];
      strcpy(query,str.c_str());
      str = "";
      db_exec(query);
    }
  }
}

void FS_init(void) {
  system_update_cpu_freq(SYS_cpu_160MHZ); 
  if (!SPIFFS.begin()) {
    Serial.println("Failed to mount SPIFFS");
    return;
  }
  Dir dir = SPIFFS.openDir("/");
  while (dir.next()) {
    String fileName = dir.fileName();
    size_t fileSize = dir.fileSize();
    Serial.print(fileName); Serial.println(fileSize);
  }
}

void sqlite_init() {
  sqlite3_initialize();
  int cmin = 0;
  int chour = 0;
  int csec = 0;
  ts.add(0,10000,[&](void*) {
    String tIn = "27.5";//(String)GettIn();
    String tOut = "-4.3";//(String)GettOut();
    String humidity = "21";//(String)Gethumidity();
    String pressure = "745";//(String)Getpressure();
    String str = "INSERT INTO day_p (cyear,cmonth,cday,chour,cmin,tin,tout,vlag,davl) ";
    str += "VALUES (2021,2,28," + String(chour) + "," + String(cmin);
    str += "," + tIn + "," + tOut + "," + humidity + "," + pressure + ");";
    str += "Select count(cyear) from day_p group by cyear;";
    char query[str.length() + 1];
    strcpy(query,str.c_str());
    str = "";
    db_exec(query);
    csec = csec + 10;
    if (csec == 60) {
      csec = 0;
      cmin++;
    }
    if (cmin == 60) {
      cmin = 0;
      chour++;
    }
  },nullptr,true);
}

void db_exec(const char *sql) {
   sqlite3 *db;
   int rc;
   const char *dbf = "/FLASH/weather.sql3";
   char *ErrMsg = 0;
   const char* data = 0;
   Serial.println(sql);
   File db_file_obj;
   vfs_set_spiffs_file_obj(&db_file_obj);
   if (sqlite3_open(dbf,&db)) {
       Serial.print(F("Can't open database: "));
       Serial.println(sqlite3_errmsg(db));
       return;
   }
   else Serial.println("DB opened");
   rc = sqlite3_exec(db,sql,callback,(void*)data,&ErrMsg);
   if (rc != sqlITE_OK) {
       Serial.print(F("sql error: "));
       Serial.println(ErrMsg);
       sqlite3_free(ErrMsg);
   }
   Serial.println(rc);
   sqlite3_close(db);
  
}

static int callback(void *data,int argc,char **argv,char **azColName) {
  for (int i = 0; i < argc; i++){
    if (i > 0) {
      Serial.print(" | ");
    }
    Serial.print(argv[i]);
  }
  Serial.println();
  return 0;
}```

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)