Arduinoで作る電卓 - 16x2 LCDと4x4キーパッドで四則演算
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino Uno(互換機可) | 1 |
| 16×2 キャラクターLCD(HD44780互換) | 1 |
| 4×4 マトリックスキーパッド | 1 |
| 9V電池(またはUSB給電) | 1 |
| ブレッドボード & ジャンパーワイヤー | 1式 |
プロジェクト概要
Arduino Uno、16×2 LCD、4×4キーパッドを用いて、四則演算(加減乗除)が可能なスタンドアロン電卓を作ります。LiquidCrystal ライブラリと Keypad ライブラリを使用することで、比較的簡単に実装できます。Arduinoプログラミングの基礎(変数、条件分岐、ループ、関数、ライブラリ利用)を学ぶのに最適なプロジェクトです。
必要な材料
- Arduino Uno(どのバージョンでも可)
- 16×2 LCDディスプレイ
- 4×4 キーパッド
- 9V電池
- ブレッドボードとジャンパーワイヤー
ピン接続
| Arduinoピン | 接続先 |
|---|---|
| D0 〜 D7 | キーパッド 1〜8番ピン(行/列) |
| D8 | LCD RS (ピン4) |
| D9 | LCD Enable (ピン6) |
| D10 | LCD D4 (ピン11) |
| D11 | LCD D5 (ピン12) |
| D12 | LCD D6 (ピン13) |
| D13 | LCD D7 (ピン14) |
| 5V | LCD VDD (ピン2), キーパッド共通 |
| GND | LCD VSS/VEE/RW (ピン1,3,5), キーパッド共通 |
注意: 一部のArduinoボードでは、ピン0(D0)とピン1(D1)に配線があるとスケッチアップロード時にエラーになることがあります。その場合はアップロード時にキーパッドを外してください。
コード解説
主な処理フロー:
setup():LCD初期化、起動メッセージ表示loop():キーパッド入力をポーリングし、DetectButtons()でキー判定- 数字キー:入力中の数値を桁上げして構築(
Number = Number*10 + digit) - 演算子キー(A:+, B:-, C:*, D:/):第一オペランド
Num1確定、演算子action記録、入力バッファクリア #キー:第二オペランドNum2確定、計算フラグresult=true*キー:全クリア(リセット)CalculateResult():演算子に応じて四則演算実行DisplayResult():LCDに式と結果を表示
完全なArduinoスケッチ
/* Arduino Keypad Calculator */
#include <LiquidCrystal.h>
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'7','8','9','D'},
{'4','5','6','C'},
{'1','2','3','B'},
{'*','0','#','A'}
};
byte rowPins[ROWS] = {0, 1, 2, 3};
byte colPins[COLS] = {4, 5, 6, 7};
Keypad kpd = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
long Num1, Num2, Number;
char key, action;
boolean result = false;
void setup() {
lcd.begin(16, 2);
lcd.print("DIY Calculator");
lcd.setCursor(0, 1);
lcd.print("-CircuitDigest");
delay(2000);
lcd.clear();
}
void loop() {
key = kpd.getKey();
if (key != NO_KEY) DetectButtons();
if (result == true) CalculateResult();
DisplayResult();
}
void DetectButtons() {
lcd.clear();
if (key == '*') { Number = Num1 = Num2 = 0; result = false; return; }
if (key >= '0' && key <= '9') {
if (Number == 0) Number = key - '0';
else Number = Number * 10 + (key - '0');
}
if (key == '#') { Num2 = Number; result = true; }
if (key == 'A' || key == 'B' || key == 'C' || key == 'D') {
Num1 = Number;
Number = 0;
if (key == 'A') action = '+';
if (key == 'B') action = '-';
if (key == 'C') action = '*';
if (key == 'D') action = '/';
delay(100);
}
}
void CalculateResult() {
if (action == '+') Number = Num1 + Num2;
if (action == '-') Number = Num1 - Num2;
if (action == '*') Number = Num1 * Num2;
if (action == '/') Number = (Num2 != 0) ? Num1 / Num2 : 0; // ゼロ除算ガード
}
void DisplayResult() {
lcd.setCursor(0, 0);
lcd.print(Num1);
lcd.print(action);
lcd.print(Num2);
if (result) { lcd.print(" ="); lcd.print(Number); }
lcd.setCursor(0, 1);
lcd.print(Number);
}
※元コードの冗長な if 連なりを簡潔化しています。動作は同等です。
回路図
学習ポイント
Keypadライブラリによるマトリックスキーパッドのスキャンとデバウンス処理LiquidCrystalライブラリによる4ビットモードLCD制御- 状態管理(入力中/演算子入力済み/計算実行)と変数の役割分担
- 文字入力から数値変換(
key - '0')と桁上げロジック - ゼロ除算等のエラーハンドリングの重要性
製造プロセス
- ローラーピン:エトルリア起源から現代の職人技へ
- 現代ボウリングピンの進化と職人技
- USB HID 攻撃の防止:Arduino Leonardo キーボードエクスプロイト実演
- Arduino UnoでAtmel AT89シリーズを簡単プログラミング──ステップバイステップガイド
- Bluetooth操作のArduinoスパイボットを自作する
- ArduinoでRC受信機のPPM信号をデコードする──ステップバイステップガイド
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- MIDIキーボードをArduino・LED・MuseScoreでスマートピアノチューターに変身
- Arduino Unoで25kHz 4ピンPWMファンを制御 – 製作・コード・テスト