🌟

M5StackCore2 + ENV2センサユニット + Sqlite3でセンサーデータをデータベースに蓄積してみる

2024/09/08に公開

https://zenn.dev/akihiro_ya/articles/f1576cca66dae8

それでは、続けてSqlite3データーベースを導入する。

Sqlite3Esp32のインストール

ArduinoIDEでSqlite3Esp32をインストールする。
インストール

テーブル

必要なのは気温、湿度、気圧。

気温テーブルはこれで良いだろう。

CREATE TABLE IF NOT EXISTS temperature (id INTEGER PRIMARY KEY AUTOINCREMENT,sensor_id INTEGER NOT NULL,location TEXT,at INTEGER NOT NULL,milli_degc INTEGER NOT NULL);

(相対)湿度テーブルはこれで。

CREATE TABLE IF NOT EXISTS relative_humidity (id INTEGER PRIMARY KEY AUTOINCREMENT,sensor_id INTEGER NOT NULL,location TEXT,at INTEGER NOT NULL,ppm_rh INTEGER NOT NULL);

気圧テーブルはこれで。

CREATE TABLE IF NOT EXISTS pressure (id INTEGER PRIMARY KEY AUTOINCREMENT,sensor_id INTEGER NOT NULL,location TEXT,at INTEGER NOT NULL,pascal INTEGER NOT NULL);

Arduinoスケッチ

前回のスケッチを改造してこうする。

このスケッチは長いのでたたんでおく

このスケッチをM5Core2に書込んで、測定値をSqlite3データーベースファイルをSDカードに保存する。

メインメモリーからPSRAMへ

M5StackCore2のSRAM領域は512kB。
それをSqlite3データベースに使わせると不足するので、Core2内蔵の疑似SRAM領域をSqlite3が使うようにsqlite3_configで設定する。

/*
 * sqlite3用
 */
const sqlite3_mem_methods DATABASE_CUSTOM_MEM_METHODS{
  /* メモリー割り当て関数 */
  .xMalloc = [](int size) -> void * {
    return heap_caps_aligned_alloc(8, size,
                                   MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM);
  },
  /* メモリー解放関数 */
  .xFree = heap_caps_free,
  /* メモリー再割り当て関数 */
  .xRealloc = [](void *ptr, int size) -> void * {
    return heap_caps_realloc(ptr, size, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM);
  },
  /* 割り当てサイズを返す関数 */
  .xSize = [](void *ptr) -> int {
    return heap_caps_get_allocated_size(ptr);
  },
  /* 8の倍数に切り上げる関数 */
  .xRoundup = [](int size) -> int {
    return (size + 7) & ~7;
  },
  /* メモリー割り当て初期化 */
  .xInit = [](void *app_data) -> int {
    return 0;  // nothing to do
  },
  /* メモリー割り当て後片付け */
  .xShutdown = [](void *app_data) -> void {
    // nothing to do
  },
  /* xInit() と xShutdown()の引数 */
  .pAppData = nullptr,
};

Discussion