osx のシリアルポートのユーティリティーあれこれ

シリアルをtelnet 経由してつなげるようになったので、ArduinoIDE からシリアルをWiFi で書き込めるようにしてみようとあれこれやること、1日弱。結局、osx では良いツールが見つからずできませんでした。

何ができなかったかと言うと、仮想シリアルポートを作成して、それをArduinoIDE から認識できずで、何かやり方があるんだろうと思います。socat の使い方が悪いんだと思うので、継続して調査。Windows だとこのあたりのツールはたくさんあって、苦労しない感じなので、次回は、Windows でやってみることに。

で、いろいろsocat の使い方を試しているうちに、昨日の疑問が解けました。

・ESP12 の接続IPにつなげて、echo が表示されてしまう問題
・CTL + C など 接続した先でやりたいんだけど、socat の接続元(osx 側)で CTL + C になる問題

これは、以下のようにすれば良いようです。

$ socat STDIN,raw,echo=0 TCP:192.168.1.36:23

raw をつけておけば、そのままコントロール信号も送られるけども、手元のターミナルは中断できないので、ターミナルウィンドウを閉じてしまう感じ。tcpdump とか、WiFi 経由のシリアルから入って採取してるときとか、CTL + C できるし、上矢印のコマンド履歴も、tab 補完キーも効きます。理屈がわかってしまえば、あ、そうかということですが。。。。

 

調べているときに、よくまとまったBlog記事があったので、メモしておきます。

Make RS232 Serial Devices Accessible via Ethernet
http://blog.philippklaus.de/2011/08/make-rs232-serial-devices-accessible-via-ethernet/

最後に、socat でのソケットを分割するには、以下のようにやれば良い事がわかりました。

ishizaka_—_socat_—_ttys008_—_76×23_と_ishizaka_—_socat_—_ttys007_—_76×23_と_ishizaka_—_socat_—_ttys002_—_76×23_と_ishizaka_—_tail_—_ttys009_—_76×36

sudo socat -d -d -d -d -lf /tmp/socat \
pty,\
link=/dev/master,\
raw,\
echo=0,\
user=junkhack,\
group=staff\
 \
pty,\
link=/dev/slave,\
raw,\
echo=0,\
user=junkhack,\
group=staff

 

 

どうやって、arduinoIDE のシリアルポートに表示させるかが課題です。

WiFi 経由のシリアルコンソールで、ずっとtcpdump を流してテストしていますが、接続もきれず良い感じです。あと、話は飛びますが、ESP8266 Arduino Core のドキュメント見てましたら、File system も使えるようですね。これはある程度まで、データをメモリに貯めておいて、まとめてWifi 出力でデータを飛ばせば、電力の消費も抑えられそうです。sleep mode の下調べはおおよそ終わったので、コード実装して、電池駆動にしてテストするデバイス作りを夏休み(まだこれからなんですが)にやれればと思っています。ESP8266 、こんなに遊べるとは。まだlua にするのもありますしね。今年いっぱいは遊べる感じです。飽きるか、いきづまらなければね。

ESP-12でraspi2のシリアルコンソールをWiFi化

前から、興味があった透過型のUARTーWiFIブリッジ的に使う方法をあれこれ試していました。

結論から言えば、出来ました。

こんな感じで、電源はRasPi2 から取っていますので蓋の中に収められそうです。

uart-wifi

ESP-12 に収めるプログラムは、なんとサンプルスケッチの中にありました。WiFiTelnetToSerial です。

