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


◆M5StickC,Plus,Plus2,M5StackGLAYで「パタパタ時計もどき」を表示させてみました。
 先日LCD付ESP32ボードで作ったものの続きです。
 スケッチは、先日の物にM5用のパラメータを追記しました。
 下記ブログ内記事を参照して下さい。
 ・数種のLCD付ESP32ボードで「パタパタ時計もどき」を表示させてみた

 m5_StickC

1.M5の種類(サイズ、解像度、ドライバIC、バックライト制御、名前)
 ①2インチ   w320 x h240 ILI9342 GPIO32 M5Stack BASIC/GLAY
 ②1.14インチ w240 x h135 ST7789  GPIO27 M5StickCPlus2
 ➂1.14インチ w240 x h135 ST7789  AXP192 M5StickCPlus
 ④0.96インチ w160 x h80  ST7735  AXP192 M5StickC

2.バックライトの制御方法
 ①M5StickC,M5StickCPlusは、電源管理IC「AXP192」の「LDO2」ピンで制御しています。
  今回M5.LCDライブラリを使用せず「Arduino_GFX_Library」のみで行っているために
  特別に初期設定で直接制御しました。
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 #include <Wire.h>
 #include <AXP192.h>
 AXP192 power;  // AXP192オブジェクトを作成

 #define GFX_EXTRA_PRE_INIT()
    {
       Wire.begin(21, 22);  // I2Cの初期化 (SDA, SCL)
       power.begin(true);   // AXP192の初期化 LDO2をONにしてLCDバックライトを点灯
       power.SetLDO2(3000); // 3.0Vに設定 (通常のLCDバックライトの電圧は3.3V)
    }
 ---------------------------------------------------------------------------------------------------------------

 ②M5StickCPlus2は、普通にバックライトLEDをGPIO327ピンで制御しています。 
  それとバッテリー時電源ONを保持する為に、初期設定でGPIO4ピン(HOLD)を
  「HIGH」に制御しました。
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 #define GFX_EXTRA_PRE_INIT()
    {
       pinMode(4, OUTPUT);
       digitalWrite(4 ,HIGH);
    }
 ---------------------------------------------------------------------------------------------------------------

 ➂M5Stack BASIC/GLAYは、普通にバックライトLEDをGPIO32ピンで制御しています。 

2.開発環境 2024/07/18時点
  ①Windows11 X64 Pro 23H2 
  ②Arduino IDE 2.3.2
  ➂ESP32ボードバージョンV3.0.2
  ④Arduino_GFX_Library v1.4.7
  ⑤ボードの選択は、
   *それぞれ、M5Core,M5StickC-Plus.M5StickC-Plus,M5StickC
   *M5StickCPlus2は、無かったのでM5StickC-Plusを使用
  ⑥コンパイル時のAPPサイズ
   *機種によってはPartion Scheme」->Defaut から->No OTA(2MB APP)にしました。 

3.スケッチとイメージファイル
    (保障無しの自己責任で)  FlipClockV2.zip

 ①先日のものに、M5関連を追記したのと、1秒毎にLEDを点滅させるようにしました。
 *点滅がうっとうしい場合、定義の時に、LEDON時も消灯に定義します。
  #define LEDON    HIGH ◆LEDの配線によりH/Lを指定します。
  #define LEDOFF   LOW

4.パタパタ時計実行の様子
 

以上


ブログトップへ

◆数種の解像度の違うLCD付ESP32ボードでパタパタ時計を表示させてみました。
 パタパタ時計をネットで探したのですがうまくヒットしなかったので
 「無料 画像 パタパタ時計」で検索し手使えそうな画像をみつけ、
 Arduinoで使えるデータに変換しました。
 グラフィックライブラリは、「Arduino_GFX_Library」を使いました。
 違うサイズ、ボードでひとつのスケッチで使えるようにしました。
 S__51535928
 ◆自作2.8インチLCD
 LCD2_8_ESP32

 ◆「Arduino_GFX_Library」の導入については、下記ブログ内記事を参照して下さい。
 ・ESP32 グラフィックライブラリを「TFT_eSPI」から「Arduino_GFX_Library」へ変更してみた

1.ボードの種類(下記の6種類)
 1.サイズ、解像度、ドライバIC、ボード名
  ①3.5インチ w480 x h320 ST7796 ESP32-3248S035
  ②2.8インチ w320 x h240 ST7789 JC2432W328
  ➂1.9インチ w240 x h170 ST7789 ESP32-1732S019
  ④1.14インチ w240 x h135 ST7789 TTGO_Display
  ⑤2.8インチ w320 x h240 ILI9341 M5Stack_modoki(2.8インチLCD使用自作)
  ⑥2.8インチ w320 x h240 ILI9341 ESP32_AA((2.8インチLCD使用自作)

 2.入手先
  ①3.5インチ ESP32-3248S035 (AliExpress) (Amazon)
  ②2.8インチ JC2432W328 (AliExpress)
  ➂1.9インチ ESP32-1732S019 (AliExpress)
  ④1.14インチ TTGO_Display (AliExpress) (Amazon)

 3.ブログ内参考記事
  ①・ESP32-3248S035「Arduino_GFX_Library」でニュース表示をしてみた
  ②・JC2432W328 「Arduino_GFX_Library」でニュース表示をしてみた
  ➂・ESP32-1732S019「Arduino_GFX_Library」でニュース表示をしてみた
  ④・TTGO-Display 「Arduino_GFX_Library」でニュース表示をしてみた
  ⑤・数種のLCD付ESP32ボードで「Arduino_GFX_Library」のデモを動かしてみた

2.開発環境 2024/07/05時点
  ①Windows11 X64 Pro 23H2 
  ②Arduino IDE 2.3.2
  ➂ESP32ボードバージョンV3.0.2
  ④Arduino_GFX_Library v1.4.7
  ⑤ボードの選択は、
   *ESP32-1732S019のみ「ESP32S3 Dev Module」 他は、「ESP32 Dev Module」
  ⑥コンパイル時のAPPサイズ
   *ボードによってはPartion Scheme」->Defaut から->No OTA(2MB APP)にしました。

3.基本となるパタパタ時計の画像からArduinoで使えるデータ形式に変換
 1.画像は、0-9と切替時の画像20枚を変換しました。
 flipclock_img
 2.自分好みの数字にしたい場合、画像を用意して下記サイトで変換して下さい。
  画像データImageData化

 3.変換方法
  ①まず画像ファイルを選択します。
  ②変換後のデータ名を指定します。
  ➂データ形式を選択します。
  ④「送信」をクリックします。
  ⑤データを最後まで選択し、コピーします。
  ⑥テキストエデッタを開き、ペーストします。
  以上を繰り返し数字データを作成します。
 画像変換サイト

  ◆そのままコピーで「PROGMEM」があるとコンパイル時にエラーが
  発生する時は「PROGMEM」を削除します。
  私の場合、エラーが発生しました。
  
  const unsigned short H00 PROGMEM[8400] = {
    0x4A49,0x4A49,0x4A49,0x4A49,0x4A69,
    
    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

   const unsigned short H00[8400] = {
    0x4A49,0x4A49,0x4A49,0x4A49,0x4A69,  

4.スケッチとイメージファイル
  (保障無しの自己責任で)  FlipClock.zip

 ①もうちょっとスマートに出来ると思いますが、まずは動かす事を優先しました。
  そのうち修正しようと思っています。
 ②大きいLCDは、画像表示に時間がかかり過ぎるため秒の桁のみ変わり目の表示を
  行っています。
 ➂下記は、スケッチの前半部です。
  12行から18行で当該のボードを「define」指定で行います(コメントを取る)
  他は「//」コメントアウトする
  20行目から124行目までの間で指定されたボードのピン番号などが生かされます。
  後、127,128行目を使用するWiFiのSSIDとPASSWORDに修正します。
  その後、コンパイル&書き込みをします。
//FlipClock.ino
//V1 /2024/07/15 By JK1VCK <Arduino_GFX_Library.h>使用
//blog URL:https://gijin77.blog.jp/archives/41498890.html

#include "Arduino.h"
#include "Arduino_GFX_Library.h"
#include "img_H0-4.h"
#include "img_H5-9.h"
#include <WiFi.h>
#include <time.h>

//LCD Type によって変わる
#define    TTGO_Display
//#define    ESP32_1732S019
//#define    JC2432W328
//#define    ESP32_3248S035
//#define    M5Stack_modoki
//#define    ESP32_AA

#if defined(TTGO_Display)
//TTGO Display
String board ="Hello TTGO Display";
#define LED   17 //TTGO Display
#define LCD_MISO -1
#define LCD_MOSI 19
#define LCD_SCK  18
#define LCD_CS    5
#define LCD_DC   16
#define LCD_RST  23
#define GFX_BL    4

Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC , LCD_CS , LCD_SCK, LCD_MOSI,LCD_MISO);
// 1.14" IPS LCD 135x240
Arduino_GFX *gfx = new Arduino_ST7789(bus, LCD_RST, 0 /* rotation */, true /* IPS */, 135 /* width */, 240 /* height */, 52 /* col offset 1 */, 40 /* row offset 1 */, 53 /* col offset 2 */, 40 /* row offset 2 */);

#elif defined(ESP32_1732S019)
//ESP32_1732S019
String board ="Hello ESP32S3-1732S019";
#define LED -1
#define LCD_MISO -1
#define LCD_MOSI 13
#define LCD_SCK  12
#define LCD_CS   10
#define LCD_DC   11
#define LCD_RST   1
#define GFX_BL   14

Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC , LCD_CS , LCD_SCK, LCD_MOSI,LCD_MISO);
Arduino_GFX *gfx = new Arduino_ST7789(bus, LCD_RST /* RST */, 1 /* rotation */, true /* IPS */, 170 /* width */, 320 /* height */, 35 /* col offset 1 */, 0 /* row offset 1 */, 35 /* col offset 2 */, 0 /* row offset 2 */);

#elif defined(JC2432W328)
//JC2432W328
String board ="Hello JC2432W328";
#define LED   4 
#define LCD_MISO 12
#define LCD_MOSI 13
#define LCD_SCK  14
#define LCD_CS   15
#define LCD_DC    2
#define LCD_RST  -1
#define GFX_BL   27

Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC , LCD_CS , LCD_SCK, LCD_MOSI,LCD_MISO);
Arduino_GFX *gfx = new Arduino_ST7789(bus,LCD_RST, 1 /* rotation */);

