Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

スイッチサイエンスさんの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をトリガにしたいですね。