Arduino(アルドゥイーノ)始めます -4ページ目

ESP-WROOM-02でTwitterに温度と湿度をツイートする

Kです。
マイクロテクニカのESP-WROOM-02のマニュアルにTwitter投稿の作例がありました。

試してみようと思ったのですが、作例ではATモード使用しているようなので
ArduinoIDEのつかえる"電子工作と治具ツールの備忘録"さんの記事を改造してみました。


ハードは前の記事と同じです。
AM2320を使用しています。

StewGate U というサービスを利用するので”使ってみる”から登録します。


トークンが発行されるのでコピーしておきます。



スケッチは下のように改造しました。
"電子工作と治具ツールの備忘録"さんの記事ではボタンを押すと投稿でしたが、
今回は15分に1度投稿するように変更しました。
delayを使用しているので15分ぴったりの間隔ではありません。
floatの湿度値をString(HumValue)としてしまっていますがこれでよいのでしょうか…?
今のところ動いていますがあまり自信がないです。

赤い部分を自分の環境にあわせて変更してください。
-----------------------スケッチ------------------------------

#include "ESP8266WiFi.h"
#include "DHT.h"

#define DHTPIN 4 // what digital pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);

#define KEY_PIN 5

//無線LANルータのIDおよびパスワード
const char* ssid = "XXXXXXXXXXXXX";
const char* password = "XXXXXXXXXXXXX";

const char* host = "stewgate-u.appspot.com";
//http://stewgate-u.appspot.com/より取得したトークン
const char* token = "XXXXXXXXXXXXXXXXXXXXXXX";

void setup() {
Serial.begin(115200);
delay(10);

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());

pinMode(KEY_PIN, INPUT);
}

bool postMsg(String msg)
{
Serial.print("connecting to ");
Serial.println(host);

WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return false;
}

client.println("POST /api/post/ HTTP/1.0");

client.print("Host: ");
client.println(host);

//メッセージ以外の長さ(トークン含む)にメッセージ長を加算
int msgLength = 40;
msgLength += msg.length();
client.print("Content-length:");
client.println(msgLength);
client.println("");

client.print("_t=");
client.print(token);
client.print("&msg=");
client.println(msg);

delay(10);

while(client.available()){
String line = client.readStringUntil('\r');
Serial.print(line);
}

Serial.println();
Serial.println("closing connection");

return true;
}

int value = 0;
void loop() {
unsigned long waitTime = 60000UL*15UL;
delay(waitTime);
String text;
float HumValue = dht.readHumidity();
float TempValue = dht.readTemperature();
text += "現在の温度は:";
text += String(HumValue) + "℃。";
text += "湿度は:";
text += String(TempValue)+ "%です。";

postMsg(text);

}

-------------スケッチここまで-------------

起動して15分待つと、温度湿度が投稿されているはずです。


aitendoのSDシールド

Kです

aitendoという部品屋さんが秋葉原にあります。
秋葉原というより末広町の方、普通のビルの3Fにあるので初めて行くときはグーグルマップ必須です

液晶系の部品を多く扱っており、
格安部品が多いので趣味で使うには面白いお店です。
ただ型番で調べても全く情報や作例がでてこないことが多いので初心者としては使いにくい・・・。


Arduino用SDシールドは秋月でも1750円程度しますが
aitendoでは950円で売っています。
検索してみても情報がみつからなかったのですが、値段につられて購入してみました。


あっさり使用できました。

シールドをArduinoに刺してSDを装着
SDシールド


スケッチの例→SD→ReadWriteをそのまま書き込み。

(このスケッチは
SD内のTEST.TXTというテキストファイルに"testing 1, 2, 3."と書き込み、
その後TEST.TXTを読み出すというスケッチのようです。)

シリアルモニタをみると


書き込み・読み込みが出来ているようです。




SDをPCで見ても正しく書き込めていることが確認できました。
(何回か起動してしまったので3行記録されています)

SDシールドが安く手に入ったので助かりました。

ESP-WROOM-02 + Xivelyでリモート温湿度計を作ろうとしました 4

Kです。前回からの続きです。

Xivelyの設定とスケッチです。


下のURLからXivelyに登録します。
https://personal.xively.com/signup


