05.T-Watchのセンサー復帰


05.T-Watchのセンサー復帰

説明

注意:この機種は技適が通っていません。中国で動作確認したスケッチとメモを日本で整理してブログ発信しています。

起動5秒後にDeepSleepし、ダブルクリック or 傾きで復帰します。
メーカーのスケッチ例の解説です。
Arduino-IDE > ファイル > スケッチ例 > TTGO TWatch Library > BasicUnit > WakeupFormSensor > WakeupFormSensor.ino
を修正しています。void SetFont() と void printBT() は前回と同じです。

更新時は、書込開始時にT-Watchの電源がoffにならないように注意してください。

スケッチの流れ

A.DeepSleep

1.画面とタッチをスリープする
 ttgo->displaySleep();

2.各電源出力をoffする
 power->setPowerOutPut(AXP202_LDO3, false);
 power->setPowerOutPut(AXP202_LDO4, false);
 power->setPowerOutPut(AXP202_LDO2, false);
 power->setPowerOutPut(AXP202_EXTEN, false);
 power->setPowerOutPut(AXP202_DCDC2, false);

3.復帰は何を使うか指定する
 esp_sleep_enable_ext1_wakeup(GPIO_SEL_39, ESP_EXT1_WAKEUP_ANY_HIGH);

4.DeepSleepを開始する Bへ
 esp_deep_sleep_start();

B.BMA423(3軸加速度センサー)の傾きによる復帰例

1.BMA423のオプションを設定しておく
 cfg.odr = BMA4_OUTPUT_DATA_RATE_100HZ;
 cfg.range = BMA4_ACCEL_RANGE_2G;
 cfg.bandwidth = BMA4_ACCEL_NORMAL_AVG4;
 cfg.perf_mode = BMA4_CONTINUOUS_MODE;
 sensor->accelConfig(cfg);

2.BMA423を有効にする
 sensor->enableAccel();

3.BMA423の傾き割込機能isTiltを有効にする
 sensor->enableFeature(BMA423_TILT, true);

4.割込機能のリセット
 sensor->resetStepCounter();

5.傾きによる割込を有効にする
 sensor->enableTiltInterrupt();

6.傾きが変化したら復帰する Aへ

スケッチ


// WakeupFormSensor.ino
// 5秒後にdeep sleep、ダブルクリックor傾きで復帰
#define LGFX_AUTODETECT         // 機種の自動認識
#include <LovyanGFX.hpp>        // ヘッダをinclude
#include <LGFX_AUTODETECT.hpp>  // クラス"LGFX"を用意
static LGFX lcd;                // LGFXのインスタンスを作成
#define LILYGO_WATCH_2020_V3    // T-Watch2020v3を使用
#include <LilyGoWatch.h>        // LilyGoWatchを使用
TTGOClass *ttgo;                //
AXP20X_Class *power;            // 電源管理 AXP202
BMA *sensor;                    // 3軸加速度センサー BMA423

void SetFont() {                            // Font等初期化関数
  ttgo = TTGOClass::getWatch();             // ttgoに略します
  ttgo->begin();                            // 本体の初期化
  lcd.init();                               // lcdの初期化
  lcd.setRotation(2);                       // 画面回転 0-3 (4-7で上下反転)
  lcd.setBrightness(128);                   // バックライト輝度0-255(実際は256通りの輝度ではない)
  lcd.fillScreen(TFT_BLACK);                // 全画面黒
  lcd.setFont(&fonts::lgfxJapanGothic_32);  // 固定幅ゴシック体 8,12,16,20,24,28,32,36,40
  lcd.setTextColor(TFT_GREEN, TFT_BLACK);   // (緑字,黒地)
  lcd.setTextSize(1);                       // 文字サイズ1倍
  lcd.setTextWrap(true);                    // 自動折返し
}