/* 
  WiFiTelnetToSerial - Example Transparent UART to Telnet Server for esp8266

  Copyright (c) 2015 Hristo Gochkov. All rights reserved.
  This file is part of the ESP8266WiFi library for Arduino environment.
 
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
#include <ESP8266WiFi.h>

//how many clients should be able to telnet to this ESP8266
#define MAX_SRV_CLIENTS 1
const char* ssid = "yyyyy";
const char* password = "xxxxx";

WiFiServer server(23);
WiFiClient serverClients[MAX_SRV_CLIENTS];

void setup() {
  Serial1.begin(115200);
  WiFi.begin(ssid, password);
  Serial1.print("\nConnecting to "); Serial1.println(ssid);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
  if(i == 21){
    Serial1.print("Could not connect to"); Serial1.println(ssid);
    while(1) delay(500);
  }
  //start UART and the server
  Serial.begin(115200);
  server.begin();
  server.setNoDelay(true);
  
  Serial1.print("Ready! Use 'telnet ");
  Serial1.print(WiFi.localIP());
  Serial1.println(" 23' to connect");
}

void loop() {
  uint8_t i;
  //check if there are any new clients
  if (server.hasClient()){
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      //find free/disconnected spot
      if (!serverClients[i] || !serverClients[i].connected()){
        if(serverClients[i]) serverClients[i].stop();
        serverClients[i] = server.available();
        Serial1.print("New client: "); Serial1.print(i);
        continue;
      }
    }
    //no free/disconnected spot so reject
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  //check clients for data
  for(i = 0; i < MAX_SRV_CLIENTS; i++){
    if (serverClients[i] && serverClients[i].connected()){
      if(serverClients[i].available()){
        //get data from the telnet client and push it to the UART
        while(serverClients[i].available()) Serial.write(serverClients[i].read());
      }
    }
  }
  //check UART for data
  if(Serial.available()){
    size_t len = Serial.available();
    uint8_t sbuf[len];
    Serial.readBytes(sbuf, len);
    //push UART data to all connected telnet clients
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      if (serverClients[i] && serverClients[i].connected()){
        serverClients[i].write(sbuf, len);
        delay(1);
      }
    }
  }
}

ArduinoIDE へ、ESP8266 Arduino Core の最新(ver. 1.6.5-1044-g170995a, built on Aug 10, 2015)を収めました。

SDK1.3 が収まったものは、以下のStaging versionから入れました。

https://github.com/esp8266/Arduino

Staging version

Boards manager link: http://arduino.esp8266.com/staging/package_esp8266com_index.json

リファレンスも出来て、だんだんと充実してきたようです。

esp-12_pin

スケッチは、スケッチの例>ESP8266Wifi >WiFiTelnetToSerial のところから辿っていきます。

ボード設定は、以下のようにしました。

Borad : Generic ESP8266 Module

Flash mode : QIO

Flash frequency : 40Mhz

CPU frequency : 80Mhz

Flash size : 4M (3M SPIFFS)

Upload speed : 115200

配線は、RasPi2 の TX RX を ESP12 のRX TX へつなぎ、3.3V のVCC と GND をつなぐ感じ。RasPiには、シリアルコンソールの設定がしてある状態で電源ON

5,6秒ほどで、ESP12 がアクセスポイントへ接続するので、ESP12 がIP を何をとっているか、DHCPの払い出しIP をを見て、以下のコマンドで接続。socat は brew で入れました。


$ socat STDIN tcp-connect:192.168.1.36:23

これで、シリアル接続のものは、WiFi 化できそうです。接続するツールは工夫する必要がありそうです。たとえば、osx だと、MultiCom というツールがあり、接続をパイプできるので便利です。

MultiCom_と_WiFiTelnetToSerial___Arduino_1_6_5_Hourly_Build_2015_06_12_03_13

ishizaka_—_telnet_—_ttys003_—_70×21_と_ishizaka_—_telnet_—_ttys004_—_70×21_と_Change_log 
まだ、あんまり使い方はわかっていないんですが、IPとポート指定で ESP12 のWiFi へ接続し、それをローカルのプロキシーのようなものに接続し、複数接続できるようです。Windows のcom0com のようなのが欲しかったのですが、osx では見つけられませんでした。

あと、リモートからだと、コンソールのサイズも大きいほうが使いやすいので、getty の設定を以下のように変更。

—- /etc/default/console-setup

::

SCREEN_WIDTH=150

SCREEN_HEIGHT=60

あと、環境変数へ設定。

—- .bashrc

::

export LINES=150

export COLUMNS=60

とりあえず、こんな感じで使えるようになりました。tab補完や、そういうのはどうやるんでしょうね?ま、おいおい。

USB to シリアル がなくてもワイヤレスで、シリアルが使えるというのはなんとも、慣れないですが、今後活用のアイデアも出てくるかもしれません。ESP12 に下駄をはかせず、基盤にうまく実装すれば蓋の中に納まりそうですし。RasPiのベアメタル開発に手を出したときには便利かもしれませんね。

リチウム電池とESPを組み合わせて、単品のシリアルWiFi機器とすれば、何か応用できるかもです。

ESP-12のファームウェアをv1.3.0 に

オフィシャルのツールがWindows のexe だったので、バーチャルボックスでインストール。

Flash download tool Vsersion:v1.2

http://bbs.espressif.com/viewtopic.php?f=57&t=433

DETECTED INFO に 32Mbit って出てました。前回、調査したように、やはりESP-12 には、32M-bit / 4M-byte ( 4,194,304 )あるようです。今まで、512Kb でもarduino とかと比べると、おおーたくさんあるねと思っていましたが、それの4倍です。ちょっと得した気分ですね。クリスタルは26Mhz のようです。

GW-20150812-000341 で、書き込みして、AP に接続できるようにしてリセットかけてみました。ちゃんとフラッシュに設定は保存されて、バージョンも1.3.0 になっていました。UART の都合上、Windows のCoolTerm で接続テストはやりました。

GW-20150812-000919

あと、マニュアルのP.55 に 前からできるみたいなんだけども、UART-WiFi passthrough modeというのがあって、WiFi経由でシリアルにパススルーできるようです。osx 側の nc は brew で netcat を入れています。osx のだとオプションが通らないので。

CoolTerm_0_と_ishizaka_—_ESP8266_—_netcat_—_ttys000_と_名称未設定

この設定は、フラッシュに保存されないようなのですが、IP と Port を打ち込めるようなものをESP側に付ければ、WiFi 経由でシリアルを操れることになりますね。これを、単機能にしてESPのAP に接続しにきたものをシリアルに流すだけのファームが透過のブリッジのファームウェアの原理なのかも。このあたりは、次回以降実験してみたいと思います。

あ、あとWEBにもオフィシャルのAT コマンド(ちょっと古いけど)があったので、メモ。

CIPMODE

https://github.com/espressif/esp8266_at/wiki/CIPMODE

ま、とりあえずフラッシュが4Mあって、SDK1.3も書き込めるということがわかったのでとりあえず今日はここまで。

ESP12 ファームウエア

前からやりたかったんですが、後回しになっていたESP8266(ESP-12) のファームウェアの書き換えです。

いろんなところで紹介されているので、いまさらですが、忘れてしまうためにメモしておきます。

 

2014.08.09 現在で、オフィシャルのファームウェアは、以下のようです。昨日リリースですか!

Latest Version 1.3.0 Release date Aug 08, 2015

解答すると、以下のようなバイナリがあります。

$ cd esp8266/esp_iot_sdk_v1.3.0_15_08_08/esp_iot_sdk_v1.3.0/bin

$ tree
.
├── at
│   ├── eagle.flash.bin
│   ├── eagle.irom0text.bin
│   ├── readme.txt
│   ├── user1.1024.new.2.bin
│   └── user2.1024.new.2.bin
├── blank.bin
├── boot_v1.2.bin
├── boot_v1.4(b1).bin
├── esp_init_data_default.bin
└── upgrade

2 directories, 9 files

購入したときには、0.9.5あたりが入っていた記憶があります。(未確認)そのときは、確か、あまり確認もせずに、arduino IDE for ESP8266 から書き込んだのでどうなっていたかわかりませんが、再度、オフィシャルから見てみました。

 

このあたりは、オフィシャルのBBSを見たほうがいいです。結構なスピードでSDK のバージョンがあがっています。

Espressif / ESP8266 / Developer Zone /  Downloads / SDKs

http://bbs.espressif.com/viewforum.php?f=46

とりあえず、0.9.5 をもう一度入れて復習しておきます。BBS からSDK のesp_iot_sdk_v0.9.5_15_01_23を落として解凍してみました。

$ cd esp_iot_sdk_v0.9.5_15_01_23/esp_iot_sdk_v0.9.5/bin

$ tree
.
├── at
│   ├── readme.txt
│   ├── user1.512.new.bin
│   ├── user1.512.old.bin
│   ├── user2.512.new.bin
│   └── user2.512.old.bin
├── blank.bin
├── boot_v1.1.bin
├── boot_v1.2.bin
├── esp_init_data_default.bin
└── upgrade

GPIO0 Pin をGND に落としてBoot して、(もしくは、RST を GND に落としリセットして)以下のコマンドで書き込みます。

$ esptool.py -p /dev/tty.SLAB_USBtoUART write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin

※-p オプションの UART デバイスはお使いのものを

無事書き込みできると、以下のようになります。

Connecting…
Erasing flash…
Writing at 0x00000400… (100 %)
Erasing flash…
Writing at 0x00034800… (100 %)
Erasing flash…
Writing at 0x0003ec00… (100 %)
Erasing flash…
Writing at 0x0007ec00… (100 %)

Leaving…

CoolTerm などからUART 経由でログインし、115200 bps で接続すると、以下のようなコマンドの結果が返ってくればOKだと思います。

AT
OK
AT+GMR
AT version:0.21.0.0
SDK version:0.9.5
OK
AT+RST
OK

ets Jan  8 2013,rst cause:4, boot mode:(3,7)
wdt reset
load 0x40100000, len 816, room 16
tail 0
chksum 0x8d
load 0x3ffe8000, len 788, room 8
tail 12
chksum 0xcf
ho 0 tail 12 room 4
load 0x3ffe8314, len 288, room 12
tail 4
chksum 0xcf
csum 0xcf
2nd boot version : 1.2 
  SPI Speed      : 40MHz 
  SPI Mode       : QIO 
  SPI Flash Size : 4Mbit
jump to run user1
rlNÿ
ready

ATコマンドのドキュメントは、SDK のドキュメントの中のPDFにあるか、または、初版はオフィシャルBBSの以下にあります。

at_v0.20_14_11_28
http://bbs.espressif.com/viewtopic.php?f=5&t=64

さて、ESP-12 モジュールはどこまでこのファームウェアを上げれるのでしょうか?今や、技適が通った、ESP-13 や Pin数が増えたESP-12E などがあり、いまいち、違いが見えてきません。SDK 1.2 からは、mesh network ができるようになった模様です。また、patch で SSL もサポートされたようです。
2015/08/08 にリリースされた、SDK には、以下のように2種類のファームウェアがあります。

$ cd esp_iot_sdk_v1.3.0_15_08_08/esp_iot_sdk_v1.3.0/bin
$ tree
.
├── at
│   ├── eagle.flash.bin
│   ├── eagle.irom0text.bin
│   ├── readme.txt
│   ├── user1.1024.new.2.bin
│   └── user2.1024.new.2.bin
├── blank.bin
├── boot_v1.2.bin
├── boot_v1.4(b1).bin
├── esp_init_data_default.bin
└── upgrade

2 directories, 9 files

ReadMe を見ると以下のようです。

download:

boot_v1.2+.bin          0x00000

user1.1024.new.2.bin      0x01000

blank.bin               0x7e000 & 0xfe000

or

eagle.flash.bin        0x00000

eagle.irom0text.bin    0x40000

blank.bin        0x7e000 & 0xfe000

*NOTICE*:

1.If you use Esp Flash Download Tool, please MAKE SURE to choose FLASH SIZE to 8Mbit.

2.UPDATE is not supported in non-boot mode

Update steps

1.Make sure TE(terminal equipment) is in sta or sta+ap mode

ex. AT+CWMODE=3

    OK

    AT+RST

2.Make sure TE got ip address

ex. AT+CWJAP="ssid","12345678"

    OK

    AT+CIFSR

    192.168.1.134

3.Let’s update

ex. AT+CIUPDATE

    +CIPUPDATE:1    found server

    +CIPUPDATE:2    connect server

    +CIPUPDATE:3    got edition

    +CIPUPDATE:4    start start

    OK

note. If there are mistakes in the updating, then break update and print ERROR.

or とあるこの、eagle.*** というのが良くわかりません。これは何者でしょうかね?
とりあえず、このESP-12 は5つあるので全部壊すつもりで、いろいろ試してみるつもりです。技適が通ったタイプも価格がこなれてきたら、遊んでみようかと思います。IoT デバイスのDIY モジュールとしてこれからも活躍しそうですね。

 

さらに情報収集し、このあたりのBlog 記事には、面白いことが書いてありました。

Latest AT Firmware for ESP8266 with 512k Flash _ Kacang Bawang

http://kacangbawang.com/latest-at-firmware-for-esp8266-with-512k-flash/

SDK1.0.1 以降は、バイナリサイズが512kb に収まるには大きすぎるようで、esp-open-sdk で自前でビルドするのがいいよとのこと。そのほかも、いろいろと有益なことや、奇妙な書き込み順を帰ると出来ることなど書いてあります。

 

フラッシュのID というのをesptool でゲットできるそうで、やってみました。GPIO0 を GND に落として、次のコマンドを投げると

$ esptool.py -p /dev/tty.SLAB_USBtoUART flash_id

自分のESP-12 環境では、以下のように出ました。

Connecting…
Manufacturer: ef
Device: 4016

これはどうやら、メーカーコードと使用チップのようです。SPI のフラッシュメモリーで、この例だと、WINBOND のW25Q32 のようです。

http://code.coreboot.org/svn/flashrom/trunk/flashchips.h

/*
* W25X chips are SPI, first byte of device ID is memory type, second
* byte of device ID is related to log(bitsize).
*/
#define WINBOND_NEX_ID        0xEF    /* Winbond (ex Nexcom) serial flashes */
#define WINBOND_NEX_W25X10    0x3011
#define WINBOND_NEX_W25X20    0x3012
#define WINBOND_NEX_W25X40    0x3013
#define WINBOND_NEX_W25X80    0x3014
#define WINBOND_NEX_W25X16    0x3015
#define WINBOND_NEX_W25X32    0x3016
#define WINBOND_NEX_W25X64    0x3017
#define WINBOND_NEX_W25Q40_V    0x4013    /* W25Q40BV; W25Q40BL (2.3-3.6V) */
#define WINBOND_NEX_W25Q80_V    0x4014    /* W25Q80BV */
#define WINBOND_NEX_W25Q16_V    0x4015    /* W25Q16CV; W25Q16DV */
#define WINBOND_NEX_W25Q32_V    0x4016★    /* W25Q32BV; W25Q32FV in SPI mode (default) */

 