#elif defined(ESP32_3248S035)
//ESP32-3248S035
String board ="Hello ESP32-3248S035";
#define TOUCH_XPT2046_MISO 12
#define TOUCH_XPT2046_MOSI 13
#define TOUCH_XPT2046_SCK  14
#define TOUCH_XPT2046_CS   33
#define TOUCH_XPT2046_ROTATION 3
#define LED   4 //
#define LCD_MISO 12
#define LCD_MOSI 13
#define LCD_SCK  14
#define LCD_CS   15
#define LCD_DC    2
#define LCD_RST  -1
#define GFX_BL   27

Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC , LCD_CS , LCD_SCK, LCD_MOSI,LCD_MISO,HSPI /* spi_num */);
Arduino_GFX *gfx = new Arduino_ST7796(bus,LCD_RST, 1 /* rotation */);

#elif defined(M5Stack_modoki)
//M5Stackもどき
String board ="Hello M5Stack_modoki";
#define TOUCH_XPT2046_MISO 19
#define TOUCH_XPT2046_MOSI 23
#define TOUCH_XPT2046_SCK  18
#define TOUCH_XPT2046_CS   21
#define TOUCH_XPT2046_ROTATION 3
#define LED 2
#define LCD_MISO 19
#define LCD_MOSI 23
#define LCD_SCK  18
#define LCD_CS   14
#define LCD_DC   27
#define LCD_RST  33
#define GFX_BL   32
Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC , LCD_CS , LCD_SCK, LCD_MOSI,LCD_MISO);
Arduino_GFX *gfx = new Arduino_ILI9341(bus,LCD_RST, 1 /* rotation */);

#else
//ESP32_AA アンテナアナライザーLCD
String board ="Hello ESP32_AA";
#define TOUCH_XPT2046_MISO 19
#define TOUCH_XPT2046_MOSI 23
#define TOUCH_XPT2046_SCK  18
#define TOUCH_XPT2046_CS   4
#define TOUCH_XPT2046_ROTATION 1
#define LED 2
#define LCD_MISO 19
#define LCD_MOSI 23
#define LCD_SCK  18
#define LCD_CS    5
#define LCD_DC   17
#define LCD_RST  16
#define GFX_BL   -1
Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC , LCD_CS , LCD_SCK, LCD_MOSI,LCD_MISO);
Arduino_GFX *gfx = new Arduino_ILI9341(bus,LCD_RST, 1 /* rotation */);

#endif

//***************************************************************************
const char *ssid = "XXXXXXX"; //put your Wi-Fi SSID
const char *password = "YYYYYYYY"; //put your Wi-Fi password

const char *timeZone = "JST-9";
const char *server = "pool.ntp.org"; //"ntp.nc.u-tokyo.ac.jp"


5.パタパタ時計実行の様子
 

以上


ブログトップへ

◆数種の解像度の違うLCD付ESP32ボードで「Arduino_GFX_Library」の
 デモソフトを同一スケッチで動かしてみました。
 まあ、サンプルソフトをモディファイしてイメージファイルも表示する
 ようにしただけですけどね。
 「Arduino_GFX_Library」の導入については、下記ブログ内記事を参照して下さい。
 ・ESP32 グラフィックライブラリを「TFT_eSPI」から「Arduino_GFX_Library」へ変更してみた

1.解像度やドライバの違うLCDボードで一つのスケッチで動かすために
 ①ボード指定を最初に「define」指定で行う(コメントを取る)
  他は「//」コメントアウトする

  //LCD Type によって変える
  //#define    TTGO_Display
  //#define    ESP32_1732S019
  //#define      JC2432W328
  #define    ESP32_3248S035
  //#define    M5Stack_modoki
  //#define    ESP32_AA

 ②解像度に合わせてイメージファイルの拡大縮小プログラムの作成

  // スケーリング関数
  void drawScaledBitmap(int16_t x, int16_t y, const uint16_t *bitmap,
    int16_t w, int16_t h, int16_t nw, int16_t nh) {
  float scaleX = (float)nw/(float)w; // 幅を縮小率を計算
  float scaleY = (float)nh/(float)h; // 高さの縮小率を計算

    for (int16_t j = 0; j < h; j++) {
      for (int16_t i = 0; i < w; i++) {
        int16_t newX = x + (int16_t)(i * scaleX);
        int16_t newY = y + (int16_t)(j * scaleY);
        uint16_t color = bitmap[j * w + i];
        gfx->drawPixel(newX, newY, color);
      }
    }
  }


