04.T-WatchのTouch


04.T-WatchのTouch

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

メーカーのスケッチ例の解説です。
Arduino-IDE > ファイル > スケッチ例 > TTGO TWatch Library > BasicUnit に
タッチ関係のスケッチ例があり、それを修正しています。
void SetFont() と void printBT() は前回と同じです。

1.TouchPad.ino

Touchの基本
タッチ座標を画面表示
内容は4.の一部なので略します。

2.TouchMultitask.ino

マルチタスク
セマフォ同期は難しいので略します。

3.TouchpanelMode.ino

画面モード
3つのモードがあると言うがモードの違いがよくわからないので略します。

4.WakeupFormTouchScreen.ino

タッチの割込復帰
 起動時
 電源ボタンをチョン押しの割込みで(割込1)
 (irq=1)
 (復帰はタッチとする)
 deepSleep
 画面タッチの割込みで(割込2)
 起動(復帰)

技適について

技術基準適合証明等を受けた機器の検索
https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=js01
にて、
型名又は名称欄に"T-Watch"と入力 > 送信
すると、
型名又は名称:T-WATCH V1.7 (違うもの)
は、相互承認(MRA)による工事設計認証を通っていますが、"T-WATCH2020"は出てこないので技適が取れていないようです。

"技適マーク無しでも「無線機能がオフであれば合法」なのか、総務省に聞いてみた。"
https://kaketayo.net/about-giteki/
によると、「無線機能を使わなくても、使える環境にあればNG。とにかくWi-Fiを使わないからOKということにはならないようです。Wi-FiやBluetoothがハードウェア的に使えるなら、その機能を使うか使わないかに関わらず、使っちゃダメってことなんですね。」

よって、T-Watch 2020は日本では動作させず、海外でスケッチを作成・動作確認をし、日本に戻ってからこのブログを発信することにしました。中国でスケッチ作成済の記事がまだ少し残っています。

スケッチ


// WakeupFormTouchScreen.ino
// 電源ボタンをチョンでoffし、画面タッチでon(復帰は2,3秒待つ)
#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
bool irq = false;               // 割込要求変数=0

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_28);  // 固定幅ゴシック体 8,12,16,20,24,28,32,36,40
  lcd.setTextColor(TFT_GREEN, TFT_BLACK);   // (緑字,黒地)
  lcd.setTextSize(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;                         // 簡単に書けるようにオブジェクトを受取る
  lcd.setCursor(30, 80);                       // カーソル位置
  lcd.print("タッチ テスト");                  // 表示
  lcd.setCursor(30, 160);                      // カーソル位置
  lcd.print("電源off後、\n  タッチで復帰");  // 表示
  pinMode(AXP202_INT, INPUT_PULLUP);           // AXP202_INTの割込端子はデジタルpullup入力とする
  pinMode(TOUCH_INT, INPUT);                   // TOUCH_INTの割込端子はデジタル入力とする
  attachInterrupt(
    AXP202_INT, [] {  // 立下りエッジでAXP202_INTの割込みを設定し、割込後irq=1を実行
      irq = true;
    },
    FALLING);
  ttgo->power->enableIRQ(AXP202_PEK_SHORTPRESS_IRQ, true);  // PEKボタンのチョン押し割込を有効にする(deepSleep)
  ttgo->power->clearIRQ();                                  // 割込状態をクリア (割込待ち)
}
void loop() {
  int16_t x, y;                                // タッチ位置変数
  if (digitalRead(TOUCH_INT) == LOW) {         // タッチ割込があったら(復帰)
    if (ttgo->getTouch(x, y)) {                // タッチのx,yを読取る
      lcd.setTextColor(TFT_GREEN, TFT_BLACK);  // (緑字,黒地)
      lcd.setCursor(40, 120);                  // カーソル位置
      lcd.printf("x:%03d  y:%03d", x, y);      // x,y値表示
    }
  }
  if (irq) {                                  // 割込みがあったら
    irq = false;                              // 割込要求変数=0
    ttgo->power->readIRQ();                   //
    if (ttgo->power->isPEKShortPressIRQ()) {  // PEKボタンのチョン押し割込があったら(deepSleep)
      ttgo->power->clearIRQ();                // 割込状態をクリア (割込待ち)
      ttgo->displaySleep();                   // 画面とタッチをスリープする
      //タッチをスリープに設定しないと、スリープが解除さない
      //電源を切り、再度電源を入れると、touchは動作モードttgo->displayOff()になる?
      ttgo->powerOff();                                 // 電源off
      ttgo->power->setPowerOutPut(AXP202_LDO3, false);  // 全チャンネルの内部電源をオフ
      ttgo->power->setPowerOutPut(AXP202_LDO4, false);
      ttgo->power->setPowerOutPut(AXP202_LDO2, false);
      ttgo->power->setPowerOutPut(AXP202_EXTEN, false);
      ttgo->power->setPowerOutPut(AXP202_DCDC2, false);
      esp_sleep_enable_ext1_wakeup(GPIO_SEL_38, ESP_EXT1_WAKEUP_ALL_LOW);  // 復帰はタッチとする
      //esp_sleep_enable_ext1_wakeup(GPIO_SEL_35, ESP_EXT1_WAKEUP_ALL_LOW);//復帰は電源ボタンの時
      esp_deep_sleep_start();  // deepSleep開始
    }
    ttgo->power->clearIRQ();  // 割込状態をクリア (割込待ち)
  }
  printBT();  // バッテリー残量表示関数へ
}
* flash memory(6.5Mbyte)のうち、スケッチが13%使用。RAM(4.5Mbyte)のうち、global変数が0%使用、local変数で4.5Mbyte使用可能。(1000byte=1kbyteで計算)