Espruino on ESP32 で Twitter(その3)
Espruino on ESP32 でぽちっとな - いっぺーちゃんの いろいろやってみよ~ と Espruino on ESP32 で Twitter(その2) - いっぺーちゃんの いろいろやってみよ~ を組み合わせてTweetボタンを作ってみましょう。
大雑把に言うと Espruino on ESP32 でぽちっとな - いっぺーちゃんの いろいろやってみよ~ でスイッチのステータスを表示していた部分をtweet処理に変えるだけです。
以下、そのソースです。
consumer_key = '取得した Consumer key'; consumer_secret = '取得した Consumer secret'; access_token = '取得した Access Token'; access_secret = '取得した Access Token Secret'; if (typeof(ESP32) ==='function') { // platform is espruino on ESP32 // Wi-Fi アクセスポイントへの接続 var wifi = require('MyWifi'); // set time zone fixed to 'JST' E.setTimeZone(9); // Initialize for switch var sw1 = Pin(21); sw1.mode("input" ); } else { throw "not ESP32"; } // モジュール読み込み var tiny_twitter = require("tiny_twitter"); // 初期化 var tw = new tiny_twitter(consumer_key, consumer_secret, access_token, access_secret, true); tw.on("connect", function() { console.log("%%%% CONNECTED %%%%"); }); tw.on("response_header", function(data, code, msg) { if (code != 200) { console.log("%%%% RESPONSE ERROR!!! " + code.toString() + " : " + msg); } console.log("%%%% RESPONSE_HEADER %%%%\n" + data + "\n%%%%%%%%%%%%%%%%%%%%%%%%%"); }); tw.on("data", function(data) { console.log("%%%% DATA %%%%"); console.log(JSON.stringify(data, null, '\t')); // エラー時はdata.errors.code data.errors.message に情報が入る console.log("%%%%%%%%%%%%%%%%%%%%%%%%%"); }); tw.on("end", function() { console.log("%%%% END %%%%"); }); function button_down(e) { var msg; var date = new Date(); h = date.getHours(); if (h >=4 && h < 12) { msg = 'Good morning, everyone!!'; } else if (h >=12 && h < 17){ msg = 'Good afternoon, everyone!!'; } else if (h >=17 && h < 21){ msg = 'Good evening, everyone!!'; } else { msg = 'Good night, everyone!!'; } tw.tweet(msg, {"trim_user":true,"include_entities":false}); } setWatch(button_down, sw1, {repeat:true, edge:"falling", debounce:100});
このプログラムを実行すると、Pin21に接続されたスイッチを押すたびにその時刻に応じた挨拶がtweetされます。
スイッチを押してからtweet完了まで4~5秒程度かかります。
tweet完了前に再度スイッチを押したときの動作は未確認です(メモリ不足で落ちそうな気がするけど)。
tweet開始~endイベントまで次のtweet要求をブロックすれば良いのかな?
ま、ぽんぽん押さなければ良いだけなので、そのままにしておこう。
以下処理の説明です。
ESP32の場合はWi-Fiに接続してタイムゾーンを設定し、スイッチ用の端子を初期化します。
それ以外の環境ではスイッチが使えないのでエラー終了します。
if (typeof(ESP32) ==='function') { // platform is espruino on ESP32 // Wi-Fi アクセスポイントへの接続 var wifi = require('MyWifi'); // set time zone fixed to 'JST' E.setTimeZone(9); // Initialize for switch var sw1 = Pin(21); sw1.mode("input" ); } else { throw "not ESP32"; }
モジュール読み込み~イベントハンドラは前回と同じです。
スイッチが押されたときのハンドラです。
現在時刻を取得し、時刻に応じた挨拶をtweetしています。
時刻の区切りには異論もあるでしょうけど。。。
日本語が使えれば、もうちょっと気の利いたtweetができるんですが。。。。
function button_down(e) { var msg; var date = new Date(); h = date.getHours(); if (h >=4 && h < 12) { msg = 'Good morning, everyone!!'; } else if (h >=12 && h < 17){ msg = 'Good afternoon, everyone!!'; } else if (h >=17 && h < 21){ msg = 'Good evening, everyone!!'; } else { msg = 'Good night, everyone!!'; } tw.tweet(msg, {"trim_user":true,"include_entities":false}); }
スイッチにハンドラを割り当てます。
今回はスイッチが押されたときだけ処理したいので、「edge:"falling"」としています。
setWatch(button_down, sw1, {repeat:true, edge:"falling", debounce:100});
これで、わざわざESP32からtweetする価値が出てきたかな?
温度センサの値を読んで、定期的(10分に1回とか)にtweetする、なんて使い方もできそうですね。
次回に続く。。。