2.スケッチとイメージファイル
  (保障無しの自己責任で)  ArduinoGFXDemo.zip
 

3.同時デモの様子
 ◆ボードのサイズ、解像度、ドライバICとボード名(上から)
 ①3.5インチ w480 x h320 ST7796 ESP32-3248S035
 ②2.8インチ w320 x h240 ST7789  JC2432W328
 ➂1.9インチ w240 x h170 ST7789  ESP32-1732S019
 ④1.14インチ w240 x h135 ST7789 TTGO_Display

 S__51535882_0

 S__51535883_0


以上


ブログトップへ

◆1.9インチLCD付ESP32S3ボード「ESP32_1732S019」で「efont」
 「Arduino_GFX_Library」を使ってニュース表示をしてみました。
  *2倍角表示時
 ESP32-1732S019-2
 *1倍角表示時(文字数が多いときには1倍角で表示する)
 ESP32-1732S019-1
 ①ニュース表示については、下記ブログ内記事を参照して下さい。
 ・ESP32-1732S019 で efont を使いニュース表示をしてみた

 ②Arduino_GFX_Libraryについては、下記ブログ内記事を参照して下さい。
 ・ESP32 グラフィックライブラリを「TFT_eSPI」から「Arduino_GFX_Library」へ変更してみた

1.ESP32_1732S019ボードについては、先の下記ブログ内記事を参照してみて下さい。
  ・ESP32-1732S019 で efont を使いニュース表示をしてみた


2.開発環境 2024/07/05時点
  ①Windows11 X64 Pro 23H2 
  ②Arduino IDE 2.3.2
  ➂ESP32ボードバージョンV3.0.2
  ④Arduino_GFX_Library v1.4.7
  ⑤ボードの選択
 board_esp32s3devkit

  ⑥コンパイル時のAPPサイズ
   *efontの指定がminiでは「嘘八百」の嘘が表示されなかったので
   標準をインクルードすると、プログラムサイズがオーバーしたので
   「Partion Scheme」->Defaut から->No OTA(2MB APP)にして、
   使用率68%になりました。   
 No_OTA(2MB APP_68%

3.スケッチ(保障無しの自己責任で) 

 ◆ソース中下記のSSIDとPWを自分用に書き換えます。
 31 #define STASSID "XXXXXXXXX"
 32 #define STAPSK "YYYYYYYYYY"
 ◆ソース中下記のサイトで自分専用のAPI keyを取得して書き換えます。
 39 // Japan News API
 40 // https://newsapi.org/s/japan-news-api
 41 // change XXXXXXXXXX to your API key
 42 const char* NewsAPIURL = "http://newsapi.org/v2/top-headlines?
                 country=jp&apiKey=XXXXXXXXXX"

//ESP32_1732S019_Efont_NewsAPI.ino
//V1 /2024/07/11 By JK1VCK <Arduino_GFX_Library.h>使用
//blog URL:https://gijin77.blog.jp/archives/41451036.html

#include <Arduino_GFX_Library.h>
#include <SPI.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <efontEnableJa.h> //Partion Scheme->No OTA(2MB APP...68%
//#include <efontEnableJaMini.h> //Partion Scheme->Defaut ..(1.2MB APP..94%
#include <efont.h>

//ESP32_1732S019
#define LED   4 //
#define LCD_MISO -1
#define LCD_MOSI 13
#define LCD_SCK  12
#define LCD_CS   10
#define LCD_DC   11
#define LCD_RST   1
#define GFX_BL   14

Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC , LCD_CS , LCD_SCK, LCD_MOSI,LCD_MISO);
Arduino_GFX *gfx = new Arduino_ST7789(bus, LCD_RST /* RST */, 1 /* rotation */, true /* IPS */, 170 /* width */, 320 /* height */, 35 /* col offset 1 */, 0 /* row offset 1 */, 35 /* col offset 2 */, 0 /* row offset 2 */);

#define SCREEN_WIDTH  gfx->width() //ESP32_1732S019
#define SCREEN_HEIGHT gfx->height()

#define STASSID "XXXXXXXX"
#define STAPSK "YYYYYYYYYY"

const char *ssid = STASSID;
const char *pass = STAPSK;

WiFiMulti WiFiMulti;

// Japan News API
// https://newsapi.org/s/japan-news-api
// change XXXXXXXXXX to your API key
const char* NewsAPIURL = "http://newsapi.org/v2/top-headlines?country=jp&apiKey=XXXXXXXXXX";

uint8_t t_size = 1; //ニュース表示テキストサイズ
//**********************************************************************************************
//文字列を表示する
void disp(int16_t x,int16_t y,int16_t textsize,uint16_t color,String msg){
  gfx->setCursor(x, y);
  gfx->setTextSize(textsize);
  gfx->setTextColor(color);
  gfx->print(msg);
}
//**********************************************************************************************
//efont 文字列を表示する
void printEfont(int16_t x,int16_t y,int16_t txtsize,uint16_t color,uint16_t bgcolor,char *str) {
  int posX = x;
  int posY = y;
  int16_t textsize = txtsize;
  uint16_t textcolor = color;
  uint16_t textbgcolor = bgcolor;
  byte font[32];
  while( *str != 0x00 ){
    if( *str == '\n' ){     // 改行処理
      posY += 16 * textsize;
      posX += 16 * textsize;
      str++;
      continue;
    }
    uint16_t strUTF16;    // フォント取得
    str = efontUFT8toUTF16( &strUTF16, str );
    getefontData( font, strUTF16 );
    int width = 16 * textsize; // 文字横幅
    if( strUTF16 < 0x0100 ){
      width = 8 * textsize; // 半角
    }
    gfx->fillRect(posX, posY, width, 16 * textsize, textbgcolor); // 背景塗りつぶし
    for (uint8_t row = 0; row < 16; row++) {    // 取得フォントの確認
      word fontdata = font[row*2] * 256 + font[row*2+1];
      for (uint8_t col = 0; col < 16; col++) {
        if( (0x8000 >> col) & fontdata ){
          int drawX = posX + col * textsize;
          int drawY = posY + row * textsize;
          if( textsize == 1 ){
            gfx->drawPixel(drawX, drawY, textcolor);
          } else {
            gfx->fillRect(drawX, drawY, textsize, textsize, textcolor);
          }
        }
      }
    }
    posX += width; // 描画カーソルを進める
    if( (SCREEN_WIDTH-(8*textsize)) <= posX ){  // 折返し処理
      posX = 0;
      posY += 20 * textsize;
    }
  }
  gfx->setCursor(posX, posY);  // カーソルを更新
}
//**********************************************************************************************
//四角形を表示する
void Rect(int16_t x1,int16_t y1,int16_t x2,int16_t y2,uint16_t cl){
  gfx->drawFastVLine(x1,y1,y2-y1,cl);
  gfx->drawFastVLine(x2,y1,y2-y1,cl);
  gfx->drawFastHLine(x1,y1,x2-x1,cl);
  gfx->drawFastHLine(x1,y2,x2-x1,cl); 
}
//**********************************************************************************************
void setup() {
  pinMode(LED, OUTPUT); 
  digitalWrite(LED, HIGH); 
  Serial.begin(115200);
  delay(1000);
  for(int i=0;i<5;i++) {
    digitalWrite(LED, LOW);
    delay(200);
    digitalWrite(LED, HIGH);
    delay(200);
  }
  pinMode(GFX_BL, OUTPUT);
  digitalWrite(GFX_BL, HIGH); //バックライトON
  gfx->begin();
  gfx->setRotation(0);
  gfx->fillScreen(RED);delay(1000);
  gfx->fillScreen(GREEN);delay(1000);
  gfx->fillScreen(BLUE);delay(1000);
  gfx->setRotation(3);
  gfx->fillScreen(BLACK);
  Serial.println("1.9inch_ESP32_1732S019_NewsAPI Arduino_GFX_Library Start");  
  printEfont(1,16,2,CYAN , BLACK,(char *)"ニュース取得中");
  printEfont(1,64,2,CYAN , BLACK,(char *)"しばらくお待ち下さい");
  Rect(0,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1,YELLOW);//枠表示
  bool ret = WiFiMulti.addAP(ssid, pass);  // WiFi
  Serial.println(ret);
}

