以下の内容はhttps://gijin77.blog.jp/archives/2026-02.htmlより取得しました。


◆以前HU-086ボードでマルチアプリセレクターを作成したものを、ES3C28Pボードで
 タッチ操作でするものを作ってみました。
 また、アプリも四つほど入れ込んでみました。
 es3c28p_main
 
 マルチアプリセレクターの基本は、下記ブログ内記事を参照して下さい。
  ・ESP32S3 ArduinoIDE で簡易的なランチャーを作ってみた

 (1)現在、下記の四つのアプリを選択して実行できます。
  ⓪main:メインのアプリセレクター
  ①app1:15puzzle(game)
  ②app2:パタパタ時計表示&RSSニュース音声出力
  ➂app3:rdiko&インターネットラジオ
  ④app4:xiaozhi-rsp32 ベトナムバージョン
  フラシュメモリを調整することでもう少し増やせると思います。
 
 (2)現在各アプリに下記のサイズを指定しています。
 また下記パーティションアドレスに応じてflash_download_tool_3.9.7で書き込みます。

  partitions.csvの内容
  # Name,   Type, SubType,  Offset,   Size,     Flags
  nvs,      data, nvs,      0x9000,   0x5000,
  otadata,  data, ota,      0xe000,   0x2000,
  factory,  app,  factory,  0x10000,  1M, <-⓪main
  app1,     app,  ota_0,    0x110000, 2M, <-①app1
  app2,     app,  ota_1,    0x310000, 3M, <-②app2
  app3,     app,  ota_2,    0x610000, 3M, <-➂app3
  app4,     app,  ota_3,    0x910000, 4M, <-④app4
  storage,  data, spiffs,   0xD10000, 2M,
 
0.main:メインのアプリセレクターについて
 ①アプリ選択画面
 es3c28p_main

 ②IDE設定
  ・esp32s3 Dev
  ・USBCDCOnBoot="Enabled"
  ・Flash Size=16MB
  ・Partition Scheme: "Custom"
  ・PSRAM="Disabled" 

 ➂es3c28p_mainフォルダに下記の2つのファイルを作成します。
  (1)es3c28p_main.ino スケッチ(保障無しの自己責任で)
//es3c28p_main.ino
//2026/03/01 By JK1VCK マルチアプリセレクター
//blog URL:https://gijin77.blog.jp/archives/46787383.html

#include <esp_ota_ops.h>
#include <esp_partition.h> // パーティション操作に必要
#include "FT6336U.h"
#include <Arduino_GFX_Library.h>

//IDE設定
//・esp32s3 Dev
//・USBCDCOnBoot="Enabled"
//・Flash Size=16MB
//・Partition Scheme: "Custom"
//・PSRAM="Disabled"

String board ="Hello ES3C28P ESP32S3";
#define TFT_DC    46
#define TFT_RST   -1
#define TFT_CS    10
#define TFT_MOSI  11 //SDA
#define TFT_SCK   12 //SCL
#define TFT_MISO  13
#define GFX_BL    45

Arduino_DataBus *bus = new Arduino_ESP32SPI(TFT_DC, TFT_CS, TFT_SCK, TFT_MOSI, TFT_MISO);
Arduino_GFX *gfx = new Arduino_ILI9341(bus, TFT_RST, 0,true); // 240x320 2.8 LCD

#define I2S_MCLK       4
#define I2S_BCLK       5
#define I2S_DIN        6 //mic in
#define I2S_LRC        7
#define I2S_DOUT       8 //sp out
#define I2C_SCL       15
#define I2C_SDA       16
#define PA_ENABLE      1
#define TOUCH_INT     17
#define TOUCH_RST     18

FT6336U ft6336u(I2C_SDA, I2C_SCL, TOUCH_RST, TOUCH_INT); 
FT6336U_TouchPointType tp; 

// グローバル変数
uint16_t tX, tY;
int sel=0, old_sel=-1;
bool selok=false;

#define BW 240
#define BH 32
#define SY 48
#define SH 40