設定は下のサイトを参考にします。
この夏,チャレンジ!中学生でも開発可能なM2Mシステム Part3 ―― 3G通信モジュールとクラウド・システムの連携[応用編]|Tech Village (テックビレッジ) / CQ出版株式会社

Channel IDはHUMIDITYとTEMPとしました。



xivelyの設定が出来たらスケッチを作成します。

下のサイトからXivelyのライブラリをダウンロードしArduino IDEに登録します。(DHT11の記事を参考にしてください)
xively/xively_arduino · GitHub


スケッチ例→xively_arduino-master→WiFiMultipleDatastreamUploadを変更して、下のようにしました。

--以下スケッチ--
#include "SPI.h"
#include "ESP8266WiFi.h" //ESP8266 lib
#include "HttpClient.h"
#include "Xively.h"
#include "DHT.h"

#define DHTPIN 4 // what digital pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);

char ssid[] = "XXXXXX"; // your network SSID (name) 無線LANのSSIDを入力
char pass[] = "XXXXXX"; // your network password (use for WPA, or use as key for WEP) 無線LANのPASSを入力
int keyIndex = 0; // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

// Your Xively key to let you upload data
char xivelyKey[] = "XXXXXX"; //Xively APIキーを入力 

/*
// Analog pin which we're monitoring (0 and 1 are used by the Ethernet shield)
int sensorPin = 2;
*/


// Define the strings for our datastream IDs
char sensor1Id[] = "HUMIDITY"; //データ1,湿度
char sensor2Id[] = "TEMP";//データ2,温度
XivelyDatastream datastreams[] = {
XivelyDatastream(sensor1Id, strlen(sensor1Id), DATASTREAM_FLOAT), //データ1,湿度
XivelyDatastream(sensor2Id, strlen(sensor2Id), DATASTREAM_FLOAT), //データ2,温度
};
// Finally, wrap the datastreams into a feed
XivelyFeed feed(XXXXXX, datastreams, 2 /* number of datastreams */); //feed番号とデータ数入力。(1)温度と(2)湿度なので2個。

WiFiClient client;
XivelyClient xivelyclient(client);


void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());

// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);

// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);

Serial.println("Starting multiple datastream upload to Xively...");
Serial.println();

// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Connected to wifi");
printWifiStatus();

dht.begin(); // DHT //DHTセンサ 初期化

}

void loop() {
delay(1);
float sensor1Value = dht.readHumidity();
datastreams[0].setFloat(sensor1Value);


float sensor2Value = dht.readTemperature();
datastreams[1].setFloat(sensor2Value);


Serial.println("Read sensor value "); //printlnへ変更した
Serial.println(datastreams[0].getFloat());
Serial.println(datastreams[1].getFloat());

Serial.println("Uploading it to Xively");
int ret = xivelyclient.put(feed, xivelyKey);
Serial.print("xivelyclient.put returned ");
Serial.println(ret);

Serial.println();
delay(15000);
}
--スケッチここまで--

XXXXXXの部分は自分の環境に合わせて設定してください。
無線ルータのSSIDとパスワード、Xively APIとfeedIDです。




GPIO 15,2,0が正しくUART Download Modeに設定されていることを確認し、
リセットボタンを押してからスケッチを書き込みます。

書き込みが完了したらGPIO0をHigh側のジャンパにしておきます。


XivelyのRequest logにPUT feed という文字が流れ始めたら温度と湿度が表示されます。
(ブラウザの更新が必要かもしれません)



シリアルモニタでも動いている様子がわかると思います。

スマホ等からアクセスすれば外から温度湿度が確認できます。

ESP-WROOM-02 + Xivelyでリモート温湿度計を作ろうとしました 3

Kです。前回からの続きです。

・Arduino IDEの設定

下のサイトがわかりやすいです。
技適済み格安高性能Wi-FiモジュールESP8266をArduinoIDEを使ってIoT開発する為の環境準備を10分でやる方法 - Qiita

設定が出来たら、前回組んだUSBシリアルボードを接続して、
ArduinoIDEのツールから以下のように設定します。


*ポート番号はデバイスマネージャのUSB Serial Portにあわせて設定してください。

・書き込み時のジャンパ設定
参考:Arduinoマイコンとしても使える小型WifiモジュールESP-WROOM-02を使ってみる(準備編) | Device Plus - デバプラ


