Delphin911
Member
В начале функция инициализации sqlite. Она вызывается в функции setup. Там задается шедулер по которому раз в минуту данные датчиков заносятся в базу.
Ну и далее db_exec и callback.
Ну и далее db_exec и callback.
Хм. Попробую. Английский не мой язык, ну с гугл переводчиком попробую.Прочтите комментарии в sqlite3.h.
#include <ESP8266WiFi.h>
#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);
}
}
}
// Инициализация FFS
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;
}
Я там ничего не искал, но если столько написано, то должно быть важно.Подскажите, что вы там нашли?
Но далеко не факт, что проблема в файловой системе.Only implemented in SPIFFS. Performs a quick garbage collection operation on SPIFFS, possibly making writes perform faster/better in the future. On very full or very fragmented filesystems, using this call can avoid or reduce issues where SPIFFS reports free space but is unable to write additional data to a file. See this discussion <https://github.com/esp8266/Arduino/pull/6340#discussion_r307042268> for more info.
Размер файла БД с 0 записями и с 1 записью ни сколько не различаются. Это я точно проверял. Вот только не помню на скольких записях происходит увеличение размера.У вас одна запись сколько места занимает?
Спасибо. Посмотрю. Возможно и в файловой системе дело. Вообще мне перестает нравится идея с sqlite. То места не хватает, то файл портится, пишет, что это не БД и никак его не восстановить, то еще какую-то ошибку выдает, точно как звучит не помню, но БД снова не восстанавливается. Может конечно и физическая проблема, сама ESP бракованая.Тут что то похожее на вашу проблему
https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html
Но далеко не факт, что проблема в файловой системе.
Нет у меня модуля подключения SD карты. Заказал уже (на всякий случай), но это ждать от 2-х недель и более.Стоит проверить на SD карточке.
У меня в изначальном скетче была эта проверка раз в 5 минут. Там значение не менялось. Попробую сегодня в тестовом скетче вставить.Вставьте в ваш цикл проверку оставшейся доступной памяти, у меня перестало вставлять, когда память уменьшилась до 10600 байт.
Serial.println(ESP.getFreeHeap());
Это вы о выкладывании данных в интернет? Ну как нет. Сейчас есть. Ну просто неинтересно мне само выкладывание данных в инет. Не раз уже нарывался на их пропажу. Тут конечно не критичные данные. Есть и есть, нет и бог с ними. Но меня заинтересовало именно хранение на этой маленькой платочке в совокупности с веб сервером и точкой доступа. В интернет просто не интересно.Если интернета нет, я бы смотрел в сторону Raspberry Pi или Android тв приставки.