StaticJsonDocument<1024*30> doc;
//**********************************************************************************************
void loop() {
  char str[128];
  int waittime;
  Serial.println("loop");
  static int count = 0;
  if ((WiFiMulti.run() == WL_CONNECTED)) { // wait for WiFi connection
    HTTPClient http;
    String payload = "";
    Serial.print("[HTTP] begin...\n");
    if (http.begin(NewsAPIURL)) {  // HTTP
      Serial.print("[HTTP] GET...\n");
      int httpCode = http.GET();   // start connection and send HTTP header
      if (httpCode > 0) {          // httpCode will be negative on error
        // HTTP header has been send and Server response header has been handled
        Serial.printf("[HTTP] GET... code: %d\n", httpCode);
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { // file found at server
          payload = http.getString();
          Serial.println(payload);
        }
      } else {
        Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      }
      http.end();
    } else {
      Serial.printf("[HTTP} Unable to connect\n");
    }
    if (payload.length()) {
     while(1) {
      deserializeJson(doc, payload);
      digitalWrite(LED, LOW);
      gfx->fillScreen(BLACK);  //画面をクリア
      sprintf(str,"%d",count+1);
      printEfont(3,0,2,CYAN, BLACK,(char *)str);
      Serial.printf("No=%d News\n",count+1);
      String publishedAt = doc["articles"][0]["publishedAt"]; // publishedAt
      publishedAt.setCharAt(10, ' ');
      if (publishedAt.length()) {
        String times =publishedAt.substring(0, 19);
        printEfont(40,0,1,GREEN, BLACK,(char *)"Japan News API");
        printEfont(40,16,1,GREEN, BLACK,(char *)times.c_str());
      }
      String title = doc["articles"][count]["title"];
      if (title.length() < 110 ) t_size=2; else t_size=1;
      printEfont(1,36,t_size,YELLOW, BLACK,(char *)title.c_str());
      Serial.println(title.length());
      Serial.println(title);
      if (title.length() > 5 ) {waittime=10000;} else {waittime=10;}
      Rect(0,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1,YELLOW);//枠表示
      Rect(1,32,SCREEN_WIDTH-1,32,CYAN );
      count++;
      if (9 < count) {
        count = 0;
        break;
      } else {
        digitalWrite(LED, HIGH);
        delay(waittime);
      }
     }
     digitalWrite(LED, HIGH);
     delay(waittime);
    }
  }
}


以上


ブログトップへ

◆3.5インチLCD付ESP32ボード「ESP32-3248S035」で「efont」
 「Arduino_GFX_Library」を使ってニュース表示をしてみました。
 ESP32-3248S035

 ①ニュース表示については、下記ブログ内記事を参照して下さい。
 ・ESP32-1732S019 で efont を使いニュース表示をしてみた

 ②Arduino_GFX_Libraryについては、下記ブログ内記事を参照して下さい。
 ・ESP32 グラフィックライブラリを「TFT_eSPI」から「Arduino_GFX_Library」へ変更してみた

 ➂このボードを使った別のアプリについて下記ブログ内記事も参照してみて下さい。
 ・ESP32-3248S035 で 多機能インターネットラジオ を作ってみた

1.ESP32-3248S035ボードについて
 ①このボードの詳しい解説は、下記URLを参照してみて下さい。
 

2.開発環境 2024/07/05時点
  ①Windows11 X64 Pro 23H2 
  ②Arduino IDE 2.3.2
  ➂ESP32ボードバージョンV3.0.2
  ④Arduino_GFX_Library v1.4.7
  ⑤ボードの選択
 board_esp32devkit
  ⑥コンパイル時のAPPサイズ
   *efontの指定がminiでは「嘘八百」の嘘が表示されなかったので
   標準をインクルードすると、プログラムサイズがオーバーしたので
   「Partion Scheme」->Defaut から->No OTA(2MB APP)にして、
   使用率69%になりました。   
   ちなみに MiniでDefaut(1.2MB APP) では使用率94%。
 No_OTA(2MB APP_69%

3.スケッチ(保障無しの自己責任で) 

 ◆ソース中下記のSSIDとPWを自分用に書き換えます。
 31 #define STASSID "XXXXXXXXX"
 32 #define STAPSK "YYYYYYYYYY"
 ◆ソース中下記のサイトで自分専用のAPI keyを取得して書き換えます。
 39 // Japan News API
 40 // https://newsapi.org/s/japan-news-api
 41 // change XXXXXXXXXX to your API key
 42 const char* NewsAPIURL = "http://newsapi.org/v2/top-headlines?
                 country=jp&apiKey=XXXXXXXXXX";


//ESP32_3248S035_Efont_NewsAPI.ino
//V1 /2024/07/10 By JK1VCK <Arduino_GFX_Library.h>使用
//blog URL:https://gijin77.blog.jp/archives/41450724.html

#include <Arduino_GFX_Library.h>
#include <SPI.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <efontEnableJa.h> //Partion Scheme->No OTA(2MB APP...69%
//#include <efontEnableJaMini.h> //Partion Scheme->Defaut ..(1.2MB APP..94%
#include <efont.h>

//ESP32-3248S035
#define LED   4 //
#define LCD_MISO 12
#define LCD_MOSI 13
#define LCD_SCK  14
#define LCD_CS   15
#define LCD_DC    2
#define LCD_RST  -1
#define GFX_BL   27

Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC , LCD_CS , LCD_SCK, LCD_MOSI,LCD_MISO,HSPI /* spi_num */);
Arduino_GFX *gfx = new Arduino_ST7796(bus,LCD_RST, 1 /* rotation */);

#define SCREEN_WIDTH  gfx->width() //ESP32-3248S035 480x320
#define SCREEN_HEIGHT gfx->height()

#define STASSID "XXXXXXXXX"
#define STAPSK "YYYYYYYYYY"

const char *ssid = STASSID;
const char *pass = STAPSK;

WiFiMulti WiFiMulti;

// Japan News API
// https://newsapi.org/s/japan-news-api
// change XXXXXXXXXX to your API key
const char* NewsAPIURL = "http://newsapi.org/v2/top-headlines?country=jp&apiKey=XXXXXXXXXX;