ファーム書き込み時のジャンパ設定は下のとおりです。
GPIO15=Low
GPIO2=High
GPIO0=Low
上の設定をするには下の画像、黒枠と赤枠部にジャンパを装着します。

書き込みし終わった後は赤枠部分のジャンパを紫枠の場所にずらして使用します。


・テストスケッチ
スケッチの例→DHT sensor libraryからDHT testerを開きます。
#define DHTPIN 4に変更してください。

Arduino IDEの検証ボタンを押してコンパイルできることを確認します。

*コンパイル時にエラー"collect2.exe: error: ld returned 1 exit status"が出る場合の参考
Stable version libm.a compilation error · Issue #612 · esp8266/Arduino · GitHub
上のページを参考にして解決できました。
krulkipさんが紹介しているURLからlibm.aをダウンロードし、
C:\Users\ユーザー名\AppData\Roaming\Arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9\xtensa-lx106-elf\lib\lib.m
と差し替えたところ解決しました。(tbzファイルの解凍が必要です。)


ESP-WROOM-02のリセットボタンを押してから、
Arduino IDEの書き込みボタンを押します。
書き込みが終わり、シリアルモニタを開くとAM2320の記事のように温度湿度が表示されているはずです。

ESP-WROOM-02 + Xivelyでリモート温湿度計を作ろうとしました 2

Kです。

前回の記事のリモート温湿度計をブレッドボードで組んでみます。

