目次イントロダクション
前回、「いいね!」っぽいボタンの外箱の作り方を解説したので、今回は回路とスケッチです。回路はものすごく簡単でボタンとキャラクタLCDだけ繋いでいます。キャラクタLCDの配線は少し多いけど、1本1本確実に配線していけば間違わないよ。
ブレッドボードの図と回路図は Fritzing を使って描いています。
Fritzing
http://fritzing.org/回路

2番 → RS
3番 → Enable
4番 → D4
5番 → D5
6番 → D6
7番 → D7
8番 → ボタン
9番 → バックライトLEDアノード
回路図
スケッチ
このスケッチでは、キャラクタLCDに大きな文字を書くためにBigFontライブラリ、ボタンのチャタリング処理にBounceライブラリを使用しています。それぞれのライブラリを次のURLからダウンロードし、Arduinoのライブラリフォルダにコピーしてください。ライブラリをコピーしたらArduinoソフトウェアを再起動してください。
BigFont ライブラリ
http://code.google.com/p/arms22/downloads/detail?name=BigFont.zipArduino Playground - Bounce
http://www.arduino.cc/playground/Code/Bounceスケッチは少し長いけど行っている処理は単純です。ボタンが押されたらカウンタ変数の値を1つ増やしEEPROMのアドレス0番に値を保存します。その後、値をキャラクタLCDに1.5秒間表示します。この間、次のボタン入力は受け付けません。ボタンの連打対策です。カウンタ変数の値が1971・3470の時、"Congratulations!"と表示します。
ボタンを10秒間長押しするとカウントダウンが始まり、5秒立つとカウンタ変数の値をリセットし、EEPROMの0番に0を書き込みます。
#include <LiquidCrystal.h>
#include <BigFont.h>
#include <Bounce.h>
#include <EEPROM.h>
// ピン定義
const int goodPin = 8;
const int backLightPin = 9;
// EEPROMアドレス定義
const int goodCountAdr = 0;
// LCDライブラリ(rs=2, enable=3, d4=4, d5=5, d6=6, d7=7)
LiquidCrystal lcd(2,3,4,5,6,7);
// ビッグフォントライブラリ
BigFont bigf;
// いいねボタン
Bounce good = Bounce(goodPin, 20);
// いいねカウント
unsigned int goodCount;
// サンキュウ表示時間
unsigned long displayTime;
void setup()
{
// ピン入出力設定
pinMode(goodPin, INPUT);
digitalWrite(goodPin, HIGH);
pinMode(backLightPin, OUTPUT);
digitalWrite(backLightPin, HIGH);
good.write(HIGH);
// キャラクタLCDを初期化
lcd.begin(16, 2);
// キャラクタLCDをビッグフォントクラスにアタッチ
bigf.attach(&lcd);
// いいねカウントをEEPROMから読み出す
goodCount = readInt( goodCountAdr );
// カウント表示
printNumber(goodCount);
// 表示時間
displayTime = 0;
}
void loop()
{
// いいねボタン状態更新
if( good.update() ){
// オフからオン
if( good.risingEdge() ){
// いいねカウントアップしてEEPROMに書き込む
writeInt( goodCountAdr, ++goodCount );
// カウンタの値チェック
if((goodCount == 1971) ||(goodCount == 3470)){
int i;
for(i=0; i<2; i++){
printMessage(
"Congratulations!",
" you win! ");
delayWithButton(1000);
lcd.clear();
delayWithButton(500);
}
printMessage(
"Congratulations!",
" you win! ");
delayWithButton(5000);
}
else{
// Thank youを表示
printMessage(
" Thank you! ",
" :D ");
}
// 1.5秒後にいいねカウント表示要求
delayWithButton(1500);
// カウント値を表示
printNumber(goodCount);
//displayTime = millis();
}
}
else{
if( (good.read() == LOW) && (good.duration() > 10000) ){
// リセット通知
printMessage(
" good count ",
"will be reset :(");
// 数秒まつ
delayWithButton(5000);
// カウントダウン
for(int i=5; i>0; i--){
printNumber(i);
delayWithButton(1000);
}
// いいねカウントクリア
goodCount = 0;
// 0書き込み
writeInt( goodCountAdr, 0 );
// リセット完了
printMessage(
" good count ",
" reset! ");
// 数秒まつ
delayWithButton(3000);
// カウント値を表示
printNumber(0);
}
}
if(displayTime){
if((millis() - displayTime) > 1500){
printNumber(goodCount);
displayTime = 0;
}
}
}
// ディレイ with good.update
void delayWithButton(unsigned long ms)
{
unsigned long start = millis();
do {
if((millis() - start) > ms){
break;
}
good.update();
}
while(1);
}
// メッセージを表示
void printMessage(const char *msg1, const char *msg2)
{
lcd.clear();
lcd.print(msg1);
lcd.setCursor(0, 1);
lcd.print(msg2);
}
// 数字を右詰めで表示
void printNumber(int number)
{
bigf.clear();
if(number >= 1000){
bigf.setCursor(0, 0);
}
else if(number >= 100){
bigf.setCursor(4, 0);
}
else if(number >= 10){
bigf.setCursor(8, 0);
}
else{
bigf.setCursor(12, 0);
}
bigf.print(number);
}
// EEPROMからintを読む込む
unsigned int readInt(int adr)
{
return (EEPROM.read(adr+1) << 8) | (EEPROM.read(adr+0));
}
// EEPROMにintを書き込む
void writeInt(int adr, unsigned int dat)
{
EEPROM.write(adr+0, (dat ) & 0xff);
EEPROM.write(adr+1, (dat >> 8) & 0xff);
}
中村 文隆
CQ出版
売り上げランキング: 75421
サンハヤト株式会社 Arduino愛好会 河連 庸子 山崎 文徳 神原 健
リックテレコム
売り上げランキング: 92670
高橋 隆雄
秀和システム
売り上げランキング: 71354