イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです


このエントリーをはてなブックマークに追加

第1回 MINTIAとFRISKで作る、マルチIoTボタン(全3回)

(注意)電子工作を初めて1ヶ月弱の素人が試行錯誤しながら書いた記事になりますので、
間違いが含まれる可能性がありますが、温かい目で見守っていただけると幸いです。

最高のデザインとは、その存在を忘れるほど、日常に溶けこむものである。

偉そうな事を言ってみました。
こんにちは、加藤です。

最近暑い日が続きますが、いかがお過ごしでしょうか?

そんな暑さを吹き飛ばすべく、
最高にクールで
爽やかな
ハッカー(薄荷er)
のためのIoTデバイスの作り方を紹介したいと思います。

その名も、
「MINTIAとFRISKで作る、マルチIoTボタン」
です。

イメージは、こんな感じです。

1.png

違和感なく、日常に溶け込んでますねー!!!

なお、本記事はシリーズ3部構成となります。

  • 第1回 ESP-WROOM-02でIoTボタンのプロトタイプを作る

  • 第2回 プロトタイプをMINTIAのケースに格納する

  • 第3回 Intel EdisonでIoTボタン(MINTIA)からの処理を受ける

今回は第1回目の「ESP-WROOM-02でIoTボタンのプロトタイプを作る」をご説明いたします。

ESP-WROOM-02でIoTボタンのプロトタイプを作る

今回は、ESP-WROOM-02使いIoTボタンの作成を行ないます。
ESP-WROOM-02は、ワンコインで購入できるWi-Fiモジュールですが、
なんとarduinoと互換性あるため、arduinoのプログラムを動作させることが出来ます。

元ネタ、参考記事

今回の記事を書くにあたって、下記の記事は大変参考にさせていただきました。
ありがとうございます。

ESP-WROOM-02 で、モバイル物理スイッチを作る

→元ネタ

ESP-WROOM-02 の Arduino 環境で I2C 制御

→配線図が参考になります

完成予定図

下記のような構成を目標にします。
本記事では、ミンディアボタンのプロトタイプを作ります。

2.png

用意したもの

ESPr Developer(ピンソケット実装済)

  • スイッチサイエンスが出しているESP-WROOM-02の開発ボードです

  • ESP-WROOM-02を単体の場合、別途USB-シリアル変換や
    電圧を3.3Vに調整する配線が必要ですが、この開発ボードには
    それら全てが搭載されており、すぐに動作を試すことが出来ます。

  • 初心者や初めてESP-WROOM-02を使う人は迷わずコレを選びましょう

  • 秋葉原の、千石電商2Fで売っています
    http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4WED

I2C接続小型LCDモジュール(8x2行)ピッチ変換モジュール(完成品)

  • 小型のキャラクタ表示器です

タクトスイッチ(赤) (10個入)

  • 1個12円!

ミニブレッドボード BB-601(スケルトン)

ブレッドボード・ジャンパーワイヤ EIC-J-S

配線

下記のように配線します。

キャラクタ表示器
SCL → IO14
SDA →IO12
ボタンはIO13ピンに接続します。

3.png
4.png

arduino環境を用意

arduinoの環境用意と、設定は下記を参考に致しました。
ありがとうございます!

arduinoでプログラムを書き込む

arduinoのプログラムは、下記のようになります。 プログラムは、文字コード「shift_jis」で保存しないと、カタカナが文字化けするので注意して下さい。

I2C液晶の表示には下記のライブラリ(skI2CLCDlib)を利用させていただきました。 http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/LCD/I2CLCD.htm

#include <Arduino.h>
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <skI2CLCDlib.h>

//WiFiの接続情報
const char* ssid     = "WiFiのssidを指定";
const char* password = "WiFiのパスワードを指定";

//接続するサーバ
const char* host     = "サーバーのホスト名を指定";

//サーバー接続設定
WiFiClient client;
const int httpPort = 80;

//ボタン
const int btn = 13;
const int btn_short_time = 5;
const int btn_long_time = 40;

//LCDのアドレス、画面カラム数8文字
skI2CLCDlib LCD(0x3E,8) ;

//アクションリスト
char* actions[]={
  "ピザ トル  ",
  "ニワ ミズマキ",
  "シュッシャ   ",
  "タイシャ    "
};

//ボタンが押されている時間
int push_state_count = 0;

//表示中のアクション
int current_action   = 0;


void setup() {
  Serial.begin(115200);
  delay(10);

  //ボタン
  pinMode(btn, INPUT_PULLUP);

  //I2Cキャラクタ初期化
  LCD.Init(LCD_NOT_ICON,32,LCD_VDD3V) ;
  LCD.Init(0,32,1);
  LCD.PageSet(0);

  //Serial.print("Connecting to ");
  //Serial.println(ssid);

  LCD.SetCursor(0,0);
  LCD.Puts("Conn..");

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  LCD.Puts("OK!");
  Serial.println(WiFi.localIP());

  delay(200);

  //1番目のアクションを表示
  LCD.SetCursor(0,0);
  LCD.Puts(actions[current_action]);
}


void loop() {
  delay(50);
  int state = digitalRead(btn);
  int pushing_display = -1;


  //カウントアップ
  if(!state){
    push_state_count++;

    //2行目に、「...」を表示させる。
    if(push_state_count<=btn_long_time  ){
      if(pushing_display != (int)floor(8 * push_state_count / btn_long_time)){
        pushing_display = (int)floor(8 * push_state_count / btn_long_time);
        LCD.SetCursor(pushing_display, 1);
        LCD.Puts(".");
      }
    }
  }
  else{
    if(push_state_count>0){
      if(push_state_count < btn_short_time){

        //実行するアクション切り替え
        current_action++;
        current_action = current_action % sizeof(current_action);
        LCD.SetCursor(0,0);

        //現在のアクションをキャラクタ表示
        LCD.Puts(actions[current_action]);
      }
      else if(push_state_count>btn_long_time){
        //実行
        if (!client.connect(host, httpPort)) {
          Serial.println("connection failed");
          return;
        }

        String url = "?action=" + String(current_action);
        client.print(String("GET ") + url + " HTTP/1.1¥r¥n" +
                     "Host: " + host + "¥r¥n" +
                     "Connection: close¥r¥n¥r¥n");

        delay(100);

        //2行目を初期化
        LCD.SetCursor(0, 1);
        LCD.Puts("ジッコウチュウ");

        // サーバーからの応答
        while(true){
          //レスポンスを待つ
          if (client.available()) {
            String line = client.readStringUntil('¥r');
            Serial.print(line);
          }
          else{
            delay(20);
          }
          if (!client.connected()) {
            Serial.println("\r\ndisconnecting.");
            client.stop();
            break;
          }
        }

        LCD.SetCursor(0, 1);
        LCD.Puts("カンリョウ!  ");
        delay(1000);

      }
      push_state_count=0;
      int pushing_display = -1;
      //2行目を初期化
      LCD.SetCursor(0, 1);
      LCD.Puts("        ");

    }
  }
}

動作確認

起動すると、一行目に、アクションが表示されます。
ボタンを短い時間押すと、1行目が入れ替わります。

5.png

ボタンを長押しすると2行目の「.」が増えていき、 右まで「.」が埋まってからボタンを離すと、

6.png

サーバーに接続します。

7.png

接続が完了すると、「カンリョウ」と表示されます。

8.png

いい感じですね!
次回は、ESP-WROOM-02をMINTIAのケースに格納します。

お楽しみに!