2015年8月15日土曜日

ESP-WROOM-02プログラミング:ボタンを押したら最新のメンションを取得

前回に続きESP-WROOM-02 を使ったツイッター操作プロジェクトのメモ

プロジェクト概要:
 ボタンを押すと最新のメンション(返信)を取得するプロジェクト
 
 ツイートにはStewGateUのWebAPIを使用
 ネタ元はESP8266WIFI/WiFiClientサンプルコードとマイクロテクニカESP-WROOM02簡単マニュアル

動作のイメージ/Web APIを用いた最新メンションの取得

準備すること:
 →基本的に前回と同じだが、タクトスイッチ周りが変更されているので注意

 ・ArduinoIDE上でESP8266の開発環境構築(ググろう!)
  ・3V3とGNDに十分な電流が供給可能な3.3V電源を接続
 ・GPIO5にタクトスイッチを接続
  (プルアップ設定がOKだとわかったので抵抗不要/もう片側はGNDへ)
 ・TX/RXにはデバッグ用にシリアル―USB変換機を接続する
 ・ツイートに用いるTwitterアカウントの準備(新規アカウント推奨)
 ・StewGateUにてTwitterアカウント登録およびトークン取得
 ・ESP-WROOM-02を接続してもよい無線LANルータのSSIDとパスワードをメモ


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


実行方法:
 ・ESP-WROOM-02をブートモードで起動
 ・デバッグ出力より無線LANルータとの接続を確認
  (『WiFi connected』の表示を確認)
 ・タクトスイッチを押すと最新のメンションがデバッグ出力される
  (※取得日時やホスト名などの付加情報も同時に出力される)


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

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

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

 ・レスポンス取得前のdelay()を増やしてみる
   →リクエストを出してから返事が来るまでに若干の待ち時間があるため
    即座に取得しようとすると失敗する様子


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

 
#include <esp8266wifi.h>

#define KEY_PIN 5

//接続先の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_PULLUP);
}

bool getLastMention(void)
{
  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/last_mention/ HTTP/1.0");

  client.print("Host: ");  
  client.println(host);
  
  int msgLength = 35;
  client.print("Content-length:");
  client.println(msgLength);
  client.println("");

  //トークンのみ
  client.print("_t=");
  client.println(token);

  //この待ち時間が短すぎるとclient.available()がうまく働かずレスポンスがうけとれない
  delay(500);
  
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.println(line);
  }
  
  Serial.println();
  Serial.println("closing connection");

  return true;  
}

void loop() {
  delay(100);

  //プルアップにしたため極性を変更
  if(digitalRead(KEY_PIN) == LOW)
  {
    getLastMention();  
  }
}


0 件のコメント:

コメントを投稿