・使用したハードウェア
 ・マイクロテクニカ ESP-WROOM-02 ブレークアウトボード
  + 2mmピンヘッダ2.54mmピンヘッダ、2pinタクトスイッチを半田付けしています。
   ジャンパピン(2mm)を買い忘れがちです。私は買い忘れて1週間放置するハメに
 ・秋月USBシリアルモジュール
 ・AM2320
 ・低損失三端子レギュレーター 3.3V500mA TA48M033F(S Q


・接続
下のCerevo TechBlogさんの記事を参考にしました。
技適済みWi-Fiモジュール「ESP8266」で始めるIoT入門(ブレイクアウトボード実装編) | Cerevo TechBlog
http://tech-blog.cerevo.com/archives/859/

Cerevoさんはピッチ変換基板も販売しているようです。


マイクロテクニカのブレークアウトボードは上ページのものとピン配列がかなり異なるので注意してください。
Amazonの商品紹介画像のとおりになっています。
下のページが非常にわかりやすく解説しています。
Arduinoマイコンとしても使える小型WifiモジュールESP-WROOM-02を使ってみる(準備編) | Device Plus - デバプラ




Cerevo TechBlogさんのように電源部とシリアル通信TXRXを接続し、
追加でAM2320に電源を供給し、AM2320の1-wire通信をIO4に接続しました。

下の画像のようになります。


モジュールの半田付け部から白い線が出ているのは不要です。
ADCピンを取り出そうとして無理やりつけたものの使用しませんでした。無視してください。
次回はArduino IDEの準備です。

ESP-WROOM-02 + Xivelyでリモート温湿度計を作ろうとしました

Kです。

ESP-WROOM-02というWifiモジュールを使ってみました。
超低価格(単体600円程度)、Arduino IDEでArduinoのように開発ができると話題の製品です。

秋月電子Amazon等で購入できます。

そのままだとブレッドボードに刺さらないので、
Amazonでマイクロテクニカさんの変換基板セットを購入しました。
3pin(ADC)が出ていないので使用したい人はほかメーカーさんの変換基板を使いましょう。


今回は秋月USBシリアルモジュールとAM2302を使用してリモート温湿度計を作成しました。

Xivelyというクラウドサービスを使用するので離れた場所から温度湿度を知ることが出来ます。



Xivelyについては下のページがわかりやすく解説しています。
Garret Labさま Xively
この夏,チャレンジ!中学生でも開発可能なM2Mシステム Part3



ただ作ったのは良いものの、私の接続が悪いのか
・30分に一度程度ESP-WROOMが再起動している?
・AM2320の温度・湿度が読み込めないことがある("nan"と帰ってくる)



上のような問題が出ています・・・
nanででしょう・・・

またXivelyがたまにサーバーエラーでページを開けなかったりします。
Amebaさんなど日本企業もこの手のサービスを開始してくれるといいのですが!

問題がありますが次回以降作り方を乗せていきます。

AM2320をArduinoで使う

Kです。


普段使用している温湿度センサDHT11の上位機種が秋月電子に売られていました。

温湿度センサ モジュール AM2302: センサ一般 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gM-07002/

温湿度センサ モジュール AM2321: センサ一般 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gM-07001/

温湿度センサ モジュール AM2320: センサ一般 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gM-08663/

google検索すると、AM2302,AM2321をArduinoで使用されている方も多いみたいです。
一方AM2320は2015年1月に発売されたばかりのせいか情報が少ないようです。

検索してみるとAM2321のピッチ違いでは?とのこと。
価格も比較的安く(600円)、つかいやすい2.54mmピッチだったので使用できるか試してみました。

接続は1pinに+5V,2pinをArduinoの2pin,3pinをGNDに接続しました。
(GNDの場所がDHT11と違うようです。)

*2015.11.26追記
上のつなぎで動作していましたが
1-Wire方式で使用する場合、4pinをGND(3pin)とつなぐことが推奨されています。
また2pinも5.1kのプルアップ抵抗を入れることが推奨されていました。
(データシート20pより。)


AM2320ピンアサイン(データシートより)

AM2320 ピン



スケッチは
DHT11の回、ステップ3のDHTタイプ選択を下のようにして動かしてみたところ正しく動いていそうでした。

//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)


検索してみると
DHT11とDHT22をArduinoで同時使用している方が居たので、
下の記事を参考にDHT11とAM2320を同時に使用して見ました。
Multiple DHT humidity sensors on Arduino | DIY-SciB.org
http://diy-scib.org/blog/multiple-dht-humidity-sensors-arduino


シリアルモニタの数値をエクセルにコピペしグラフを作ってみると下のようになりました。

AM2320 DHT11 グラフ

ちゃんとほぼ同じ値が出ていますね!

AM2320は応答速度が早く、手をかざすとすぐに湿度の数値が変動します。
DHT11は数値が安定し見やすいのですが、目の前にお茶を置いてもしばらく反応しないので不安になります。

下グラフ、背景の青いあたりで手をかざしました。




AM2320を使ってみると、
・小数点以下の数値も出ること
・応答速度が早いこと
がDHT11に比べて明らかに優れているようでした。
価格差300円の価値はありそうですがどうでしょう。

精度については比較対象もないので、どちらがどの程度優れているのか判断していません…。

LCDシールドとDHT11を組み合わせて温湿度計にする

Kです。

前回の記事で使用したLCDシールドDHT11を組み合わせてみます。

*接続
LCDシールドをArduino UNOを刺した状態でDHT11を接続します。

DHT11の2pinをLCDシールドのD2へ


DHT11の1pin(+5V), 4pin(GND)をLCDシールドの5VとGNDにそれぞれ接続します。


*スケッチ
スケッチはDHT11のサンプルプログラムに下の追加をしました。
・LiquidCrystalライブラリの追加
・DF ROBOT LCDシールド用にLiquidCrystalライブラリのピン設定
・Serial通信時にLCDにも表示するようにスケッチ追加
・ヒートインデックス表示は使わないので削除

--------------------------以下スケッチ-------------------------------------------

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"
#include //LiquidCrystalライブラリを使用する
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //LiquidCrystalライブラリのピンを設定(DF ROBOT DFR0009 V.1.1用)


#define DHTPIN 2 // what digital pin we're connected to (DHT11 を2pinに接続します

// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11を使用時にコメントイン(//を削除)
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
Serial.begin(9600);
lcd.begin(16, 2); //LCD 初期化
lcd.setCursor(0, 0); //LCD 1行目 一番左から表示する準備
Serial.println("DHTxx test!");
lcd.print("DHTxx test!"); //LCDに表示
delay(3000);
dht.begin();
}

void loop() {
// Wait a few seconds between measurements.
delay(2000);

// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);

// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("==!READ ERROR!=="); //LCDに表示(通信エラー時の表示)
return;
}

// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);

