なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

「いいね!」っぽいボタンの作り方(回路とスケッチ編)

Posted by arms22 on 2011年12月25日 2  0

目次


イントロダクション


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

Fritzing
http://fritzing.org/

回路


good_button_ブレッドボード
2番 → RS
3番 → Enable
4番 → D4
5番 → D5
6番 → D6
7番 → D7
8番 → ボタン
9番 → バックライトLEDアノード


回路図


good_button_回路図


スケッチ


このスケッチでは、キャラクタLCDに大きな文字を書くためにBigFontライブラリ、ボタンのチャタリング処理にBounceライブラリを使用しています。それぞれのライブラリを次のURLからダウンロードし、Arduinoのライブラリフォルダにコピーしてください。ライブラリをコピーしたらArduinoソフトウェアを再起動してください。

BigFont ライブラリ
http://code.google.com/p/arms22/downloads/detail?name=BigFont.zip

Arduino 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);
}







Arduinoスーパーナビゲーション しくみと応用テクニック
サンハヤト株式会社 Arduino愛好会 河連 庸子 山崎 文徳 神原 健
リックテレコム
売り上げランキング: 92670



Arduinoで電子工作をはじめよう!―たのしい電子工作
高橋 隆雄
秀和システム
売り上げランキング: 71354



Ads by Google

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。