uint8_t t_size = 1; //ニュース表示テキストサイズ
//**********************************************************************************************
//文字列を表示する
void disp(int16_t x,int16_t y,int16_t textsize,uint16_t color,String msg){
  gfx->setCursor(x, y);
  gfx->setTextSize(textsize);
  gfx->setTextColor(color);
  gfx->print(msg);
}
//**********************************************************************************************
//efont 文字列を表示する
void printEfont(int16_t x,int16_t y,int16_t txtsize,uint16_t color,uint16_t bgcolor,char *str) {
  int posX = x;
  int posY = y;
  int16_t textsize = txtsize;
  uint16_t textcolor = color;
  uint16_t textbgcolor = bgcolor;
  byte font[32];
  while( *str != 0x00 ){
    if( *str == '\n' ){     // 改行処理
      posY += 16 * textsize;
      posX += 16 * textsize;
      str++;
      continue;
    }
    uint16_t strUTF16;    // フォント取得
    str = efontUFT8toUTF16( &strUTF16, str );
    getefontData( font, strUTF16 );
    int width = 16 * textsize; // 文字横幅
    if( strUTF16 < 0x0100 ){
      width = 8 * textsize; // 半角
    }
    gfx->fillRect(posX, posY, width, 16 * textsize, textbgcolor); // 背景塗りつぶし
    for (uint8_t row = 0; row < 16; row++) {    // 取得フォントの確認
      word fontdata = font[row*2] * 256 + font[row*2+1];
      for (uint8_t col = 0; col < 16; col++) {
        if( (0x8000 >> col) & fontdata ){
          int drawX = posX + col * textsize;
          int drawY = posY + row * textsize;
          if( textsize == 1 ){
            gfx->drawPixel(drawX, drawY, textcolor);
          } else {
            gfx->fillRect(drawX, drawY, textsize, textsize, textcolor);
          }
        }
      }
    }
    posX += width; // 描画カーソルを進める
    if( (SCREEN_WIDTH-(8*textsize)) <= posX ){  // 折返し処理
      posX = 0;
      posY += 20 * textsize;
    }
  }
  gfx->setCursor(posX, posY);  // カーソルを更新
}
//**********************************************************************************************
//四角形を表示する
void Rect(int16_t x1,int16_t y1,int16_t x2,int16_t y2,uint16_t cl){
  gfx->drawFastVLine(x1,y1,y2-y1,cl);
  gfx->drawFastVLine(x2,y1,y2-y1,cl);
  gfx->drawFastHLine(x1,y1,x2-x1,cl);
  gfx->drawFastHLine(x1,y2,x2-x1,cl); 
}
//**********************************************************************************************
void setup() {
  pinMode(LED, OUTPUT); 
  digitalWrite(LED, HIGH); 
  Serial.begin(115200);
  delay(1000);
  for(int i=0;i<5;i++) {
    digitalWrite(LED, LOW);
    delay(200);
    digitalWrite(LED, HIGH);
    delay(200);
  }
  pinMode(GFX_BL, OUTPUT);
  digitalWrite(GFX_BL, HIGH); //バックライトON
  gfx->begin();
  gfx->setRotation(0);
  gfx->fillScreen(RED);delay(1000);
  gfx->fillScreen(GREEN);delay(1000);
  gfx->fillScreen(BLUE);delay(1000);
  gfx->setRotation(3);
  gfx->fillScreen(BLACK);
  Serial.println("3.5inch_ESP32-3248S035_NewsAPI Arduino_GFX_Library Start");  
  printEfont(1,16,2,CYAN , BLACK,(char *)"ニュース取得中");
  printEfont(1,64,2,CYAN , BLACK,(char *)"しばらくお待ち下さい");
  Rect(0,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1,YELLOW);//枠表示
  bool ret = WiFiMulti.addAP(ssid, pass);  // WiFi
  Serial.println(ret);
}

StaticJsonDocument<1024*30> doc;
//**********************************************************************************************
void loop() {
  char str[128];
  int waittime;
  Serial.println("loop");
  static int count = 0;
  if ((WiFiMulti.run() == WL_CONNECTED)) { // wait for WiFi connection
    HTTPClient http;
    String payload = "";
    Serial.print("[HTTP] begin...\n");
    if (http.begin(NewsAPIURL)) {  // HTTP
      Serial.print("[HTTP] GET...\n");
      int httpCode = http.GET();   // start connection and send HTTP header
      if (httpCode > 0) {          // httpCode will be negative on error
        // HTTP header has been send and Server response header has been handled
        Serial.printf("[HTTP] GET... code: %d\n", httpCode);
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { // file found at server
          payload = http.getString();
          Serial.println(payload);
        }
      } else {
        Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      }
      http.end();
    } else {
      Serial.printf("[HTTP} Unable to connect\n");
    }
    if (payload.length()) {
     while(1) {
      deserializeJson(doc, payload);
      digitalWrite(LED, LOW);
      gfx->fillScreen(BLACK);  //画面をクリア
      sprintf(str,"%d",count+1);
      printEfont(3,0,2,CYAN, BLACK,(char *)str);
      Serial.printf("No=%d News\n",count+1);
      String publishedAt = doc["articles"][0]["publishedAt"]; // publishedAt
      publishedAt.setCharAt(10, ' ');
      if (publishedAt.length()) {
        String times =publishedAt.substring(0, 19);
        printEfont(40,0,1,GREEN, BLACK,(char *)"Japan News API");
        printEfont(40,16,1,GREEN, BLACK,(char *)times.c_str());
      }
      String title = doc["articles"][count]["title"];
      if (title.length() < 300 ) t_size=2; else t_size=1;
      printEfont(1,36,t_size,YELLOW, BLACK,(char *)title.c_str());
      Serial.println(title.length());
      Serial.println(title);
      if (title.length() > 5 ) {waittime=10000;} else {waittime=10;}
      Rect(0,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1,YELLOW);//枠表示
      Rect(1,32,SCREEN_WIDTH-1,32,CYAN );
      count++;
      if (9 < count) {
        count = 0;
        break;
      } else {
        digitalWrite(LED, HIGH);
        delay(waittime);
      }
     }
     digitalWrite(LED, HIGH);
     delay(waittime);
    }
  }
}

以上

ブログトップへ

◆1.14インチLCD付ESP32ボード「TTGO-Display」で「efont」
 「Arduino_GFX_Library」を使ってニュース表示をしてみました。
 ttgo-1
 ttgo-2

 ①ニュース表示については、下記ブログ内記事も参照してみて下さい。
 ・ESP32-1732S019 で efont を使いニュース表示をしてみた
 ・JC2432W328 でニュース表示をしてみた

 ②Arduino_GFX_Libraryについては、下記ブログ内記事を参照して下さい。
 ・ESP32 グラフィックライブラリを「TFT_eSPI」から「Arduino_GFX_Library」へ変更してみた

1.TTGO-Displayボードについて
 ①TTGOのピン配置
 ttgo-pin
 
 ②回路図
 TTGO回路図

2.開発環境 2024/07/05時点
  ①Windows11 X64 Pro 23H2 
  ②Arduino IDE 2.3.2
  ➂ESP32ボードバージョンV3.0.2
  ④Arduino_GFX_Library v1.4.7
  ⑤ボードの選択
 ttgo-3

3.スケッチ(保障無しの自己責任で) 

 ◆ソース中下記のSSIDとPWを自分用に書き換えます。
 31 #define STASSID "XXXXXXXXX"
 32 #define STAPSK "YYYYYYYYYY"
 ◆ソース中下記のサイトで自分専用のAPI keyを取得して書き換えます。
 39 // Japan News API
 40 // https://newsapi.org/s/japan-news-api
 41 // change XXXXXXXXXX to your API key
 42 const char* NewsAPIURL = "http://newsapi.org/v2/top-headlines?
                 country=jp&apiKey=XXXXXXXXXX";

