Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

スイッチサイエンスさんのesp8266開発ボード「ESPr Developer」とgroveカメラを繋ぐ

スイッチサイエンスさんのesp8266開発ボード「ESPr Developer」とgroveカメラを繋ぐ方法です。
開発ボードだと面倒ごとが大分緩和されます。

実際のところ

  • カメラで画像を取る
  • POSTはしない。ブラウザで確認するだけ。

必要資材

配線

外観だとこんな感じ。
電源はACからレギュレータ越しでVinに入っています。
Groveでは黄色がTx、白がRxという事になっているそうなので、そのままESP8266にクロスでつなぎます。

スクリプト

基本的にbinzume様のスクリプトをベースにさせてもらいました。
github.com

ただメインの方は、今回の用途に併せてPOSTまわりを中心に削らせて貰ってます。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "HttpClient.h"
#include "ov528.h"

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

ESP8266WebServer server(80);

const int led = 5;

void handleRoot() {
  digitalWrite(led, 1);
  server.send(200, "text/plain", "hello from esp8266!");
  digitalWrite(led, 0);
}

void handleNotFound() {
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void handleInit() {
  digitalWrite(led, 1);

  camera_sync();
  camera_init();

  server.send(200, "text/plain", "init ok!");
  digitalWrite(led, 0);
}

void handleSnapshot() {
  digitalWrite(led, 1);
  camera_snapshot();
  server.send(200, "text/plain", "ok!");
  digitalWrite(led, 0);
}

void handleGetJpeg() {
  digitalWrite(led, 1);
  WiFiClient client = server.client();
  // client.setNoDelay(true);
  camera_get_data(NULL, [](void* ctx, uint32_t sz){
    server.setContentLength(sz);
    server.send(200, "image/jpeg", "");
  }, [](void* ctx, uint8_t *buf, uint16_t len){
    WiFiClient client = server.client();
    if (client.connected()) {
      client.write(static_cast<const uint8_t*>(buf), len);
    }
  });
  client.flush();
  digitalWrite(led, 0);
}

void blinkLed() {
  //受信待機が寂しいのでLチカ
  digitalWrite(led,LOW);
  delay(500);
  digitalWrite(led,HIGH);
  delay(500);
}

void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  
  //接続待機
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  //ここまで来たら繋がったので、WiFiの状態とIPアドレスを表示
  Serial.println("");
  Serial.println("WiFi connected");
  WiFi.printDiag(Serial);
  Serial.println(WiFi.localIP());

  //アドレスの設定
  server.on("/", handleRoot); //デフォ画面
  server.on("/init", handleInit); //カメラ初期化
  server.on("/snap", handleSnapshot); //スナップショット。画像データをメモリに入れる
  server.on("/get", handleGetJpeg); //メモリに入ったデータを読み出す

  server.onNotFound(handleNotFound); //不正なURLは消す

  server.begin();

  Serial.println("Started!"); //状況開始!
}

void loop(void) {
  server.handleClient();
  blinkLed();
}

動作の様子

http://192.168.xxx.xxx/getにアクセスすると
f:id:shuzo_kino:20161113232458p:plain

これから

IFTTTと連携させて、LINEなりメールなりで画像が確認できるように。
時間毎の実行も、IFTTTをトリガにしたいですね。