ATOMS3 LITEでI2C OLEDディスプレイ ~ 基板で配置してみる
以前、ATOM LITEでI2C接続の0.96インチOLEDディスプレイを使ってみましたが、今回はATOMS3 LITEを使ってみます。
また、今回はジャンパーケーブルやブレッドボードを使わずに、ユニバーサル基板を使います。これは、毎回動作後に分解してしまうのはもったいないと思ったからです。今後は格安のユニバーサル基板を使い、ピンヘッダやピンソケットを配置して、マイコンやセンサーを使い回しできるようにしたいと考えています。
1.基板の作成
必要な部品を用意します。ATOMS3 LITEは当然として、格安のユニバーサル基板、0.96インチOLED、ピンヘッダ、適当な電線を用意します。
部品をユニバーサル基板に配置します。ピンヘッダは、ATOMS3 LITEのソケットに合わせて配置します。これにより、使う時だけATOMS3 LITEを差し込んで使う形になります。OLEDディスプレイはどうしようかと思いましたが、ちょっと調子の悪い個体なので直にハンダ付けしました。
OLEDとATOMS3 LITEの接続
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で受信しています。
こんな風に、切り替えて表示できるようにしました。みなさんも、やってみてください。⇒速度と高度を表示するサンプルプログラムを、以下の記事で公開しました。
※タクトスイッチは、別の用途で使用します。