head

2015年8月20日木曜日

esp8266(esp-wroom-02)で Lチカ(LED制御) ARDUINO SDK 、クラウド連携


====== update 2015-09-13 ========
技適な話、
国内使用でのファーム書換(カスタムファーム)で
追加申請する場合は別ですが、技適の適応外となりそうですので
(ネット記事を参考)
日本国内での使用は参考を控えて下さい
初期ファームでの使用は問題ないと思います。
又海外でのデバイス開発、使用に関しては問題ないと思いますので
記事としては当面残したいと思います

*) 初期ファーム活用した、マイコン連携の記事も公開しています。
http://knaka0209.blogspot.jp/2015/08/esp-wroom-02-03.html
=================================

実践編で、前回(esp8266(esp-wroom-02)+mbed LPC1114FN28 でIoT。 センサ値送信)
のセンサ値と似ていますが、

の続編で、実行系の処理、Lチカ (LEDの制御)で
IoTぽく、クラウドから送信値を解析し、LEDのON/OFFの時間を設定します。


*) わかりにくいかもですが、ARDUINO SDK使いますが、
回路上にARDUINOボード、マイコンなど全くありません。
でもesp8266開発ができます。スゴイ!!

[概要]
1) ARDUINO SDK のesp8266ライブラリを使用
2) 応答用のweb-APIを準備しておく


# 部品
[esp8266(esp-wroom-02) WIFIの接続テスト] と似ています。低価格
実行時は、[USB-シリアル変換]などは実装しなくても、稼動できます。

*) FW(ファーム)書込み後は、結線不要です。

# 準備など
ARDUINO SDK で、esp8266をビルド、書込み記事は探せば出てきました。下記を参考
[技適済み格安高性能Wi-FiモジュールESP8266をArduinoIDEを使ってIoT開発する為の環境準備を10分でやる方法]


ライブラリなど、セットアップしておきます。
Wifi Client などのサンプルを参考に、実装します。

# 組立 -結線
[esp8266(esp-wroom-02) WIFIの接続テスト] を参考に、
http://knaka0209.blogspot.jp/2015/08/esp-wroom-02-01.html

WIFI、電源回路など配線しておきます。
LEDの回路は、(右側のミニ-ブレボ)に、
16ピンから、
抵抗 100 オーム
LED
GND ,に接続

# WEB-API
# code

カンタンですが、クラウド側から、
送信プロトコルの準備しておきます。
乱数で、LED点灯時間を毎回生成します。 2-10 秒

<?php
//------------------------------------
// @calling
// @purpose : Zero Str, max=10 char
// @date
// @argment
// @return
//------------------------------------
function getZeroStr( $src, $num ){
if($num > 10){
return "";
}
$buff="0000000000";
$buff = $buff . $src;
$i_len = strlen($buff);
$ret = substr($buff, $i_len - $num, $num);
return $ret;
}
//------------------------------------
// @calling
// @purpose :
// @date
// @argment
// @return
//------------------------------------
$ret_base= "000000000000000000000000";
$sHEAD ="web-response1=";
$nRan =mt_rand(2, 10 );
$respose="1" . getZeroStr($nRan ,3);
$res2 = substr($respose, 0, 4);
echo $sHEAD .$res2;
?>
4 byte
1 : 開始指示
2-4 : LED点灯時間(3桁、デジタル=HIGH にする時間)
*) データ部分の前に、ヘッダ文字をつけておきます。(解析位置の検出用)


# ARDUINO code (esp8266へ書き込むコード)
#include <ESP8266WiFi.h>
const char* ssid = "your-ssid";
const char* password = "your-pass";
const char* host = "your-dns";
int mNextTime =30000;
const byte mLED_pin =16;
//Struct
struct stParam{
String stat;
String kai_num_1;
};
struct stParam get_Struct(String sRes4){
struct stParam param;
param.stat = sRes4.substring(0,1);
param.kai_num_1= sRes4.substring(1,4);
return param;
}
void setup() {
Serial.begin(115200);
delay(10);
pinMode(mLED_pin, OUTPUT);
// We start by connecting to a WiFi network
Serial.println();
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());
}
int value = 0;
void loop() {
delay( mNextTime );
++value;
Serial.print("connecting to ");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
String url="/api-1234.php";
Serial.print("Requesting URL: ");
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.0\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
delay( 3000 );
int iSt=0;
struct stParam param;
while(client.available()){
String line = client.readStringUntil('\r');
//Serial.print("line=" + line);
iSt = line.indexOf("web-response1=");
//Serial.println("iSt="+ String(iSt));
if(iSt >= 0){
iSt = iSt+ 14;
String sDat = line.substring(iSt );
Serial.println("sDat=" + sDat);
param =get_Struct(sDat);
}
}
Serial.println();
Serial.println("closing connection");
if(param.stat=="1"){
Serial.println("#Stat=1");
Serial.println("#param.kai_num_1= " + param.kai_num_1);
int kNum =param.kai_num_1.toInt();
if(kNum > 0){
digitalWrite( mLED_pin, HIGH);
for(int i=0;i< kNum; i++){
Serial.println("# [PIN16=HIGH], CT= "+ String( i ));
delay( 1000 );
}
digitalWrite(mLED_pin, LOW);
}
}
}
[説明など]
WIFI接続 SSID, パスワード、
接続するホスト名
を設定、
APIのファイル名は決めて下さい。

const char* ssid     = "your-ssid";
const char* password = "your-pass";

const char* host = "your-dns";

[リクエスト] 
この場合、センサ値などは送信しません
実行後は、wait後、受信値の解析処理後、
16番ピンに対して、
デジタル出力=H 後
LOWにするタイミングを監視、LOW送信。


String url="/api-1234.php";

 client.print(String("GET ") + url + " HTTP/1.0\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");


====2015-09-07 =======
スリープ設定で、LIGHT_SLEEP を使った場合、
通信失敗の確立 (10 -15%程度)が増加した為、
通常( スリープなし )に変更しました


# esp8266 に書き込む方法
IO0 (ゼロ)を
GND に結線します[UART  DownLoad Mode]
この状態で書込みます。( [マイコンボード書込]ボタンおす )

*) 通常は3V3へ結線、[FLASH Boot Mode]

ARDUINO SDK から、FW書き込んだ場合は、初回の1回だけ
自動で再起動され、実行されます。
*) 2回目以降、電源ON/OFF して実行させる場合は、上記の [3V3]のジャンパ変更下さい。

# まとめ
リレー回路など、実行制御系に応用できると思います。
それでは、また

# 参考の記事
回路など

#関連の記事
ESP-WROOM-02の接続テスト
http://knaka0209.blogspot.jp/2015/08/esp-wroom-02-01.html
マイコン連携(esp-wroom-02+mbed LPC1114FN28 で、IoT )
http://knaka0209.blogspot.jp/2015/08/esp-wroom-02-02.html

# 開発者向けのまとめ記事
http://knaka0209.blogspot.jp/2015/04/agri.html






0 件のコメント:

コメントを投稿

google colaboratory お試し編 、GPUも使える機械学習の環境構築

前回続き、機械学習の関連となります。 開発環境まわりの内容となり。先人様の情報を元に調査しました。 google colab(google colaboratory) を試してみました。機械学習系の いくつかのライブラリがインストール済みで、 クラウド上で、ある程度機械学...

AD-parts

Shop
Bluetooth搭載
ベース基板

Social