このデータシートは、以下のようで、32M-bit / 4M-byte ( 4,194,304 )あるそうですが?512Kbじゃないの?
http://www.marthel.pl/katalog/W25Q80_16_32c.pdf#page=18

うーん、そうだとしたら、うれしい誤算です。ちょっと未確認なので、512Kb ~ 4Mb あるかもというスタンスでこれから意識してみます。

まとめ

・esptool.py か、オフィシャルの書き込みツールを使ってファームをあげる
・書き込みには、GPIO0 をGND に落とす( and RST を GND でもいいようです)
おそらく、ブート時にGPIO0 が GND に落ちていればいいので、タイミングを逃せば、RST でもいいということかと理解。
・書き込みには、高品質な電源で、3.3V を供給するようにすると幸せ(ピーク電流が結構多い)
・ESP-12 では、esp_iot_sdk_v0.9.5_15_01_23 は動作した
・最新のファームウェアは、オフィシャルBBS を見ると詳しい
・自分のデバイスのフラッシュメモリはいくつ? esptool.py  のflash_id で見てみる
・オフィシャルのファームはESP-12 だとどこまで上げれるのか? フラッシュメモリサイズに依存しそうな感じ(未確認)
・esp-open-sdk を使って、自前でファームを作ることが可能
・オフィシャルのファームバージョンsdk_v1.3.0_15_08_08 に2つ組み合わせがあるのはなぜ?

