2020年6月7日日曜日

宅配ボックス開閉通知 IFTTT

Amazonが置き配をデフォにして、しかもそれがAmazon使うのやめようかと思うほどユーザー無視の仕様><;

なにが問題かと言うとおき配指定した場合ヤマトや佐川はピンポンしてくれるんだけど日本郵政やAmazon配送となっているわけわからない配送業者はピンポンしてくれない><;いてもいなくてもピンポンせずに強制おき配。

頼んだものが2便に分かれてしまった場合あとから届いたものは宅配ボックスにすでに鍵がかかっているということで持ち帰られてしまう><;

ということで、宅配ボックスにものが入ったらピンポンがなるIoTを作ろうとしたわけです^^;

1年ほどArduinoから離れていたせいかなにをやってもうまくゆかない><;現象としては途中で暴走リセットしている模様…

Serial.print() しただけで USB 接続が切断され /dev/ttyUSB0 と /dev/ttyUSB1 が交互に切り替わるって、意味が分からない><;この問題に悩まされること3ヶ月!やっと原因を見つけた!原因は「USB3.0ハブ」アマゾンで買ったんだけどこいつ経由だと駄目。本体のUSBポートに直接繋ぐと正常に動くようになった><;

いやはや、実際こいつを買って以降、Arduino関連では書き込みできなかったり散々な目にあっていました><;

愚痴はここまで

正常に制御できるようになったレ簡単なプログラムすぐできた\(^_^)/

ESP-WROOM-02 にマグネットスイッチを付けただけ、超簡単。


さてと、基盤むき出しは信頼性低すぎなんで3Dプリンターでケース作ります。^^;

参考になるかわかりませんがソースも置いておきます。

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

const char* ssid = "SSID";
const char* password = "password";
const char* IFTTT_KEY = "KEY";

#define TIMEOUT (5 * 1000 * 1000)

const char* eventOpen = "open_box";
const char* eventClose = "close_box";

int last = -1;
int count = 0;

void setup()
{
  Serial.begin(115200);
  Serial.println("Start 115200");

  pinMode(D3, INPUT_PULLUP);  // magnetic switch
  pinMode(D4, OUTPUT);        // built in LED
  last = digitalRead(D3);

  // 再起動サイン
  for (int i = 0; i < 20; ++i) {
    digitalWrite(D4, i & 1);
    delay(200);
  }

  // WiFi
    delay(500);
  Serial.print(F("\n\nConnecting to "));
  Serial.println(ssid);
  int error_count = 0;
  WiFi.begin(ssid, password);
  // Wifi接続成功 待ち
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }
  Serial.print(F("\nWiFi connected\n"));
  Serial.println(WiFi.localIP());
}

void loop()
{
  // 内蔵LED点滅
  digitalWrite(D4, count & 1);
  delay(10);

  // 磁気スイッチ読み取り
  int val = digitalRead(D3);
//  Serial.printf("cnt: %d, switch: %d, value: %d\n", count, count & 1, val);

  // 変化した?
  if (last != val) {
    // 変化したのでIFTTTのWebトリガーを呼ぶ
    if (val) {
      triggerIfttt(eventOpen, "open", "", "");
    } else {
      triggerIfttt(eventClose, "close", "", "");
    }
  }

  last = val;
  ++count;
  delay(1000);
}

/**
 * IFTTT へ WebTrigger
 * @param const char* event
 * @param char* value1
 * @param char* value2
 * @param char* value3
 */
boolean triggerIfttt(const char* event, char* value1, char* value2, char* value3)
{
  BearSSL::WiFiClientSecure client;
  client.setTimeout(500);
  client.setInsecure();

  // 接続
  if (!client.connect("maker.ifttt.com", 443)) {  // IFTTTへ接続確認
    Serial.println(F("ERROR: https connect"));    // エラー出力
    error();
    return false;
  }
  Serial.printf("https connected\n");    // エラー出力

  // リクエスト送信
  char* format =
    "GET /trigger/%s/with/key/%s?"
    "value1=%s&value2=%s&value3=%s HTTP/1.1\r\n"
    "Host: maker.ifttt.com\r\n"
    "User-Agent: ESP8266\r\n"
    "Connection: close\r\n\r\n";
  client.printf(format, event, IFTTT_KEY, value1, value2, value3);
  Serial.printf("Send web trigger");

  // 応答待ち
  unsigned long start = micros();
  while (client.available() == 0) {
      if ((micros() - start) > TIMEOUT) {
          Serial.println(">>> Client Timeout !");
          client.stop();
          error();
          return false;
      }
  }
  Serial.printf("Recive responce");

  // レザルトの受け取り
  while(client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
  }
  return true;
}

void error()
{
  for (int i = 0; i < 40; ++i) {
    digitalWrite(D4, i & 1);
    delay(50);
  }
}