ATOMS3 LITEでI2C OLEDディスプレイ ~ 基板で配置してみる

2024年5月21日

以前、ATOM LITEでI2C接続の0.96インチOLEDディスプレイを使ってみましたが、今回はATOMS3 LITEを使ってみます。

また、今回はジャンパーケーブルやブレッドボードを使わずに、ユニバーサル基板を使います。これは、毎回動作後に分解してしまうのはもったいないと思ったからです。今後は格安のユニバーサル基板を使い、ピンヘッダやピンソケットを配置して、マイコンやセンサーを使い回しできるようにしたいと考えています。

1.基板の作成

必要な部品を用意します。ATOMS3 LITEは当然として、格安のユニバーサル基板、0.96インチOLED、ピンヘッダ、適当な電線を用意します。

部品をユニバーサル基板に配置します。ピンヘッダは、ATOMS3 LITEのソケットに合わせて配置します。これにより、使う時だけATOMS3 LITEを差し込んで使う形になります。OLEDディスプレイはどうしようかと思いましたが、ちょっと調子の悪い個体なので直にハンダ付けしました。

OLEDとATOMS3 LITEの接続

ひどいハンダ付けなので、モザイク入れましたw とにかく見えないのです

0.96インチOLEDディスプレイとATOMS3 LITEを電線で接続します。接続は以下の組み合わせです。

OLED / ATOMS3 LITE

GND / GND
VCC / 5V OUTPUT
SDA / GPIO38
SCL / GPIO39

I2Cインタフェイスを使うので、とても簡単です。

2.プログラム

使用するボードは「Espressif Systems」の方を使います。また、ライブラリに「Adafruit_GFX Library」「Adafruit_SSD1306」を使いますのでインストールしておいてください。

#include <M5AtomS3.h>
#include <FastLED.h>

#include <WiFi.h>
#include <time.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Wi-Fi環境
const char* ssid = "XXXXXXXXXXXXX";
const char* password = "XXXXXXXXXXXX";

WiFiClient client;

// 時計の設定
const char* ntpServer = "ntp.jst.mfeed.ad.jp"; // NTPサーバー
const long  gmtOffset_sec = 9 * 3600;          // 時差9時間
const int   daylightOffset_sec = 0;            // サマータイム設定なし

static String weekname[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} ;

void Wifi_connect() {
  WiFi.begin(ssid, password);

  while(WiFi.status() != WL_CONNECTED){
    Serial.print('.');
    delay(500);
  }
  Serial.println("\nWi-Fi connected");
  AtomS3.dis.drawpix(0x0000ff);
  AtomS3.update();

}

void setup() {
  // put your setup code here, to run once:

  AtomS3.begin(true); // LED Enable

  AtomS3.dis.setBrightness(100);

  Wire.end();
  Wire.begin(38,39); // SDA / SCL
  
  AtomS3.dis.drawpix(0x00ff00);
  AtomS3.update();

  // Wi-Fiの接続
  Wifi_connect() ;

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); 
  }

  delay(1000);

  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

  delay(1000);

}

void loop() {
  // put your main code here, to run repeatedly:
  char buff[128] ;

  time_t t;
  struct tm *tm;
  t = time(NULL);

  if (t != 0) {
    tm = localtime(&t);

  }

  delay(100); 

  int hours = tm->tm_hour ;
  int minutes = tm->tm_min ;
  int seconds = tm->tm_sec ;

  int year = tm->tm_year + 1900 ;
  int month = tm->tm_mon + 1 ;
  int day = tm->tm_mday ;

  display.clearDisplay();
  display.setTextSize(3);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,0);
  
  sprintf(buff, "%02d:%02d", hours, minutes);

  display.println(buff);

  display.setTextSize(2);
  display.setCursor(0,32);
  sprintf(buff, "%04d/%02d/%02d", year, month, day);
  display.println(buff);

  display.setCursor(0,48);
  display.println(weekname[tm->tm_wday].c_str());

  display.display();

  delay(10000);

}

今までに登場したロジックをATOMS3 LITE用に変更しただけで、特に目新しい部分はありません。エラー処理は簡略化したり省略していますので、適度追加してください。

3.車で設置してみる

スマホカメラによる撮影のため、年月日が消えてます。。

今回の装置は、車で使えないかと思っています。今回は時間を表示しましたが、速度や高度などの情報を表示してみようかと思案中です。⇒下記にその様子を載せました。

車で欲しい情報として、時間はとても大事だと思います。しかしながら、時間を確認するには視線を大きく移動させる必要があるので、なかなか見ることができません。そこで、ハンドルの前のダッシュボードで時間を表示すれば、容易に時間を確認できます。ただし、センターメーターだからこそできる技ですが。

4.今後は、基板を使った電子工作を中心にします

こんなのも作ってみた

基板の1枚当たりが安いので、これからは基板を多用したいと思います。しかしながら、安い基板なので、力が入ると銅板部分?が剥がれるなど、注意が必要です。もし、実用性を考えるのなら、しっかりとした定番の基板を使うと良いでしょう。

おまけ:ボタン切り替えで、いろいろな表示をしてみた

ATOMS3 LITEのボタンを押すごとに、表示を切り替えできるようにしてみました。

IPアドレスを表示する

ATOMS3 LITEのIPアドレスはWindowsなどのアプリケーションを使って取得していますが、それがなくても困らないようにIPアドレスを表示させるモードを用意しました。

速度を表示する

速度は、スマートフォンのアプリケーションからUDP送信を行い、ATOMS3 LITEで受信しています。

高度を表示する

高度も、スマートフォンのアプリケーションからUDP送信を行い、ATOMS3 LITEで受信しています。

こんな風に、切り替えて表示できるようにしました。みなさんも、やってみてください。

※タクトスイッチは、別の用途で使用します。