int c[5][4]={    // Button(220x36) display and touch area
// タッチ位置(x,y)からTb(n)でボタンのon/offやLCD上の操作ができます。
// Button area    
// 0, 1,  2,  3,    Tb(0-4)
// x,  y,  w,    h,        1234567890123 
{ 36, SY,        BW  , BH}, // 0 App1:15puzzle 
{ 36, SY+SH,     BW  , BH}, // 1 App2:RSS News
{ 36, SY+SH*2,   BW  , BH}, // 2 App3:radiko
{ 36, SY+SH*3,   BW  , BH}, // 3 App4:xiaozhi
{ 96, SY+SH*4,  115  , BH}, // 4 SELECT
};

const char *btn[] ={"App1:15puzzle","App2:RSS News","App3:radiko","App4:xiaozhi","SELECT"};

//アプリセレクト
void bootApp(int index) {
  esp_partition_subtype_t subtype = (esp_partition_subtype_t)(ESP_PARTITION_SUBTYPE_APP_OTA_0 + index);
  // 指定したサブタイプのパーティションを探す
  const esp_partition_t* target = esp_partition_find_first(ESP_PARTITION_TYPE_APP, subtype, NULL);
  if (target != NULL) {
    gfx->fillScreen(BLACK);
    gfx->setTextColor(ORANGE);
    gfx->setTextSize(2); 
    gfx->setCursor(50,100);
    gfx->printf("Switching to: %s\n", target->label);    
    Serial.printf("Switching to: %s\n", target->label);
    esp_ota_set_boot_partition(target);
    delay(1000);
    esp_restart();
  } else {
    Serial.println("Error: Partition not found!");
  }
}

void setup() {
  Serial.begin(115200);
  delay(2000);
  const esp_partition_t* running = esp_ota_get_running_partition();
  Serial.printf("現在起動中のパーティション: %s\n", running->label);
  // ===== ディスプレイ初期化 =====
  pinMode(GFX_BL, OUTPUT);
  digitalWrite(GFX_BL, HIGH); //バックライトON
  if (!gfx->begin()) {
    Serial.println("gfx->begin() failed!");
  } else {
    Serial.println("gfx->begin() OK!!");
  }
  gfx->setRotation(3);
  gfx->fillScreen(RED);delay(300);
  gfx->fillScreen(GREEN);delay(300);  
  gfx->fillScreen(BLUE);delay(300);
  gfx->fillScreen(BLACK);
  //タッチパネル初期化
  ft6336u.begin(); 
  Serial.print("FT6336U Firmware Version: "); 
  Serial.println(ft6336u.read_firmware_id());  
  Serial.print("FT6336U Device Mode: "); 
  Serial.println(ft6336u.read_device_mode()); 
  dispmain();
}

void loop() {
int sel=select_app();
  Serial.printf("sel No=%d \n",sel); 
  bootApp(sel);
}

void dispmain(){
  gfx->setTextColor(ORANGE);
  gfx->setTextSize(3); 
  gfx->setCursor(50,5);
  gfx->print("App selector");
  drawbutton();
}

int c_touch(){
  selok=false;  
  if (getTouch(&tX,&tY)) {
     if(Tb(4)) {selok=true;return 99;}
     for (int t=0;t<4;t++) {
      if(Tb(t)) {sel=t;return sel;}
     }
  }
  return -1;
}

int select_app() {
  Serial.println("select_file start");    
  for(;;){
    if (c_touch()==-1) continue;
    Serial.printf("sel No=%d selok=%d \n",sel,selok); 
    if (selok) break;
    drawbutton();
    delay(50);
  }
  return(sel);
}

bool Tb( int p ){ // Touch button : Find button and touch locations
Serial.printf("p=%d tX=%d tX0=%d tX2=%d  tY=%d tY0=%d tY1=%d\n",p,tX,c[p][0],(c[p][0]+c[p][2]),tY,c[p][1],(c[p][1]+c[p][3])); 
  if (tX>c[p][0] && tX<(c[p][0]+c[p][2])    // x1,y1 check
   && tY>c[p][1] && tY<(c[p][1]+c[p][3]))   // x2,y2 check
   {return true;}                           // with position
  return false;                             // without pos
}