Serial.print("Humidity: ");
lcd.clear(); //LCD表示をすべて初期化。温度の桁が代わると表示がおかしくなるので
lcd.setCursor(0, 0); //LCD 1行目 一番左から表示する準備
lcd.print("HUM ="); //LCD表示
Serial.print(h);
lcd.print(h); //LCD表示 湿度
Serial.print(" %\t");
lcd.print(" %"); //LCD表示
Serial.print("Temperature: ");
lcd.setCursor(0, 1); //LCD 2行目 一番左から表示する準備
lcd.print("TEMP="); //LCD表示
Serial.print(t);
lcd.print(t); //LCD表示 温度
Serial.println(" *C ");
lcd.print(" C"); //LCD表示 ℃のかわりにC
}


--------------------------以上スケッチ-------------------------------------------

温度がLCDに表示され、PC無しで温度と湿度が確認できるようになりました。

LCDシールドを使う

今回も書き手が代わります。
Kといいます。よろしくおねがいします。

今回はシールドを使用します。


シールドを使えば、Arduinoにシールドを差し込むだけで部品を接続することが出来ます。
配線ミスする心配もなく便利です。

今回は下のDF ROBOT社のLCDシールドを使用します。

秋月電子で¥1,390で販売されています。
LCD Keypad Shield For Arduino
http://akizukidenshi.com/catalog/g/gM-07029/

メーカーの商品詳細です。
LCD KeyPad Shield For Arduino SKU: DFR0009 - Robot Wiki
http://www.dfrobot.com/wiki/index.php/LCD_KeyPad_Shield_For_Arduino_SKU:_DFR0009


このLCDシールドはArduinoIDEに元々入っているLiquidCrystalライブラリが使用できます。
試しにスケッチ例のAutoScrollを動かしてみましょう。

シールドをArduino UNOに刺します。



スケッチの例からAutoScrollを選択します。



スケッチの下の部分(ピン選択)を変更します。


括弧内は(rs, enable, d4, d5, d6, d7)の接続されているピンへ変更します。

このシールドは下のように接続されているので
RSピン  = Arduino UNO 8ピン
Enableピン= 9
d4ピン  = 4
d5ピン  = 5
d6ピン  = 6
d7ピン  = 7


写真のように変更します
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);



LCDに数字が表示されました!

ライブラリのインストールと温湿度センサDHT11をつかう

今回は書き手が代わります。
このブログを読んでArduinoをはじめたばかりですがよろしくお願いします。

今回はArduinoライブラリのインストール方法を紹介します。
ライブラリを使うと、簡単に電子部品を制御することができます。


例として下の格安温湿度センサー DHT11 を制御してみましょう。

温湿度センサ モジュール DHT11: センサ一般 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gM-07003/


ステップ1:Arduinoとセンサの接続

DHT11のピンについて詳しくはデータシートを見てください。
1.電源(1pin)、2.シリアル通信(2pin)、3.GND(4pin)を画像のように接続しましょう。

DHT11 接続


ステップ2:ライブラリのインストール (IDE 1.6.5)

この部品用のライブラリはAdafruitさんが公開しています。
adafruit/DHT-sensor-library · GitHub
https://github.com/adafruit/DHT-sensor-library
下の画像で赤く囲んだ部分をクリックしてzipファイルをダウンロードしてください。
DHT11ライブラリダウンロード


Arduino IDEを起動し、メニューから[Add .zip library]をクリックします。
Add ZIP Lib

先ほどダウンロードしたzipファイルを選択します。
zip選択


これでライブラリのインストールができます。


ステップ3:スケッチ例の準備

インストール完了後、スケッチ例に[DHTtester]が増えているはずです。
早速使用してみましょう。

スケッチ例


このライブラリではDHT11のほかDHT22,DHT21が使用できるようです。
今回使用するのはDHT11なので
画像のように
#define DHTTYPE DHT11 // DHT 11
をコメントイン、DHT22,DHT21の部分はコメントアウトしましょう。


DHTtester DHT11でつかう

これでスケッチの準備がおわりました。

スケッチをArduinoに書き込んでシリアルモニタを開くと・・・

DHT11 シリアル

2秒に一回、湿度と温度(セ氏,華氏)ヒートインデックスが表示されていきます。



スケッチを見るとdht.readHumidity();で簡単に湿度を表示していますが、
ライブラリがシリアル通信の制御(データシート3ページ以降)を見えないところで行ってくれています。

先人の方が公開してくれているライブラリを使用することで
初心者でも簡単に電子部品を組み合わせることができます。