//TTGO_Efont_NewsAPI.ino
//V1 /2024/07/08 By JK1VCK <Arduino_GFX_Library.h>使用
//blog URL:https://gijin77.blog.jp/archives/41423654.html

#include <Arduino_GFX_Library.h>
#include <SPI.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <efontEnableJaMini.h>
#include <efont.h>

#define LED   17 //TTGO

#define LCD_MISO -1
#define LCD_MOSI 19
#define LCD_SCK  18
#define LCD_CS    5
#define LCD_DC   16
#define LCD_RST  23
#define GFX_BL    4

Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC , LCD_CS , LCD_SCK, LCD_MOSI,LCD_MISO);
// 1.14" IPS LCD 135x240
Arduino_GFX *gfx = new Arduino_ST7789(bus, LCD_RST, 0 /* rotation */, true /* IPS */, 135 /* width */, 240 /* height */, 52 /* col offset 1 */, 40 /* row offset 1 */, 53 /* col offset 2 */, 40 /* row offset 2 */);

#define SCREEN_WIDTH  240 //TTGO
#define SCREEN_HEIGHT 135 //TTGO

#define STASSID "XXXXXXXXX"
#define STAPSK "YYYYYYYYYY"

const char *ssid = STASSID;
const char *pass = STAPSK;

WiFiMulti WiFiMulti;

// Japan News API
// https://newsapi.org/s/japan-news-api
// change XXXXXXXXXX to your API key
const char* NewsAPIURL = "http://newsapi.org/v2/top-headlines?country=jp&apiKey=XXXXXXXXXX";

uint8_t t_size = 1; //ニュース表示テキストサイズ
//**********************************************************************************************
//文字列を表示する
void disp(int16_t x,int16_t y,int16_t textsize,uint16_t color,String msg){
  gfx->setCursor(x, y);
  gfx->setTextSize(textsize);
  gfx->setTextColor(color);
  gfx->print(msg);
}
//**********************************************************************************************
//efont 文字列を表示する
void printEfont(int16_t x,int16_t y,int16_t txtsize,uint16_t color,uint16_t bgcolor,char *str) {
  int posX = x;
  int posY = y;
  int16_t textsize = txtsize;
  uint16_t textcolor = color;
  uint16_t textbgcolor = bgcolor;
  byte font[32];
  while( *str != 0x00 ){
    if( *str == '\n' ){     // 改行処理
      posY += 16 * textsize;
      posX += 16 * textsize;
      str++;
      continue;
    }
    uint16_t strUTF16;    // フォント取得
    str = efontUFT8toUTF16( &strUTF16, str );
    getefontData( font, strUTF16 );
    int width = 16 * textsize; // 文字横幅
    if( strUTF16 < 0x0100 ){
      width = 8 * textsize; // 半角
    }
    gfx->fillRect(posX, posY, width, 16 * textsize, textbgcolor); // 背景塗りつぶし
    for (uint8_t row = 0; row < 16; row++) {    // 取得フォントの確認
      word fontdata = font[row*2] * 256 + font[row*2+1];
      for (uint8_t col = 0; col < 16; col++) {
        if( (0x8000 >> col) & fontdata ){
          int drawX = posX + col * textsize;
          int drawY = posY + row * textsize;
          if( textsize == 1 ){
            gfx->drawPixel(drawX, drawY, textcolor);
          } else {
            gfx->fillRect(drawX, drawY, textsize, textsize, textcolor);
          }
        }
      }
    }
    posX += width; // 描画カーソルを進める
    if( (SCREEN_WIDTH-(8*textsize)) <= posX ){  // 折返し処理
      posX = 0;
      posY += 20 * textsize;
    }
  }
  gfx->setCursor(posX, posY);  // カーソルを更新
}
//**********************************************************************************************
//四角形を表示する
void Rect(int16_t x1,int16_t y1,int16_t x2,int16_t y2,uint16_t cl){
  gfx->drawFastVLine(x1,y1,y2-y1,cl);
  gfx->drawFastVLine(x2,y1,y2-y1,cl);
  gfx->drawFastHLine(x1,y1,x2-x1,cl);
  gfx->drawFastHLine(x1,y2,x2-x1,cl); 
}
//**********************************************************************************************
void setup() {
  pinMode(LED, OUTPUT); 
  digitalWrite(LED, HIGH); 
  Serial.begin(115200);
  delay(1000);
  for(int i=0;i<5;i++) {
    digitalWrite(LED, LOW);
    delay(200);
    digitalWrite(LED, HIGH);
    delay(200);
  }
  pinMode(GFX_BL, OUTPUT);
  digitalWrite(GFX_BL, HIGH); //バックライトON
  gfx->begin();
  gfx->setRotation(0);
  gfx->fillScreen(RED);delay(1000);
  gfx->fillScreen(GREEN);delay(1000);
  gfx->fillScreen(BLUE);delay(1000);
  gfx->setRotation(3);
  gfx->fillScreen(BLACK);
  Serial.println("1.14inch_TTGO_NewsAPI Arduino_GFX_Library Start");  
  printEfont(1,16,2,CYAN , BLACK,(char *)"ニュース取得中");
  printEfont(1,64,2,CYAN , BLACK,(char *)"しばらく       お待ち下さい");
  Rect(0,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1,YELLOW);//枠表示
  bool ret = WiFiMulti.addAP(ssid, pass);  // WiFi
  Serial.println(ret);
}

StaticJsonDocument<1024*30> doc;
//**********************************************************************************************
void loop() {
  char str[128];
  int waittime;
  Serial.println("loop");
  static int count = 0;
  if ((WiFiMulti.run() == WL_CONNECTED)) { // wait for WiFi connection
    HTTPClient http;
    String payload = "";
    Serial.print("[HTTP] begin...\n");
    if (http.begin(NewsAPIURL)) {  // HTTP
      Serial.print("[HTTP] GET...\n");
      int httpCode = http.GET();   // start connection and send HTTP header
      if (httpCode > 0) {          // httpCode will be negative on error
        // HTTP header has been send and Server response header has been handled
        Serial.printf("[HTTP] GET... code: %d\n", httpCode);
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { // file found at server
          payload = http.getString();
          Serial.println(payload);
        }
      } else {
        Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      }
      http.end();
    } else {
      Serial.printf("[HTTP} Unable to connect\n");
    }
    if (payload.length()) {
     while(1) {
      deserializeJson(doc, payload);
      digitalWrite(LED, LOW);
      gfx->fillScreen(BLACK);  //画面をクリア
      sprintf(str,"%d",count+1);
      printEfont(3,0,2,CYAN, BLACK,(char *)str);
      Serial.printf("No=%d News\n",count+1);
      String publishedAt = doc["articles"][0]["publishedAt"]; // publishedAt
      publishedAt.setCharAt(10, ' ');
      if (publishedAt.length()) {
        String times =publishedAt.substring(0, 19);
        printEfont(40,0,1,GREEN, BLACK,(char *)"Japan News API");
        printEfont(40,16,1,GREEN, BLACK,(char *)times.c_str());
      }
      String title = doc["articles"][count]["title"];
      // if (title.length() < 140 ) t_size=2; else t_size=1;
      printEfont(1,36,t_size,YELLOW, BLACK,(char *)title.c_str());
      Serial.println(title.length());
      Serial.println(title);
      if (title.length() > 5 ) {waittime=10000;} else {waittime=10;}
      Rect(0,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1,YELLOW);//枠表示
      Rect(1,32,SCREEN_WIDTH-1,32,CYAN );
      count++;
      if (9 < count) {
        count = 0;
        break;
      } else {
        digitalWrite(LED, HIGH);
        delay(waittime);
      }
     }
     digitalWrite(LED, HIGH);
     delay(waittime);
    }
  }
}



