• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 и sqlite3

Сейчас страничку со списком файлов доработал, вывел туда еще информацию о размерах файлов. Таки файл базы данных остается нулевой. Не пишет он очевидно в нее. Поэтому и память кончается после 24 записей.
А вот как указать, чтобы он в этот файл писал?
 
Оттуда пример и взят. Автору iomoio давно написал, но он, как и два автора вебсайта для ESP8266 уже год не появляется. Блин я думал что-то ценно написали!:cry:
З.Ы. У меня складывается такое впечатление, что это вы только заголовки читаете, ну и смотрите на ютубе, т.к. мой скетч полностью с этого видео. И еще там в видео автор особо не распространялся, а больше восхищался, что оно вообще есть и работает. Он там конечно все шаги расписал. Но так как у него и у меня работает. Пару строк внес в базу, пару запросов сделал. Все ОК. Проблемы начинаются после внесения 23-24 записей. Ну и еще если написать в поиске esp8266 sqlite эта ссылка как правило первой выскакивает. Я к стати с ссылки на это видео кажется вообще тему открыл.
Гуглевская страница, что вы привели вся красная у меня страницы на 3 вниз, копаюсь в этих ссылках с 21 января (как тему открыл). Про вторую ссылку тоже уже писал. Там на SD базу держат, меня это уже не устраивает, т.к. устройство уже спаяно и засунуто в коробку. Да и не особо интересно на sd.
 
Все таки поясню. База подключается и работает. Вывод данных на веб старнички работает. Но не совсем работает база. Она почему-то не пишет в файл, расположенный на ESP8266. Почитав иностранные форумы, я так понял, что она его не видит. А когда она не видит файла, она создает его в виртуальной памяти и работает с ним. А когда виртуальная память кончается, оно и пишет мне, что памяти нет. Везде же в качестве примера работают либо с SD носителем, что для моей ситуации не годится, либо в 99% остальных случаев код тот же, что и на видео iomoio описывается.
Собственно еще автор видео iomoio говорит, что если файла нет физически, то при работе этого скетча он создается. Ног ни-фи-га! Не создается. Так же и работает в виртуальной памяти. Я уже по буковке скетч из видео разобрал.
 

CodeNameHawk

Moderator
Команда форума
З.Ы. У меня складывается такое впечатление, что это вы только заголовки читаете, ну и смотрите на ютубе,
Я вам в первом ответе сказал как "правильно" делать, читай, как делаю я.
Вы не показали свой код и заполнение данными, которые приводят к ошибке, а телепатия зимой плохо работает.
Да и так честно сказать не интересно, вам интересно вот и...
 
Я вам в первом ответе сказал как "правильно" делать, читай, как делаю я.
Вы не показали свой код и заполнение данными, которые приводят к ошибке, а телепатия зимой плохо работает.
Да и так честно сказать не интересно, вам интересно вот и...
Как не показал код???? Вся вторая страница в кодах! Ну весь скетч выкладывать зачем? Там конечно ничего секретного, но 13 файлов кода как-то зачем выкладывать?
 
Ну так и одна не влезет, если будет размером со слона.
В смысле? Там 4 стобца (2 температуры, давление, влажность), плюс дата и время.
Да о чем вы? Я же говорю вы не читаете что я пишу! Ну не интересно, так не отвечайте! Я же написал, что база на флеш память ESP не кладется! Файл БД не кладется. Даже когда я его подготавливаю, оан его не трогает, а создает файл БД в виртуальной памяти и с ним работает.
 
Я вам в первом ответе сказал как "правильно" делать, читай, как делаю я.
Вы про бесплатный хостинг? Так я планирую использовать без инета. На даче, в поездках. Будет маленькая коробочка с аккумом на 4 вольта и экранчиком.
 

CodeNameHawk

Moderator
Команда форума
Объясню еще раз, если вы выложите скетч, данные которыми заполняете, версии библиотек, версии платы, лог. работы программы, то возможно кто нибудь и сможет подсказать.
Так я планирую использовать без инета.
Все это можно сделать при помощи JSON, причем без особого геморроя.
Ладно удачи.
 
Все это можно сделать при помощи JSON, причем без особого геморроя.
Ладно удачи.
JSON тоже рассматриваю, но SQL знаю хорошо, а вот как в файле JSON осуществлять стирание старых строк, пока не понимаю. Возможно конечно полная перезапись файла.
Я просто так начинаю понимать, что мало кто связывается с базами данных на ESP8266. Там вон народ в ответах в ахуе некоторый. Во всяком случае в русскоязычном сегменте инета. Вот я и копаюсь пока неудачно в англоязычном. Да и пример почти в 90% один и тот же, что и я выкладывал.
У меня же проблема даже не с моим кодом. Мне надо понять как взять файл БД, который я подготовил на компе и открыть его на ESP. ВОт когда я это смогу сделать и смогу писать именно в этот файл, а не в файл на виртуалке, тогда все заработает. Да собственно они и работает все с виртуальным файлом. Места только на нем мало.
 

