大学を休学して大船渡に住んでみた

東京の大学を休学し、大船渡に住んでみた男の体験記です。

ペットの散歩状況をツイートするIoTを作りました【ESP-WROOM-02 & IFTTT】

こんにちは、休学して大船渡に住んでいるポタトです。

 

ポタトの大船渡滞在もあとわずかになりました。最後、ギークハウスに何か残して帰りたいということで、IoT作品を作りました。

 

ギークハウス大船渡には、ソラという犬のペットがいます。シェアハウスの住人で世話をするということになっています。

ソラがいつ散歩に行ったのか分からないので、散歩したら、その旨をツイートすることにしました。

この装置の黒いボタンを押すと(もしくは電源をオフ→オンにすると)...
f:id:big_ship_cruise:20181017115053j:plain

このようなツイートが送信されます。
f:id:big_ship_cruise:20181017115209p:plain

記録として、このアカウントに残っていきます(散歩するたびにボタンを押していることが前提です)。
 f:id:big_ship_cruise:20181017115314j:plain

 

課題

実際に動かしてみたところ、1日で電池切れしてしまいました。

現状ではこまめに電源オンオフしなくてはならず、面倒くさい仕様になっています。そのためあまりボタンが押されていません。

大船渡を離れる前に何かしらの改善ができればと思っています。

技術的なことについて

ESP-WROOM-02について

今回使用したESP-WROOM-02は、Arduino IDEを用いてコードを開発することができるマイコンです。Wi-Fi付きArduinoのような使い方ができます。

 

仕組み

ボタンを押す(ESP-WROOM-02) 

→ IFTTT Webhooksで指定したURLにアクセスする 

→ IFTTT Webhooksがトリガーとなり、Twitterに投稿する

となっています。

 

コード

大半の部分について、

3.6 ESP8266 のプログラムを用意する (ESP8266 で IFTTT を使ってtwitterにつぶやく)3.6 ESP8266 のプログラムを用意する (ESP8266 で IFTTT を使ってtwitterにつぶやく)

を参考にしています。

 

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "*****";
const char* password = "*****";

const char* host = "maker.ifttt.com";
const int httpsPort = 443;

const char* iftttEvent = "*****";
const char* iftttKey = "*****";

// Use web browser to view and copy
// SHA1 fingerprint of the certificate
const char* fingerprint = "*****";

const int led = 13;

void setup() {
Serial.begin(115200);
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());

// Use WiFiClientSecure class to create TLS connection
WiFiClientSecure client;
Serial.print("connecting to ");
Serial.println(host);
if (!client.connect(host, httpsPort)) {
Serial.println("connection failed");
return;
}

if (client.verify(fingerprint, host)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
}

String url = "/trigger/";
url = url + iftttEvent + "/with/key/" + iftttKey;
Serial.print("requesting URL: ");
Serial.println(url);

int random_number_for_comment = random(5);
String random_string[] = {"同じ場所にいるのはつまらないワン!", "体を動かすのは楽しいワン!", "外の世界を見に行くワン!", "イネ科の植物は食べるワン!", "寂しかったワン!"};

int random_number = random(10000);
String random_number_string = String(random_number);

String data = String("{ \"value1\" : \"") + random_string[random_number_for_comment] + "\", " 
+ "\"value2\" : \"" + random_number_string + "\", "
+ "\"value3\" : \"" + "xyz" + "\" } ";

Serial.println(data);

client.print(String("POST ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"User-Agent: BuildFailureDetectorESP8266\r\n" +
"Connection: close\r\n" +
"Content-Type: application/json; charset=utf-8\r\n" +
"Content-Length: " + data.length() + "\r\n\r\n" +
data + 
"\r\n"
);

Serial.println("request sent");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
Serial.println("headers received");
break;
}
}
String line = client.readStringUntil('\n');

Serial.println("reply was:");
Serial.println("==========");
Serial.println(line);
Serial.println("==========");
Serial.println("closing connection");
pinMode(led, OUTPUT);
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
}

void loop() {
}