はじめに
こんにちは!香月です。
電子工作について、勉強したことのアウトプットとして
ブログで上表発信しています!
勉強中なので、間違っていること等あります。
気づいた方は、公式ラインで教えていただけると幸いです。
今回はArduinoNanoとSSD1306ディスプレイを使用して、カウンターを作ってみました!
左のボタンを押すとマイナス1、真ん中のボタンを押すとプラス1、右のの端を押すとリセットになります!
それでは使うものの紹介です!
つかうもの
この記事で使っているものを紹介します。
*このリンクは、アフィリエイトリンクです。
こちらのリンクから購入されると、投稿主にインセンティブが発生します。
より良い記事のために、ぜひ購入する際は以下のリンクよりお願いします…
モジュールの解説
今回も前回同様にSSD1306ディスプレイを使用します!
このディスプレイはOLEDディスプレイとなっていて、暗いところでも視認性が良く、配線も少なく簡単に扱うことができます!
そして、なにより安価です!!
1つ600円ほどで販売されています!
これ1つで簡単にアウトプットすることができるようになります!
また、コードも簡単でライブラリをインストールしたらすぐに活用することができます!
回路
以下の画像を参考に回路を組んでみてください!
回路ができたら、プログラムを書いていきます!
ライブラリのインストール
今回はライブラリを2つインストールする必要があります。
以下の二つをインストールしてください。
*依存関係のものもすべてインストールしてください。
プログラム
以下のプログラムをArduinoStudioを使って書き込みます!
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // 解像度 128 x 64
#define SCREEN_HEIGHT 64 // 解像度 64
#define OLED_RESET -1 // 使用しないので -1を設定する
#define SCREEN_ADDRESS 0x3C // I2Cアドレスは 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define PIN_RESET 10 // カウンターリセット用ピン
#define PIN_INCREMENT 7 // カウンター増加用ピン
#define PIN_DECREMENT 3 // カウンター減少用ピン
int counter = 0; // カウンターの初期値
void setup() {
pinMode(PIN_RESET, INPUT); // リセットボタンピンをプルアップ入力に設定
pinMode(PIN_INCREMENT, INPUT); // 増加ボタンピンをプルアップ入力に設定
pinMode(PIN_DECREMENT, INPUT); // 減少ボタンピンをプルアップ入力に設定
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
for (;;);
}
display.clearDisplay(); // 何か表示されている場合に備えて表示クリア
updateDisplay(); // 初期カウンター値を表示
}
void loop() {
if (digitalRead(PIN_RESET) == HIGH) { // リセットボタンが押されたら
counter = 0;
updateDisplay();
delay(200); // デバウンス処理
}
if (digitalRead(PIN_INCREMENT) == HIGH) { // 増加ボタンが押されたら
counter++;
updateDisplay();
delay(200); // デバウンス処理
}
if (digitalRead(PIN_DECREMENT) == HIGH) { // 減少ボタンが押されたら
counter--;
updateDisplay();
delay(200); // デバウンス処理
}
}
void updateDisplay() {
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(SSD1306_WHITE);
display.setCursor(40, 20);
display.print(counter);
display.display();
}
プログラム解説
ライブラリのインクルード
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
これらのヘッダーファイルは、I2C通信、グラフィック表示、SSD1306 OLEDディスプレイのライブラリを含みます。
定義
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
#define PIN_RESET 10
#define PIN_INCREMENT 7
#define PIN_DECREMENT 3
int counter = 0;
SCREEN_WIDTH と SCREEN_HEIGHT はディスプレイの解像度を定義します。
OLED_RESET はリセットピンを使用しないため -1
としています。
SCREEN_ADDRESS はディスプレイのI2Cアドレスです。
PIN_RESET, PIN_INCREMENT, PIN_DECREMENT はそれぞれリセット、増加、減少ボタンの接続ピンです。
counter はカウンターの初期値です。
setup関数
void setup() {
pinMode(PIN_RESET, INPUT);
pinMode(PIN_INCREMENT, INPUT);
pinMode(PIN_DECREMENT, INPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
for (;;);
}
display.clearDisplay();
updateDisplay();
}
各ピンを入力モードに設定します。
display.begin でOLEDディスプレイを初期化します。
失敗した場合は無限ループに入ります。
display.clearDisplay でディスプレイをクリアし、updateDisplay 関数で初期カウンター値を表示します。
loop関数
void loop() {
if (digitalRead(PIN_RESET) == HIGH) {
counter = 0;
updateDisplay();
delay(200);
}
if (digitalRead(PIN_INCREMENT) == HIGH) {
counter++;
updateDisplay();
delay(200);
}
if (digitalRead(PIN_DECREMENT) == HIGH) {
counter--;
updateDisplay();
delay(200);
}
}
ボタンの状態を読み取って、対応するアクション(リセット、増加、減少)を行います。
ボタンが押されるとカウンターの値を更新し、updateDisplay でディスプレイに表示します。
delay(200) はデバウンス処理のため、ボタンが誤って連続して検出されるのを防ぎます。
updateDisplay関数
void updateDisplay() {
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(SSD1306_WHITE);
display.setCursor(40, 20);
display.print(counter);
display.display();
}
ディスプレイをクリアし、テキストサイズ、テキストカラーを設定します。
カーソル位置を設定し、カウンター値を表示します。
display.display() で更新を確定させます。
このプログラムを使うことで、OLEDディスプレイにカウンターを表示し、ボタンで操作する簡単なインターフェースが実現できます。
実行!
書き込みが完了したら実際にボタンを押してみます!!
増えました!!
長押しすると、、、
連続で増えます!
左側のボタンを長押しすると、、
連続で下がっていきます!
右のボタンを押すと、、
ゼロになりました!!
これで今回の内容は終わりです。
もし動かない場合は、以下を参照ください。
動かないとき
動かない場合は以下の項目を確認してみてください!
もし解決しない場合はお気軽に公式ラインに連絡ください!
回路の確認
ジャンパー線のつなぐ位置があっているか。
また、ジャンパー線の断線、ディスプレイが断線していないかを確認してください。
プログラム
プログラムがきちんと書き込みされているかを確認してください。
書き込みエラーが発生している場合は、エラーメッセージを参考に修正してください。
マイコンボードの設定やポートがあっているかを確認してください。
公式ラインに連絡
以上のことを確認しいても解決しない場合は、公式ラインに連絡ください。
自分も電子工作を勉強している身なので、すべてに対応できるわけではありません。
可能な範囲で対応させていただきます!
おわりに
今回はArduinoNanoの入力を使いディスプレイに数字の表示を行いました!
いかがだったでしょうか??
他にも解説してほしいモジュール等ありましたら、公式ライン等に連絡ください!
また、このブログでは他のマイコンの使い方なども紹介しているので、
ぜひ!そちらもご覧ください!
それでは、次回の記事でお会いしましょう。