参考

ともの技術メモ tag esp8266
http://tomono.eleho.net/tag/esp8266/

技適OKな中華IoTモジュールを使いこなす _ BRILLIANTSERVICE TECHNICAL BLOG
http://bril-tech.blogspot.jp/2015/07/okiot.html

Arduino と RasPi2 と ESP8266

ここのところ、遊び道具が増えてきて、あれもやりたいこれもありたいと調査していると、結局何も手付かずに終わってしまう不毛な毎日が続いているので、とりあえず、やってみたいことを整理してみます。

 

・ESP8266 の省電力化と、リチウム電池利用した温度湿度照度の単体デバイスの作りこみ

単体ではそこそこ調査は終わっていて、あとは作りこみ。ESP8266(ESP12) + DHT-22(AM2302) + GL5528でセンサー部と、データをWiFi で投げてThingSpeak に投げることまでは完了。残るは、省電力化へのコードの検討、テストと、バッテリー駆動への電力部の作成(というか、パーツ組み合わせるだけ)です。途中で、RasPi2 をゲットしてそっちに気がほうけてしまい手付かずの案件。

2015_05_10_2_14

+

HTB19pQDHXXXXXXyXFXXq6xXFXXX7

+

HTB1NkOvHFXXXXa_aXXXq6xXFXXXt

 

 