以上


ブログトップへ

◆2.8インチLCD付ESP32ボード「JC2432W328」で「efont」
 「Arduino_GFX_Library」を使ってニュース表示をしてみました。

 *2倍角表示
 JC2432W328_1
 *1倍角表示(文字数の多いニュース) 
 JC2432W328_2

 ①今回、グラフィックライブラリを「TFT_eSPI」から「Arduino_GFX_Library」へ
 変更しました。詳しくは、下記ブログ内記事を参照して下さい。
 ・ESP32 グラフィックライブラリを「TFT_eSPI」から「Arduino_GFX_Library」へ変更してみた

 ②ニュース表示については、下記ブログ内記事も参照してみて下さい。
 ・ESP32-1732S019 で efont を使いニュース表示をしてみた

 ➂資料ダウンロードサイト
  ・HMIdisplay(JC2432W328他)
  ・ESP32module(2.4inch_ESP32-2432S024他)
  ・上記を含め参考となりそうな資料

 ④「JC2432W328」入手サイト
 WifiとBluetoothを備えたGuition-ESP32のLCDディスプレイモジュール,
 4Mのフラッシュ,2.8インチ,240x320 Capacitive touch


1.ボードについて
 ①上記「JC2432W328」の資料をみても回路図が付属していませんでした。
 色々調べてみましたら、「2.4inch_ESP32-2432S024」がLCDのサイズは違いますが
 IOポートやバッテリー関連が似ていますので参考になりました。
 下記は、「JC2432W328」GPIOの割当表を資料を参考に作成したものです。
 間違いがあるかも知れませんので参考までに。
 後、バッテリー駆動時にSW1での操作は、シングルクリックで電源ON、
 ダブルクリックで電源OFFとなります。
 JC2432W328_GPIO割当表

 ②参考回路図(2.4inch_ESP32-2432S024)
  2432S024-2-V1.0.png
  ESP32-2432S024-1-V1.0.png


 ➂表面写真
 JC2432W328_3

 ④裏面写真
 JC2432W328_4

