ArduinoNanoでカウンター作ってみた!

ArduinoNanoでカウンター作ってみた!

はじめに

こんにちは!香月です。

電子工作について、勉強したことのアウトプットとして
ブログで上表発信しています!

勉強中なので、間違っていること等あります。
気づいた方は、公式ラインで教えていただけると幸いです。

今回は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の入力を使いディスプレイに数字の表示を行いました!
いかがだったでしょうか??
他にも解説してほしいモジュール等ありましたら、公式ライン等に連絡ください!

また、このブログでは他のマイコンの使い方なども紹介しているので、
ぜひ!そちらもご覧ください!

それでは、次回の記事でお会いしましょう。

Arduino_Nanoカテゴリの最新記事