・ProMini を活用したモータ制御するロボット(プログラム制御の車とか、リモコン制御のものとか)

極小のギヤモータは、ゲット済みでモータードライバなしでarduino に直結して動作させる予定の案件。基本部分が出来ればあとはセンサー拡張して楽しむ予定の案件

 837293198_862

+gearmoter

・HC-06(Bluetooth) + ProMini で HID USBデバイス

SPPのやつなんですが、HID にできるかもしれないので、一応ゲットしました。だめなら、ちょっと高価なHM-10でやるつもりのもの。まだ、未調査なので、動作確認もしてない放置もの。

a

or

b

・RasPi2(母艦) + Firmata化したarduino との通信

これはつい最近、知ったんですがFirmata という汎用通信規格がやり取りできるよう arduino にスケッチを入れてコントロールはシリアル経由でやるという代物。ソフトウェア実装なので、電子工作が伴う前の基礎技術の研究をしたいなと。コントロールする母艦は、RasPi2 でやるつもりで、実装方法はいろいろあるようです。Python や Ruby や C 、PHP、そしてnode.js とかでも出来るようです。表示やコントロールが伴うものは、HDMI出力があるRasPai からやったほうが良さそうなので、そいういう用途にGUI でラップしたFirmata のアプリケーションを作れないかなと。こちらは、まだ未調査なので、どんな組み合わせがベストなのかは不明。

 

 