CodeNameHawk

Moderator
Команда форума
А разве библиотека, на самой есп, не позволяет создать файл базы данных.
 
А разве библиотека, на самой есп, не позволяет создать файл базы данных.
В видео от iomoio говорится, что тот файл, что указан в скетче, если его нет на ESP, то он мол создастся сам. Но он создается только в виртуальной памяти, размер которой хватает только на 23 записи.
Там либо что-то не доделано, либо не знаю что еще. Но везде БД держат на SD карте, там другие библиотеки используют и команды. Такое ощущение, что в vfs.h какой-то то ли глюк, то ли iomoio недоразобрался. Я ведь говорю, он там несколько команд показывает. При чем они же не только на внесение в БД, но и на выборку. У меня тоже все равбоет если с 10 записей внести, а потом разные SELECT-ы делать.
 

CodeNameHawk

Moderator
Команда форума
В видео от iomoio говорится, что тот файл, что указан в скетче, если его нет на ESP, то он мол создастся сам.
Не знаю как в видео, но в примере база данных создается и записывается на SPIFFs. Создаются даже два файла.
В каком примере найдете? Для SPIFFs их только два, вроде.

Но он создается только в виртуальной памяти, размер которой хватает только на 23 записи.
У меня тоже все равбоет если с 10 записей внести, а потом разные SELECT-ы делать.
Все ваши слова это просто "Подземный стук".
 

Вложения

  • 298 байт Просмотры: 3
Последнее редактирование:
Да верю я вам. Но зачем мне ваша база? Я свой скетч выложил который не работает, вы бы свой приложили. Я бы буковки посверял. Может где ошибся.
 
А нет ли требований к расширению файлов БД. Просто вроде тотже iomoio Писал, что как хочешь можно обозвать, я и обозвал .sql3.
 

CodeNameHawk

Moderator
Команда форума
Если вы называет скетчем, то что во втором сообщении, то там даже открытия базы данных не видно, не говоря уже о том, что вы так и не узнаете запустилась ли файловая система.
 
Вот полное содержание файла sqlite3.ino моего проекта. Оставльные файлы касаются датчиков, вайфая, вебсервера.
Код:
void sqlite_init() {
  sqlite3_initialize();
  ts.add(3, 60000, [&](void*) {
    String tIn = (String)GettIn();
    String tOut = (String)GettOut();
    String humidity = (String)Gethumidity();
    String pressure = (String)Getpressure();
    String str = "INSERT INTO day_p (cyear, cmonth, cday, chour, cmin, tin, tout, vlag, davl) ";
    str += "VALUES (" + String(cyear) + ", " + String(cmonthnum) + ", " + String(cdayofmonth) + ", " + String(chour) + ", " + String(cmin);
    str += ", " + tIn + ", " + tOut + ", " + humidity + ", " + pressure + ");";
    str += "DELETE FROM day_p WHERE (cday <> " + String(cdayofmonth) + " AND chour < " + String(chour) + ") ";
    str += "OR (cday <> " + String(cdayofmonth) + " AND chour = " + String(chour) + " AND cmin <= " + String(cmin) + ");";
    db_exec(str.c_str());
  }, nullptr, true);
}

void db_exec(const char *sql) {                               // Основная функция обработки SQL-запросов
   sqlite3 *db;
   int rc;
   //sqlite3_stmt *res;
   //int rec_count = 0;
   //const char *tail;   
   const char *dbf = "/weather.sql3";                                       // Определяем константу со ссылкой на драйвер базы данных в VFS
   char *ErrMsg = 0;                                                       // Переменная для сообщений об ошибках обработки SQL-запросов
   const char* data = 0;                                                   // Константа, содержащая заголовок вывода для функции callback (0 - не используется)
   Serial.println(sql);
   File db_file_obj;                                                       // Определяем объект типа файл для работы с VFS
   vfs_set_spiffs_file_obj(&db_file_obj);                                  // Инициализируем ссылку на объект в VFS (непосредственно перед открытием файла в SPIFFS)
   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);         // Вызываем функцию обработки SQL-запроса
   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) { // Фукция, вывода ряда значений ряда ответа на SQL-запрос
  for (int i = 0; i < argc; i++){                                         // Цикл перебора содержащихся в ответе значений
    if (i > 0)                                                             //  Если значений в ответе больше одного
      Serial.print(" | ");                                                 //   Выводим разделитель
    Serial.print(argv[i]);                                                 //  Выводим значение
  }
  Serial.println();                                                       // Перевод строки (для красоты) 
  return 0;                                                               // Возвращаем 0
}

void handledbdata() {
 
}
В конце недоделаная функция, которая будет выводить на страницу результаты Select.
 
Сверху Снизу