void drawbutton() {
  int x_of[]={4,4,4,4,4};
  int y_of=4;
  for (int p=0;p<5;p++) {
    gfx->fillRect(c[p][0],c[p][1],c[p][2],c[p][3], BLACK);
    gfx->drawRoundRect(c[p][0],c[p][1],c[p][2],c[p][3],10, GREEN);
    gfx->setCursor(c[p][0]+x_of[p],c[p][1]+y_of);gfx->setTextSize(3); 
    if (p==sel) gfx->setTextColor(YELLOW);
    else        gfx->setTextColor(CYAN);
    if (p==4) gfx->setTextColor(RED);
    gfx->print(btn[p]);
  }
}
//ft6336u_Touch
bool getTouch(uint16_t* tX,uint16_t* tY) {  
  static bool prevTouched = false;  // 前回のタッチ状態を保持
  bool touched = false;

  int w = gfx->width();
  int h = gfx->height();
  int r = gfx->getRotation();
  int tix, tiy;
  tp = ft6336u.scan(); 
  if (tp.tp[0].status) {
    touched = true;
    // 前回タッチしていなかった → 今回タッチした = 押した瞬間
    if (!prevTouched) {
      switch (r) {
        case 1:  tiy = h - tp.tp[0].x; tix = tp.tp[0].y; break;
        case 2:  tix = w - tp.tp[0].x; tiy = h - tp.tp[0].y; break;
        case 3:  tiy = tp.tp[0].x;     tix = w - tp.tp[0].y; break;
        default: tix = tp.tp[0].x;     tiy = tp.tp[0].y;     break;
      }
      Serial.printf("Touch Down: x=%d y=%d r=%d\n", tix, tiy, r);
      //gfx->fillCircle(tix, tiy, 3, BLUE);lcd_flush();
      *tX = tix;
      *tY = tiy;
      prevTouched = true;   // 状態更新
      return true;          // ★押した瞬間だけ true
    }
  } else {
    touched = false;
  }
  // 離したら状態リセット
  if (!touched) {
    prevTouched = false;
 }
  return false;  // 押しっぱなしや離した後は false
}

   (2)パーティションテーブル partitions.csv
# Name,   Type, SubType,  Offset,   Size,     Flags
nvs,      data, nvs,      0x9000,   0x5000,
otadata,  data, ota,      0xe000,   0x2000,
factory,  app,  factory,  0x10000, 1M,
app1,     app,  ota_0,    0x110000, 2M,
app2,     app,  ota_1,    0x310000, 3M,
app3,     app,  ota_2,    0x610000, 3M,
app4,     app,  ota_3,    0x910000, 4M,
storage,  data, spiffs,   0xD10000, 2M,

1.app1:15puzzle(game)について
 ◆下記ブログ内記事を参照して下さい。
 ・ES3C28P ESP32S3 で懐かしの15パズル「15puzzle」を作ってみた
 es3c28p_15puzzle

2.app2:パタパタ時計表示&RSSニュース音声出力について
 ◆下記ブログ内記事を参照して下さい。
 ・ES3C28P HU-086 (ESP32S3) でパタパタ時計 RSSニュースを音声合成で出力してみた
 es3c28p_rssnews

3.app3:rdiko&インターネットラジオについて
 ◆下記ブログ内記事を参照して下さい。
 ・ES3C28P HU-086 (ESP32S3) でradiko/internet-radio を作ってみた

 es3c28p_radiko
 es3c28p_iradio

4.app4:xiaozhi-rsp32 ベトナムバージョンについて
 ◆下記ブログ内記事を参照して下さい。
 ・ES3C28P HU-086 (ESP32S3) に xiaozhi ベトナム 版をを入れてみた
 es3c28p_xiaozhi
 
5.実際の切り替えデモ
 

以上

ブログトップへ

◆HU-086 (ESP32S3) ボードでファミコンのエミュレータ「ESP32-S3_Uno-nofrendo」を
 動かしてみました。
 各種ボタンも付いていてスムースに動かすことが出来ました。
 またマルチアプリ対応にしました。
 hu-086_game
 
1.下準備として下記ブログ内記事を参照して「ESP32-S3_Uno-nofrendo」を
  インストールして下さい。
  ・ESP32S3ボードでファミコンのエミュレータ「ESP32-S3_Uno-nofrendo」を動かしてみた