このほかにもあれこれと、やりたいことが調べているうちに出てきてしまうんですが、上4つはやりたいですね。今年度中はおそらくこれらで、あそべるはず。特に、ソフトウェア的な組み合わせが出来る、RasPai との連携を考えると、技術が追いつかなさそうなので、ぼちぼと勉強しながらやっていきたいと思っています。

 

さて、とりあえず何からやりますかね。気がノルやつから手をつけていきますか。遊びでは、それが基本スタンスですからね。

ESP12単体で湿度温度照度のIoTデバイス

前回は、Arduino Nano でDHT22の湿度と、温度をゲットしていました。

 

編集後記

その後、リチウム電池と組みあわせ、IoT デバイスを作った記事がこちら
初めてのIoTデバイス完成

image

 

IoTデバイスとしてデータを投げつけたいので、ESP12、単体でコーディングしました。こんな感じで、前回作成したものに、付け加える感じでとりあえずテスト。

写真 1

 

コードは、以下のようにしました。アクセスポイントや、ThingSpeak の書き込みAPI key などはほどよく書き換えてください。

ポイントは、DHT のライブラリを初期化するときの第3のパラメータで、いろいろ試した結果、15だとうまく値が取れるようです。まだ、この値はよくわかっていませんが、CPU Clock に対応する値のようで、Arduino とかは、16Mhz のはデフォルトで、Arduino Due とか 84mhz は、30 にせよとのこと。

 