2.開発環境 2024/07/05時点
  ①Windows11 X64 Pro 23H2 
  ②Arduino IDE 2.3.2
  ➂ESP32ボードバージョンV3.0.2
  ④Arduino_GFX_Library v1.4.7
  ⑤ボードの選択
 board_JC2432W328

 ⑥コンパイル時のAPPサイズ
   *efontの指定がminiでは「嘘八百」の嘘が表示されなかったので
   標準をインクルードすると、プログラムサイズがオーバーしたので
   「Partion Scheme」->Defaut から->No OTA(2MB APP)にして、
   使用率69%になりました。   
   ちなみに MiniでDefaut(1.2MB APP) では使用率94%
 No_OTA(2MB APP_69%

3.スケッチ(保障無しの自己責任で) 

 ◆ソース中下記のSSIDとPWを自分用に書き換えます。
 31 #define STASSID "XXXXXXXXX"
 32 #define STAPSK "YYYYYYYYYY"
 ◆ソース中下記のサイトで自分専用のAPI keyを取得して書き換えます。
 39 // Japan News API
 40 // https://newsapi.org/s/japan-news-api
 41 // change XXXXXXXXXX to your API key
 42 const char* NewsAPIURL = "http://newsapi.org/v2/top-headlines?
                 country=jp&apiKey=XXXXXXXXXX";

//JC2432W328_Efont_NewsAPI.ino
//V1 /2024/07/11 By JK1VCK <Arduino_GFX_Library.h>使用
//blog URL:https://gijin77.blog.jp/archives/41390669.html

#include <Arduino_GFX_Library.h>
#include <SPI.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <efontEnableJa.h> //Partion Scheme->No OTA(2MB APP...69%
//#include <efontEnableJaMini.h> //Partion Scheme->Defaut ..(1.2MB APP..94%
#include <efont.h>

//JC2432W328
#define LED   4 
#define LCD_MISO 12
#define LCD_MOSI 13
#define LCD_SCK  14
#define LCD_CS   15
#define LCD_DC    2
#define LCD_RST  -1
#define GFX_BL   27

Arduino_DataBus *bus = new Arduino_ESP32SPI(LCD_DC , LCD_CS , LCD_SCK, LCD_MOSI,LCD_MISO);
Arduino_GFX *gfx = new Arduino_ST7789(bus,LCD_RST, 1 /* rotation */);

#define SCREEN_WIDTH  gfx->width() //JC2432W328 320x240
#define SCREEN_HEIGHT gfx->height()

#define STASSID "XXXXXXXX"
#define STAPSK "YYYYYYYYYY"

const char *ssid = STASSID;
const char *pass = STAPSK;

WiFiMulti WiFiMulti;

// Japan News API
// https://newsapi.org/s/japan-news-api
// change XXXXXXXXXX to your API key
const char* NewsAPIURL = "http://newsapi.org/v2/top-headlines?country=jp&apiKey=XXXXXXXXXX";

uint8_t t_size = 1; //ニュース表示テキストサイズ
//**********************************************************************************************
//文字列を表示する
void disp(int16_t x,int16_t y,int16_t textsize,uint16_t color,String msg){
  gfx->setCursor(x, y);
  gfx->setTextSize(textsize);
  gfx->setTextColor(color);
  gfx->print(msg);
}
//**********************************************************************************************
//efont 文字列を表示する
void printEfont(int16_t x,int16_t y,int16_t txtsize,uint16_t color,uint16_t bgcolor,char *str) {
  int posX = x;
  int posY = y;
  int16_t textsize = txtsize;
  uint16_t textcolor = color;
  uint16_t textbgcolor = bgcolor;
  byte font[32];
  while( *str != 0x00 ){
    if( *str == '\n' ){     // 改行処理
      posY += 16 * textsize;
      posX += 16 * textsize;
      str++;
      continue;
    }
    uint16_t strUTF16;    // フォント取得
    str = efontUFT8toUTF16( &strUTF16, str );
    getefontData( font, strUTF16 );
    int width = 16 * textsize; // 文字横幅
    if( strUTF16 < 0x0100 ){
      width = 8 * textsize; // 半角
    }
    gfx->fillRect(posX, posY, width, 16 * textsize, textbgcolor); // 背景塗りつぶし
    for (uint8_t row = 0; row < 16; row++) {    // 取得フォントの確認
      word fontdata = font[row*2] * 256 + font[row*2+1];
      for (uint8_t col = 0; col < 16; col++) {
        if( (0x8000 >> col) & fontdata ){
          int drawX = posX + col * textsize;
          int drawY = posY + row * textsize;
          if( textsize == 1 ){
            gfx->drawPixel(drawX, drawY, textcolor);
          } else {
            gfx->fillRect(drawX, drawY, textsize, textsize, textcolor);
          }
        }
      }
    }
    posX += width; // 描画カーソルを進める
    if( (SCREEN_WIDTH-(8*textsize)) <= posX ){  // 折返し処理
      posX = 0;
      posY += 20 * textsize;
    }
  }
  gfx->setCursor(posX, posY);  // カーソルを更新
}
//**********************************************************************************************
//四角形を表示する
void Rect(int16_t x1,int16_t y1,int16_t x2,int16_t y2,uint16_t cl){
  gfx->drawFastVLine(x1,y1,y2-y1,cl);
  gfx->drawFastVLine(x2,y1,y2-y1,cl);
  gfx->drawFastHLine(x1,y1,x2-x1,cl);
  gfx->drawFastHLine(x1,y2,x2-x1,cl); 
}
//**********************************************************************************************
void setup() {
  pinMode(LED, OUTPUT); 
  digitalWrite(LED, HIGH); 
  Serial.begin(115200);
  delay(1000);
  for(int i=0;i<5;i++) {
    digitalWrite(LED, LOW);
    delay(200);
    digitalWrite(LED, HIGH);
    delay(200);
  }
  pinMode(GFX_BL, OUTPUT);
  digitalWrite(GFX_BL, HIGH); //バックライトON
  gfx->begin();
  gfx->setRotation(0);
  gfx->fillScreen(RED);delay(1000);
  gfx->fillScreen(GREEN);delay(1000);
  gfx->fillScreen(BLUE);delay(1000);
  gfx->setRotation(3);
  gfx->fillScreen(BLACK);
  Serial.println("2.8inch_JC2432W328_NewsAPI Arduino_GFX_Library Start");  
  printEfont(1,16,2,CYAN , BLACK,(char *)"ニュース取得中");
  printEfont(1,64,2,CYAN , BLACK,(char *)"しばらくお待ち下さい");
  Rect(0,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1,YELLOW);//枠表示
  bool ret = WiFiMulti.addAP(ssid, pass);  // WiFi
  Serial.println(ret);
}

StaticJsonDocument<1024*30> doc;
//**********************************************************************************************
void loop() {
  char str[128];
  int waittime;
  Serial.println("loop");
  static int count = 0;
  if ((WiFiMulti.run() == WL_CONNECTED)) { // wait for WiFi connection
    HTTPClient http;
    String payload = "";
    Serial.print("[HTTP] begin...\n");
    if (http.begin(NewsAPIURL)) {  // HTTP
      Serial.print("[HTTP] GET...\n");
      int httpCode = http.GET();   // start connection and send HTTP header
      if (httpCode > 0) {          // httpCode will be negative on error
        // HTTP header has been send and Server response header has been handled
        Serial.printf("[HTTP] GET... code: %d\n", httpCode);
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { // file found at server
          payload = http.getString();
          Serial.println(payload);
        }
      } else {
        Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      }
      http.end();
    } else {
      Serial.printf("[HTTP} Unable to connect\n");
    }
    if (payload.length()) {
     while(1) {
      deserializeJson(doc, payload);
      digitalWrite(LED, LOW);
      gfx->fillScreen(BLACK);  //画面をクリア
      sprintf(str,"%d",count+1);
      printEfont(3,0,2,CYAN, BLACK,(char *)str);
      Serial.printf("No=%d News\n",count+1);
      String publishedAt = doc["articles"][0]["publishedAt"]; // publishedAt
      publishedAt.setCharAt(10, ' ');
      if (publishedAt.length()) {
        String times =publishedAt.substring(0, 19);
        printEfont(40,0,1,GREEN, BLACK,(char *)"Japan News API");
        printEfont(40,16,1,GREEN, BLACK,(char *)times.c_str());
      }
      String title = doc["articles"][count]["title"];
      if (title.length() < 160 ) t_size=2; else t_size=1;
      printEfont(1,36,t_size,YELLOW, BLACK,(char *)title.c_str());
      Serial.println(title.length());
      Serial.println(title);
      if (title.length() > 5 ) {waittime=10000;} else {waittime=10;}
      Rect(0,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1,YELLOW);//枠表示
      Rect(1,32,SCREEN_WIDTH-1,32,CYAN );
      count++;
      if (9 < count) {
        count = 0;
        break;
      } else {
        digitalWrite(LED, HIGH);
        delay(waittime);
      }
     }
     digitalWrite(LED, HIGH);
     delay(waittime);
    }
  }
}


以上


ブログトップへ

◆Seeed Studio XIAO ESP32C6 / ESP32S3を入手したので「Lチカ」してみました。
 xaioesp32c6s3
 ①秋月電子で入手
 XAIO_esp32c6s3
◆Seeed Studio XIAO ESP32C6 / ESP32S3 について
 XIAO-ESP32C6-S3仕様

1.Seeed Studio XIAO ESP32C6
 1.ドキュメント
  ①Seeed Studio XIAO ESP32C6 を使い始める

 2.開発環境 2024/07/01時点
  ①Windows11 X64 Pro 23H2 
  ②Arduino IDE 2.3.2
  ➂ESP32ボードバージョンV3.0.2
 *ESP32C6は、新しいチップなので最新のバージョンにします。
 ide_bord_esp32

 3.ESP32C6ピン番号
 XIAO_ESP32C6ピン番号

 4.ESP32C6回路図
  ①Seeed Studio XIAO ESP32C6回路図

 5.ボード設定
 ①ESP32C6 Devkitを選んだ場合 (#define LED_BUILTIN 15 記載必要)
 bord_esp32c6
 ② XIAO ESP32C6を選んだ場合(#define LED_BUILTIN 15 記載必要なし)
  *後からボードマネージャーに登録されていることを発見
  *XIAO ESP32S3も同様
 bord_xiao_esp32c6

 6.ポート設定
 ①買ってきたばかりのESP32C6をPCに繋いだら下記エラーが発生しました。
 esp32c6デバイスマネージャー
 ②前もってドキュメントを読んでいたので慌てずに、「BOOT」釦を
  押しながら、USBに接続しましたらちゃんと「COM8」が認識されました。
 esp32c6_COM8デバイスマネージャー
 ➂IDEでもちゃんと「COM8」を選択出来ました。
 com8_esp32c6

 7.Lチカ
  ①下記ユーザーLEDを追記してコンパイル書き込みします。
   #define LED_BUILTIN 15
  
②ボードマネージャーで XIAO ESP32C6を選んだ場合追記必要なしです。
 esp32c6_Lチカ


2.Seeed Studio XIAO ESP32S3
 1.ドキュメント
  ①Seeed Studio XIAO ESP32S3 (Sense) を使い始める

 2.開発環境 2024/07/01時点
  ①Windows11 X64 Pro 23H2 
  ②Arduino IDE 2.3.2
  ➂ESP32ボードバージョンV3.0.2

 3.ESP32S3ピン番号
 XIAO_ESP32S3ピン番号1
 XIAO_ESP32S3ピン番号2

 4.ESP32S3回路図
  ①Seeed Studio XIAO ESP32S3回路図

 5.ボード設定
 bord_esp32s3

 6.ポート設定
 ①こちらは、そのままで認識しました。
 esp32s3デバイスマネージャー
 ②IDEでも「COM11」を選択できました。
 com11_esp32s3

 7.Lチカ
  ①下記ユーザーLEDを追記してコンパイル書き込みします。
   #define LED_BUILTIN 21
 esp32s3_Lチカ


以上


ブログトップへ



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

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