2.開発環境 2026/02/26時点(最新だとエラーが出るかもです。)
  ①Windows11 X64 Pro 25H2 
  ②Arduino IDE 2.3.7(最新V2.3.8)
  ➂ESP32ボードバージョンV3.3.5(最新V3.3.6)
  ④Arduino_GFX_Library(GFX Library for Arduino) V1.6.2(最新V1.6.5)
  ⑤IDE設定(マルチアプリ対応)
   ・esp32s3 Dev
   ・USBCDCOnBoot="Disabled"
   ・Flash Size=4MB
   ・Partition Scheme: "Huge APP(3MB)"
   ・psram="Disabled"

2.スケッチについて
 ①フォルダをまとめてzipファイルにして有ります。
 フォルダ内容
 hu-086_nes


 (保障無しの自己責任で)  HU-086_nofrendo.zip


以上 今日は、ここまで


ブログトップへ

◆HU-086 ESP32S3ボードの解析がほぼ終わったので、購入時のアプリに似せた
 マルチアプリセレクターを作成してアプリも入れてみました。
 hu-086_app4


 マルチアプリセレクターの基本は、下記ブログ内記事を参照して下さい。
  ・ESP32S3 ArduinoIDE で簡易的なランチャーを作ってみた
 
 (1)現在、下記の四つのアプリを選択して実行できます。
  ⓪main:メインのアプリセレクター
  ①app1:NESエミュレータ(game)
  ②app2:パタパタ時計表示&RSSニュース音声出力
  ➂app3:rdiko&インターネットラジオ
  ④app4:xiaozhi-rsp32 ベトナムバージョン
  フラシュメモリを調整することでもう少し増やせると思います。
 
 (2)現在各アプリに下記のサイズを指定しています。
 また下記パーティションアドレスに応じてflash_download_tool_3.9.7で書き込みます。

  partitions.csvの内容
  # Name,   Type, SubType,  Offset,   Size,     Flags
  nvs,      data, nvs,      0x9000,   0x5000,
  otadata,  data, ota,      0xe000,   0x2000,
  factory,  app,  factory,  0x10000,  1M, <-⓪main
  app1,     app,  ota_0,    0x110000, 2M, <-①app1
  app2,     app,  ota_1,    0x310000, 3M, <-②app2
  app3,     app,  ota_2,    0x610000, 3M, <-➂app3
  app4,     app,  ota_3,    0x910000, 4M, <-④app4
  storage,  data, spiffs,   0xD10000, 2M,
 
0.main:メインのアプリセレクターについて
 ①アプリ選択画面
 hu-086_main

 ②main.ino スケッチ(保障無しの自己責任で)
//main.ino
//2026/02/102 By JK1VCK マルチアプリセレクター
//blog URL:https://gijin77.blog.jp/archives/46690906.html

#include <esp_ota_ops.h>
#include <esp_partition.h> // パーティション操作に必要
#include <Arduino_GFX_Library.h>

String board ="Hello HU-086 ESP32S3";
#define LCD_MOSI 39
#define LCD_CS   -1
#define LCD_DC   38
#define LCD_SCK  40
#define LCD_RST  41
#define GFX_BL   42 

Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC, LCD_CS, LCD_SCK, LCD_MOSI, -1);
Arduino_ST7789 *gfx = new Arduino_ST7789(bus, LCD_RST, 0);//

//操作ボタンピン設定
int sw_pins[] = {18,8,46,14,45,48,47,21};
char sw_name[][6] ={"UP","LEFT","RIGHT","DOWN","B","STA","A","SEL"};

void bootApp(int index) {
  esp_partition_subtype_t subtype = (esp_partition_subtype_t)(ESP_PARTITION_SUBTYPE_APP_OTA_0 + index);
  // 指定したサブタイプのパーティションを探す
  const esp_partition_t* target = esp_partition_find_first(ESP_PARTITION_TYPE_APP, subtype, NULL);
  if (target != NULL) {
    gfx->fillScreen(BLACK);
    gfx->setTextColor(ORANGE);
    gfx->setTextSize(2); 
    gfx->setCursor(50,100);
    gfx->printf("Switching to: %s\n", target->label);    
    Serial.printf("Switching to: %s\n", target->label);
    esp_ota_set_boot_partition(target);
    delay(1000);
    esp_restart();
  } else {
    Serial.println("Error: Partition not found!");
  }
}