この値は、以下のコードを見てみると、ESP01 は 11 で動作するようです。

https://learn.adafruit.com/esp8266-temperature-slash-humidity-webserver/code

// Initialize DHT sensor
// NOTE: For working with a faster than ATmega328p 16 MHz Arduino chip, like an ESP8266,
// you need to increase the threshold for cycle counts considered a 1 or 0.
// You can do this by passing a 3rd parameter for this threshold.  It’s a bit
// of fiddling to find the right value, but in general the faster the CPU the
// higher the value.  The default for a 16mhz AVR is a value of 6.  For an
// Arduino Due that runs at 84mhz a value of 30 works.
// This is for the ESP8266 processor on ESP-01
DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266

ESP12 では、11 だと値がおかしくなり、15 だとうまく取れました。あと、IDE は、arduino 1.6.4 以上で今回は Hourly Build  を使いました。Boards Manager という機能が加わり、ツールメニューのボードからインストールできます。

手動で入れてもいいんですが、まぁ便利な機能がつきましたね。

http://arduino.esp8266.com/package_esp8266com_index.json

 

/*
 ESP8266 HTTP get webclient.
 ADC Read (ESP12 + Light(CdS GL5528)) + DHT22(AM2302) 1-Wire
 https://thingspeak.com/channels/42239
 Arduino IDE 1.6.5 Hourly Build 2015/06/12 03:13
 esp8266 by ESP8266 Community version 1.6.4-673-g8cd3697
 JunkHack 2015.06.15
 */
 
#include <ESP8266WiFi.h>
#include <DHT.h>

#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE, 15);

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

const char* host = "184.106.153.149";

int WiFiConLed = 13;// WEB Connect
int WEBconLed = 0; // WiFi Connect

void setup() {
  dht.begin();
  
  pinMode(WiFiConLed, OUTPUT);
  pinMode(WEBconLed, OUTPUT);
  Serial.begin(115200);
  delay(10);
 
  // 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(".");
    digitalWrite(WiFiConLed, HIGH);
    delay(400);
    digitalWrite(WiFiConLed, LOW);
    delay(100);
  }
 
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  
  Serial.println("DHT22 AM2302 test!");
}
 
int value = 0;
int count = 0;
int adc = 0;
float h = 0;
float t = 0;

void loop() {
  delay(10000); // 10 sec
  ++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;
  }
  
  digitalWrite(WEBconLed, HIGH);
  delay(1000);
  count += 1;

  Serial.print("ADC: ");
  adc = analogRead(A0);
  Serial.println(adc);
 
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  if (isnan(h) || isnan(t) ) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
 
  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.println(" *C ");
  
  // We now create a URI for the request
  String url = "/update?key=33HJNSWFZ8EZAXD6&field1=";
  url += adc;
  url += "&field2=";
  url += h;
  url += "&field3=";
  url += t;
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
 
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  delay(10);
 
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
 
  // Close connection
  Serial.println();
  Serial.println("closing connection");
  digitalWrite(WEBconLed, LOW);
}

 

データは、とまっているときもあるかもですが、以下で見れます。

 

https://thingspeak.com/channels/42239

 

2015-06-15 1.19.12

 

部屋の温度がそこそこ高いので、実際に温度計を見てみましたところ、ほぼ適正な値でした。部屋暑すぎ。

写真 2

 

これで、明るさ、温度、湿度が取れました。まだ、GPIO Pin があまっているので、気圧や、雨量、風向、風量など取ろうと思えば可能ですね。また、課題となるのは、電源です。結構シビアに電源品質が問われるようで、ぼろい電源だと途中で止まります。

 

あと、sleep mode にして平常時に、パワーを抑えるように制御する必要があります。

 

まだ、課題はありますね。