いっぺーちゃんの いろいろやってみよ~

Espruino on ESP32 で Twitter(その5)

前回Espruino on ESP32 でLチカ - いっぺーちゃんの いろいろやってみよ~ を組み合わせて、TwitterからLEDを制御してみましょう。

 

以下にそのプログラムを示します。

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');

    // Initialize for LED1
    var led1 = Pin(23); 
    led1.mode("output");
    led1.reset();

    var led_on = function() {
        led1.set();
    };
    var led_off = function() {
        led1.reset();
    };
} else {
    var led_on = function() {
        console.log("LED ON");
    };
    var led_off = function() {
        console.log("LED OFF");
    };
}
if (typeof(E) ==='function') {
    // platform is espruino
    // set time zone  fixed to 'JST'
    E.setTimeZone(9);
}

// モジュール読み込み
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'));
    if (data.text) {
        console.log(data.text);
        if (data.text.indexOf('LED') >= 0) {
            if (data.text.indexOf('ON') >= 0) {
                led_on();
            }
            else if (data.text.indexOf('OFF') >= 0) {
                led_off();
            }
        }
    } else {
        console.log("** NO TEXT **");
    }
    console.log("%%%%%%%%%%%%%%%%%%%%%%%%%");
});
tw.on("end", function() {
    console.log("%%%% END %%%%");
});

// オプション指定
param = {"with":"user"};

// twitterに接続
tw.userstream(param);

 

前回との差分です。

 

ESP32のときは、LED用の端子の初期化とそれをON/OFFする関数を定義しています。

    // Initialize for LED1
    var led1 = Pin(23); 
    led1.mode("output");
    led1.reset();

    var led_on = function() {
        led1.set();
    };
    var led_off = function() {
        led1.reset();
    };

 

それ以外の場合は、LED制御ができないので、コンソールにON/OFFを表示する関数を代替処理として定義しています。

    var led_on = function() {
        console.log("LED ON");
    };
    var led_off = function() {
        console.log("LED OFF");
    };

 

また、データ受信時のイベントハンドラ内で、メッセージ本体内に「LED」と「ON」が含まれていたらLEDをONする関数をコール、
「LED」と「OFF」が含まれていたらLEDをOFFする関数をコールする処理を追加しています。
「LED ON OFF」や「LED not ON」 のような意地悪なメッセージは考慮していません(この実装ではどちらもONとして扱われる)。

        if (data.text.indexOf('LED') >= 0) {
            if (data.text.indexOf('ON') >= 0) {
                led_on();
            }
            else if (data.text.indexOf('OFF') >= 0) {
                led_off();
            }
        }

 

プログラムを実行したら、ここで使用しているアカウントで、ブラウザやスマホから「LED ON 1」とtweetしてみましょう。
LEDが点灯したと思います。

 

大文字、小文字は区別されますので、すべて大文字にしてください。
しつこいようですが、全角文字ではダメです。
最後の「1」は連続してtweetするときに同じ文にならないように追加しているだけなので、何でもかまいません。
連続してtweetするときはこの部分を変更してtweetしてください。
「LEDON」のように空白を挟まない場合や「ON LED」と順序を逆にした場合でもOKです。

 

 

次に「LED OFF 1」とtweetするとLEDが消灯します。

 

 

オプションを以下のようにすると、
ハッシュタグ「#ESP32_LED_CONTROL」が付いた自分以外からのtweetでもLEDをコントロールすることができます。
(文字列を見ているだけなので、ハッシュタグである必要はないですが)

 

param = {"with":"user", "track":"#ESP32_LED_CONTROL"};

 

ESP32 に赤外線LEDつけて、リモコン処理を代替できるようにすると、TwitterからエアコンのON/OFFができる、なんて夢が広がりますね(←勝手にエアコンONされて、電気代がぁぁぁ、って心配が。。。)

 

 twitterに関する記事はこれでおしまい。