void setup() {
    Serial.begin(115200);
    delay(2000);
    const esp_partition_t* running = esp_ota_get_running_partition();

  // ===== ディスプレイ初期化 =====
  if (!gfx->begin()) {
    Serial.println("gfx->begin() failed!");
  } else {
    Serial.println("gfx->begin() OK!!");
  }
  pinMode(GFX_BL, OUTPUT);
  digitalWrite(GFX_BL, LOW);
  gfx->invertDisplay(true);   // ← これを追加
  gfx->setRotation(1);
  gfx->fillScreen(RED);delay(300);
  gfx->fillScreen(GREEN);delay(300);  
  gfx->fillScreen(BLUE);delay(300);
  gfx->fillScreen(BLACK);
  gfx->setTextColor(ORANGE);
  gfx->setTextSize(3); 
  gfx->setCursor(50,5);
  gfx->print("App selector");
  gfx->setCursor(50,45);
  gfx->print("   by JK1VCK");
  for (int i = 0; i < 8; i++) {
    pinMode(sw_pins[i], INPUT_PULLUP); //釦入力設定
  }  
  Serial.printf("現在起動中のパーティション: %s\n", running->label);
  dispmain();
  Serial.println("\n--- MAIN MENU ---");
  Serial.println("Send '1', '2', 3 , or ' 4' to switch apps.");
  dispmain();
}

void loop() {
int sel=select_app();
  bootApp(sel);
}

String app[4]={"App1:game","App2:RSS News","App3:radiko","App4:xiaozhi"};
int sel=0, old_sel=-1;

void dispmain(){
  gfx->setTextSize(3);   
  for(int i=0;i<4;i++){
    gfx->setCursor(40,90+i*40);
    if (i==sel) gfx->setTextColor(YELLOW);
    else        gfx->setTextColor(CYAN);
    gfx->print(app[i]);
  }
}

int button_input(){
int sw;
  for (int i = 0; i < 8; i++) {
    sw=digitalRead(sw_pins[i]);
    if (sw==0) {
      delay(200);
      return i+1;
    }
  }
  return 0;
}

int select_app() {
  int i,key;
  Serial.println("select_file start");    
  for(;;){
    key = button_input();
    if (key==0) continue;
    if (key==8) break; //sel
    if (key==1) sel--; //up
    if (key==4) sel++; //down
    if (sel<0)  sel=3;
    if (sel>=4) sel=0;
    Serial.printf("key=%d sel=%d old=%d\n",key,sel,old_sel);    
    if (sel!=old_sel){
      for(i=0;i<4;i++){
        gfx->setCursor(40,90+i*40);
        if (i==sel) gfx->setTextColor(YELLOW);
        else        gfx->setTextColor(CYAN);
        gfx->print(app[i]);
      }
      old_sel=sel;
    }
    delay(50);
  }
  return(sel);
}

 ➂パーティションテーブル partitions.csv

 # Name,   Type, SubType,  Offset,   Size,     Flags
 nvs,      data, nvs,      0x9000,   0x5000,
 otadata,  data, ota,      0xe000,   0x2000,
 factory,  app,  factory,  0x10000, 1M,
 app1,     app,  ota_0,    0x110000, 2M,
 app2,     app,  ota_1,    0x310000, 3M,
 app3,     app,  ota_2,    0x610000, 3M,
 app4,     app,  ota_3,    0x910000, 4M,
 storage,  data, spiffs,   0xD10000, 2M,



1.app1:NESエミュレータ(game)について
 ◆下記ブログ内記事を参照して下さい。
 ・HU-086 (ESP32S3) でファミコンのエミュレータ「ESP32-S3_Uno-nofrendo」を
  動かしてみた


 *ゲーム画面 
 hu-086_game

2.app2:パタパタ時計表示&RSSニュース音声出力について
 ◆下記ブログ内記事を参照して下さい。
 ・ES3C28P HU-086 (ESP32S3) でパタパタ時計 RSSニュースを音声合成で出力してみた

 *RSSニュース読み上げ画面 
 hu-086_rssnews

3.app3:rdiko&インターネットラジオについて
 ◆下記ブログ内記事を参照して下さい。
 ・ES3C28P HU-086 (ESP32S3) でradiko/internet-radio を作ってみた

 *radiko再生画面
 hu-086_radiko

 *インターネットラジオ再生画面
 hu-086_i_radio

