2015年8月10日月曜日

ESP-WROOM-02プログラミング:ボタンを押したらツイート

以下ESP-WROOM-02 を使ったプロジェクトのメモ

プロジェクト概要:
 ボタンを押すと定型文をツイートするプロジェクト
 
 ツイートにはStewGateUのWebAPIを使用
 ネタ元はESP8266WIFI/WiFiClientサンプルコードとマイクロテクニカESP-WROOM02簡単マニュアル

動作のイメージ/Web APIを用いたtweetを行う

準備すること:
 ・ArduinoIDE上でESP8266の開発環境構築(ググろう!)
  ・3V3とGNDに十分な電流が供給可能な3.3V電源を接続
 ・GPIO5にタクトスイッチ+プルダウン抵抗を接続
  (押すとHが入力されるように3.3VとGNDに接続すること)
 ・TX/RXにはデバッグ用にシリアル―USB変換機を接続する
  (接続しなくても動作自体は行われる)
 ・ツイートに用いるTwitterアカウントの準備(新規アカウント推奨)
 ・StewGateUにてTwitterアカウント登録およびトークン取得
 ・ESP-WROOM-02を接続してもよい無線LANルータのSSIDとパスワードをメモ


作成方法:
 ・ソースをコピペして以下の情報を修正する
   ・SSID
   ・SSIDに対するパスワード
   ・StewGateUで取得したトークン
 ・ビルドしてダウンロードモードのESP-WROOM-02に書き込み
  (→過去メモ参照)


実行方法:
 ・ESP-WROOM-02をブートモードで起動
 ・デバッグ出力より無線LANルータとの接続を確認
  (『WiFi connected』の表示を確認)
 ・タクトスイッチを押すと定型文(『XXXX:HelloWorld!』)がツイートされる


うまくいかない場合は以下をチェック:
 無線LANルータの規格
   →ESP-WROOM-02が対応できるのは802.11b/g/n

 ・チップへの給電が十分か
   →通信時は80mA以上消費する

 ・ダウンロードモードからの設定変更は忘れていないか
   →GPIO0ピンをL→Hに戻し忘れることが多い
    ブートモードにしないと当然ながら起動しない

 ・メッセージ長の設定は正しいか
   →Content-length:の設定値以上の情報は無視される

 ・ツイート内容が重複していないか
   →同じ内容のツイートをした場合はTwitterにキックされる

注意点:
 ・ソースの大半はESP8266WIFI/WiFiClientサンプルコードからの流用
 ・無線LANルータの設定(ステルスID/接続先限定など)によっては動かない
 ・マイクロテクニカESP-WROOM02簡単マニュアルのパスは尼のマイクロテクニカショップでESP-WROOM-02を買ったら付いてきた
  各機能の使い方が日本語で簡潔にまとめられておりおススメ
  (ただし、デフォルトファームをATコマンドで操作する前提での解説)

 
#include <esp8266wifi.h>

#define KEY_PIN 5

//無線LANルータのIDおよびパスワード
const char* ssid     = "XXXXXXXX";
const char* password = "YYYYYYYY";

const char* host = "stewgate-u.appspot.com";
//http://stewgate-u.appspot.com/より取得したトークン
const char* token = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";

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

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  
  pinMode(KEY_PIN, INPUT);
}

bool postMsg(String msg)
{
  Serial.print("connecting to ");
  Serial.println(host);
  
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return false;
  }
  
  client.println("POST /api/post/ HTTP/1.0");

  client.print("Host: ");  
  client.println(host);

  //メッセージ以外の長さ(トークン含む)にメッセージ長を加算  
  int msgLength = 40;
  msgLength += msg.length();
  client.print("Content-length:");
  client.println(msgLength);
  client.println("");

  client.print("_t=");
  client.print(token);
  client.print("&msg=");
  client.println(msg);

  delay(10);
  
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  
  Serial.println();
  Serial.println("closing connection");

  return true;  
}

int value = 0;
void loop() {
  delay(100);
  ++value;

  if(digitalRead(KEY_PIN) == HIGH)
  {
    String text;
    //同じ内容のツイートはキックされるためユニークな値を付加
    text += String(value, DEC);
    text += ":HelloWorld!";
    
    postMsg(text);
  }
}

0 件のコメント:

コメントを投稿