void printBT() {                                // バッテリー残量表示関数
  lcd.setCursor(185, 0);                        // カーソル位置
  lcd.setTextSize(0.7);                         // 文字サイズ(倍)
  uint8_t per = power->getBattPercentage();     // 電池%測定
  if (power->isChargeing()) {                   // 充電中の時
    lcd.setTextColor(TFT_CYAN, TFT_BLACK);      // (水字,黒地)
    lcd.print("充");                            // 画面表示
  } else {                                      // 充電中でない時
    lcd.print(" ");                            // 画面表示
    if (per <= 20) {                            // 0-20%時
      lcd.setTextColor(TFT_RED, TFT_BLACK);     // (赤字,黒地)
    } else if (per <= 40) {                     // 21-40%
      lcd.setTextColor(TFT_YELLOW, TFT_BLACK);  // (黄字,黒地)
    } else if (per <= 80) {                     // 41-80%時
      lcd.setTextColor(TFT_GREEN, TFT_BLACK);   // (緑字,黒地)
    } else {                                    // 81-100%時
      lcd.setTextColor(TFT_WHITE, TFT_BLACK);   // (白字,黒地)
    }
  }
  lcd.printf("%3d%%", per);  // 電池%表示
  lcd.setTextSize(1);        // 文字サイズを戻す
}

void setup() {
  SetFont();                                       // Font等初期化関数へ
  power = ttgo->power;                             // 簡単に書けるようにオブジェクトを受取る
  sensor = ttgo->bma;                              // 簡単に書けるようにオブジェクトを受取る
  Acfg cfg;                                        // BMA423パラメータの構造
  cfg.odr = BMA4_OUTPUT_DATA_RATE_100HZ;           // BMA423の出力データレート(0_78~1600)
  cfg.range = BMA4_ACCEL_RANGE_2G;                 // BMA423の±重力範囲(2~16)
  cfg.bandwidth = BMA4_ACCEL_NORMAL_AVG4;          // BMA423の平均化サンプル数2^x x=4の時2^4=16サンプルの平均値
  cfg.perf_mode = BMA4_CONTINUOUS_MODE;            // BMA423のフィルター性能モード 平均化無し
  sensor->accelConfig(cfg);                        // BMA423で上記の設定
  sensor->enableAccel();                           // BMA423を有効
  sensor->enableFeature(BMA423_STEP_CNTR, false);  // 歩数割込機能isStepCounterを無効にする
  sensor->enableFeature(BMA423_TILT, true);        // 傾き割込機能isTiltを有効にする
  sensor->enableFeature(BMA423_WAKEUP, true);      // クリック割込機能isDoubleClickを有効にする
  sensor->resetStepCounter();                      // 割込機能のリセット
  //sensor->enableStepCountInterrupt();            // 歩数による割込を有効にする しない
  sensor->enableTiltInterrupt();    // 傾きによる割込を有効にする
  sensor->enableWakeupInterrupt();  // ダブルクリックによる割込を有効にする
  lcd.println("復帰しました");      // 画面表示
  for (int8_t i = 5; i > 0; i--) {  // i=5 → 1
    lcd.printf("あと%d秒\n", i);    // 画面表示
    delay(1000);                    // 1秒待つ
  }
  lcd.println("Deep Sleep");                   // 画面表示
  delay(1000);                                 // 1秒待つ
  ttgo->displaySleep();                        // 画面とタッチをスリープする
  power->setPowerOutPut(AXP202_LDO3, false);   // LDO3出力off 使用禁止
  power->setPowerOutPut(AXP202_LDO4, false);   // LDO4出力off MAX98357A Audio
  power->setPowerOutPut(AXP202_LDO2, false);   // LCD_VDD出力off バックライト
  power->setPowerOutPut(AXP202_EXTEN, false);  // (この電源チャンネルは不使用 使用禁止)
  power->setPowerOutPut(AXP202_DCDC2, false);  // (この電源チャンネルは不使用)
  // LDO1はRTC3.3V用で制御できない
  //esp_sleep_enable_ext0_wakeup((gpio_num_t)BMA423_INT1, HIGH);        // 外部復帰はext0を使用の時
  esp_sleep_enable_ext1_wakeup(GPIO_SEL_39, ESP_EXT1_WAKEUP_ANY_HIGH);  // 外部復帰はext1を使用
  esp_deep_sleep_start();                                               // deep sleep開始
}
void loop() {}
* flash memory(6.5Mbyte)のうち、スケッチが13%使用。RAM(4.5Mbyte)のうち、global変数が0%使用、local変数で4.5Mbyte使用可能。(1000byte=1kbyteで計算)