4.app4:xiaozhi-rsp32 ベトナムバージョンについて
 ◆下記ブログ内記事を参照して下さい。
 ・ES3C28P HU-086 (ESP32S3) に xiaozhi ベトナム 版をを入れてみた

 *会話中画面
 hu-086_xiaozhi_vn_1

 *音楽再生画面
 hu-086_xiaozhi_vn_2

 *待機画面
 hu-086_xiaozhi_vn_3


今日は、ここまで(順次追加記載していきます)


ブログトップへ

◆ES3C28P HU-086 (ESP32S3) の二つのボードでパタパタ時計を表示しつつ RSSニュースを
 音声合成で出力してみました。
 以前やっていたものの音声出力部分のライブラリを「ESP32-audioI2S-master」へ替えて
 みました。
 スケッチは、ほとんどの部分を共通化して、SW入力/タッチ入力と音出力部分をボードに
 合わせて切り替えています。
 rss_news

1.開発環境 2026/02/26時点(最新だとエラーが出るかもです。)
  ①Windows11 X64 Pro 25H2 
  ②Arduino IDE 2.3.7
  ➂ESP32ボードバージョンV3.3.5(最新V3.3.6)
  ④Arduino_GFX_Library(GFX Library for Arduino) V1.6.2(最新V1.6.5)
  ⑤ESP32-audioI2S-maste V3.4.2(最新V3.4.4)
  ⑥FT6336U_CTP_Controller
  ⑦IDE設定
   ・esp32s3 Dev
   ・USBCDCOnBoot=> es3c28p="Enabled" hu-086=="Disabled"
   ・Flash Size=4MB
   ・Partition Scheme: "Huge APP(3MB)"
   ・psram=OPIPSRAM
  ⑧オーディオIC「ES8311」のドライバは、
   「libraries\ESP32-audioI2S-master\examples\ES8311\es8311.h」
   「libraries\ESP32-audioI2S-master\examples\ES8311\es8311.cpp」
   の2つを「es3c28p_RSSNews_V9_M.ino」と同じフォルダへコピペします。

2.スケッチについて

 ①ES3C28P/HU-086ボードの切り替えは、「es3c28p_RSSNews_V9_M.ino」内、
  下記22/23行の
  #define  ES3C28Pのコメントを取ることで選択出来ます。
 RSSnews

 ②フォルダをまとめてzipファイルにして有ります。
 フォルダ内容
 es3c28p_RSSNews_V9_M

 (保障無しの自己責任で)  es3c28p_RSSNews_V9_M.zip
 




 今日は、ここまで



ブログトップへ

◆ES3C28P HU-086 (ESP32S3) の二つのボードでradiko/internet-radioを作ってみました。
 以前やっていたものの音声出力部分のライブラリを「ESP32-audioI2S-master」へ替えて
 みました。
 radiko

 i_radio

1.開発環境 2026/02/26時点(最新だとエラーが出るかもです。)
  ①Windows11 X64 Pro 25H2 
  ②Arduino IDE 2.3.7(最新V3.3.8)
  ➂ESP32ボードバージョンV3.3.5(最新V3.3.6)
  ④Arduino_GFX_Library(GFX Library for Arduino) V1.6.2(最新V1.6.5)
  ⑤ESP32-audioI2S-maste V3.4.2(最新V3.4.4)
  ⑥FT6336U_CTP_Controller
  ⑦IDE設定(マルチアプリ対応)
   ・esp32s3 Dev
   ・USBCDCOnBoot=> es3c28p="Enabled" hu-086=="Disabled"
   ・Flash Size=4MB
   ・Partition Scheme: "Huge APP(3MB)"
   ・psram=OPIPSRAM
  ⑧オーディオIC「ES8311」のドライバは、
   「libraries\ESP32-audioI2S-master\examples\ES8311\es8311.h」
   「libraries\ESP32-audioI2S-master\examples\ES8311\es8311.cpp」
   の2つを「es3c28p_radiko_M.ino」と同じフォルダへコピペします。

2.スケッチについて
 ①radiko/FFTレベルメータ表示の為に、「ESP32-audioI2S-maste」を改修する必要があります。
  下記ブログ内記事を参照して構築して下さい。
  ・ES3C28P JC3248W535 で「radiko」を聞きながらサウンドレベルメータを表示してみた

 ②ES3C28P/HU-086ボードの切り替えは、「es3c28p_radiko_M.ino」内、下記27/28行の
  #define  ES3C28Pのコメントを取ることで選択出来ます。
 es3c28p_hu-086

 ➂マルチアプリ対応の追記(リスタート後、MAIN Appを起動)
 Multi_app

 ④フォルダをまとめてzipファイルにして有ります。
 フォルダ内容
 radiko_m

 (保障無しの自己責任で)  es3c28p_radiko_M.zip

 今日はここまで

ブログトップへ

◆ES3C28P HU-086 (ESP32S3) の二つのボードに機能強化されたxiaozhiベトナム版を入れて
 みました。
 ベトナム版は、
 ①待機中に時刻、天気予報を表示出来ます。
 ②音楽再生時にスペクトラムレベルを表示出来ます。
 ソースは、下記でダウンロードしました。
 TienHuyIoT/xiaozhi-esp32_vietnam
 
 *待機中時刻・気象情報表示します。
 xiaozhi_2

 *ちょっと日本語表示がおかしいです。
 xiaozhi_1

1.ボード選択
 ①ES3C28P xiaozhi-ai-iot-vietnam-es3n28p-lcd-2.8
 ②HU-086  bread-compact-wifi-lcd(gpio等修正)
 *「main\boards\bread-compact-wifi-lcd」の中を下記のファイルと入れ替えて下さい。
 (保障無しの自己責任で)  bread-compact-wifi-lcd.zip

2.ビルド手順

 ターゲットが切り替わらない時のおまじない
 現在のターゲット確認:
 >echo $Env:IDF_TARGET

 環境変数を手動クリア
 >Remove-Item Env:IDF_TARGET

 >idf.py set-target esp32s3 *ターゲットを指定する
 ***************************************************

 >idf.py fullclean

 >idf.py set-target esp32s3

 >idf.py menuconfig

 Xiaozhi Assistant  --->
   *日本語を選択する
    Default Language (Chinese)  --->       (X) Japanese
   *ボードに合わせて選択する
    Board Type (Bread Compact WiFi (面包板))  ---> (X) Bread Compact WiFi + LCD (面包板) 
   *ライン形式の表示を選択する
    Select display style (Enable default message style)  ---> (X) Enable WeChat Message Style 
 *待機画面で気象情報を表示するよう[*]チェックする
   Enable Weather Feature (Idle Display for LCD) 

 ◆必要に応じて「SDカード」「タッチパネル」設定をする

  ESC ESC (Y) *設定を保存する

 >idf.py build

 *シリアルポートを設定する

 >idf.py -p COM10 flash monitor

 >idf.py merge-bin  *必要に応じて一つのファイルに纏める
 
 ◆menuconfig Xiaozhi Assistant 
 Xiaozhi_Assistant

3.マルチアプリ用に「main\main.cc」を修正します。
 ①13,14行を追記
 ②72~77行を追記
 このおまじないで、リセットをかけた時にメインの「factory」から起動するようになります。
 マルチアプリを使う時だけ、必要です。

#include <esp_log.h>
#include <esp_err.h>
#include <nvs.h>
#include <nvs_flash.h>
#include <driver/gpio.h>
#include <esp_event.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

#include "application.h"
#include "system_info.h"

#include <esp_ota_ops.h>  //multi app 
#include <esp_partition.h>

#define TAG "main"

void task_monitor(void *pvParameters)
{
    const int max_tasks = 30;
    TaskStatus_t task_list[max_tasks];
    UBaseType_t task_count;
    uint32_t total_runtime;

    while (1)
    {
        task_count = uxTaskGetSystemState(task_list, max_tasks, &total_runtime);

        ESP_LOGI(TAG, "----- Task Stack Monitor -----");

        for (int i = 0; i < task_count; i++)
        {
            UBaseType_t hw = task_list[i].usStackHighWaterMark;  // đơn vị: words (4 bytes)
#if ( configTASKLIST_INCLUDE_COREID == 1 )
            ESP_LOGI(TAG,
                     "%-16s | Free: %4u bytes | Prio: %2u | Core: %u",
                     task_list[i].pcTaskName,
                     hw,
                     task_list[i].uxCurrentPriority,
                     task_list[i].xCoreID
            );
#else
            ESP_LOGI(TAG,
                     "%-16s | Free: %4u bytes | Prio: %2u",
                     task_list[i].pcTaskName,
                     hw,
                     task_list[i].uxCurrentPriority
            );
#endif
        }

        ESP_LOGI(TAG, "--------------------------------");

        vTaskDelay(pdMS_TO_TICKS(5000));  // 5s
    }
}

extern "C" void app_main(void)
{
    // Initialize the default event loop
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    // Initialize NVS flash for WiFi configuration
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_LOGW(TAG, "Erasing NVS flash to fix corruption");
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);
 
    //multi app 
    const esp_partition_t* factory = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL);
    if (factory != NULL) {
        esp_ota_set_boot_partition(factory);
        //printf("Next boot: Main Menu%d \n",0);
    }

    // Launch the application
    auto& app = Application::GetInstance();
    app.Start();

    // xTaskCreatePinnedToCore(task_monitor, "TaskMonitor", 1024 * 3, NULL, 1, NULL, tskNO_AFFINITY);
}


 ➂マルチアプリについては、下記ブログを参照して下さい。
  ・ESP32S3 ArduinoIDE で簡易的なランチャーを作ってみた
  ・HU-086 ESP32S3ボードでマルチアプリセレクターを作ってみた


今日は、ここまで


ブログトップへ

◆ES3C28P ESP32S3ボードでボケ防止に昔懐かしの15パズルを移植してみました。
 このボードは、タッチパネル、音出力が付いていますので、ハード追加無しで
 作成できます。他のボードにも簡単に移植できると思います。
 参考元のサイトを、下記に示します。先人に感謝です。
 DIY ESP32 15 Puzzle game on TFT touch Dispaly

 このボードについては、下記ブログ内記事も参照してみて下さい。
 ①・ES3C28P JC3248W35 でNESエミュレータ「ESP32-S3_Uno-nofrendo」を動かしてみた
 ②・ES3C28P JC3248W535 で「radiko」を聞きながらサウンドレベルメータを表示してみた

 puzzle15_1

1.開発環境 2026/02/16時点(最新だとエラーが出るかもです。)
  ①Windows11 X64 Pro 25H2 
  ②Arduino IDE 2.3.7
  ➂ESP32ボードバージョンV3.3.5(最新V3.3.6)
  ④Arduino_GFX_Library(GFX Library for Arduino) V1.6.2(最新V1.6.5)
  ⑤ESP32-audioI2S-maste V3.4.2(最新V3.4.4)本体のライブラリは使用せず
  ⑥FT6336U_CTP_Controller <ーここでダウンロード
  ⑦IDE設定
   ・esp32s3 Dev
   ・USBCDCOnBoot="Enabled"
   ・Flash Size=4MB
   ・Partition Scheme: "Huge APP(3MB)"
   ・PSRAM="Disabled"
  ⑧オーディオIC「ES8311」のドライバは、
   「libraries\ESP32-audioI2S-master\examples\ES8311\es8311.h」
   「libraries\ESP32-audioI2S-master\examples\ES8311\es8311.cpp」
   の2つを「ES3C28P_15puzzle.ino」と同じフォルダへコピペします。

2.スケッチ.
  (1)「es3c28p_15puzzle.ino」--本体スケッチ
  (2)「es8311.h」--------------------オーディオチップ用ドライバ
  (3)「es8311.cpp」-----------------オーディオチップ用ドライバ
   (保障無しの自己責任で)  es3c28p_15puzzle.zip


3.使い方
 ①ゲームの使い方は、説明する必要はないと思いますが。
  *ゲームスタート画面(STARTタッチで開始)
 puzzle15_0

 ②このスケッチは、マルチアプリ対応に作って有り、タッチエリア
  「X>300 y<60」 をタッチすることにより、リスタートします。
  *ゲーム画面とタッチエリア
 puzzle15_3

 *下記表示後リスタートします。
 puzzle15_2

 ◆マルチアプリについては、下記ブログ内記事を参照してみて下さい。
 ・ESP32S3 ArduinoIDE で簡易的なランチャーを作ってみた


以上 今日はここまで

ブログトップへ

ADCピン対応

ADC2ピン対応
以上

ブログトップへ



以上の内容はhttps://gijin77.blog.jp/archives/2026-02.htmlより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14