Front Page                                        '18,06,06 掲載開始

Arduino で IOT  備忘録

このところTVやネットでIOTという言葉を見聞きする機会が増えた。
漠然と、インターネットを経由し離れた機器を制御する事だと知っているが具体的な事は知らなかった。

AmazonでArduinoの周辺部品を探していてOSOYOO社製のArduino IoT スターターキットを見つけた。
Arduino UNOにイーサネットシールド、各種センサー等の周辺部品、解説DVDが入って\4,480-とは廉い。
早速購入し解説DVDのTutorial Lessons に従って勉強を始めた。以下は主に時間を費やした事を記録した。

                          

       注:ブレッドボードは別途購入品、枠は自作でスターターキットには含まれていません。

                                                  目   次

• 準備 1: Arduino UNO と IDE の 動作確認
• 準備 2: Ethernet Shield W5100の動作確認

• Lesson 1: Arduino と Cayenne IOT platform の接続
• Lesson 2: LED の遠隔制御
• Lesson 3: 光抵抗素子の読み取り
• Lesson 4: DHT11による温度湿度測定
• Lesson 5: BMP180による温度と気圧の測定
• Lesson 6: DS18B20による温度の測定
• Lesson 7: サーボモーターの遠隔制御
• Lesson 8: 漏水検出
• Lesson 9: 可燃性ガスの検出
• Lesson 10: 超音波距離検出器
• Lesson 11: 音検出器
• Lesson 12: リレーの遠隔制御
• Lesson 13: 焦電人感センサーの制御

• 応用 1: WiFiによるLEDの制御
• 応用 2: WiFiによる温度と湿度の測定

• 土壌水分センサーの製作

• 準備 1: Arduino UNO と IDE の 動作確認

スターターキットに含まれているArduino UNO (互換品)が正常に動くのか試す為に
基板に組み込まれたLEDを点滅するスケッチを書き込んだ。その結果、正常に点滅した。
これによってArduino IDEの設定(ボードの種類、シリアルポート、書込み装置)が適切だと確認できた。

点滅のスケッチはArduino IDEのスケッチ例に含まれているBlinkを使った。
追加部品無しで動かせるので大変に便利だ。ファイルの所在は下記です。

    ファイル -> スケッチ例 -> 01.Basics ー> Blink

注:この部分はOSOYOO社のTutorial Lessons には無い。

• 準備 2: Ethernet Shield W5100 の動作確認

スターターキットに含まれているEthernet Shield W5100が正常に動くのか試す為に
ルーターへの接続を試みた。その結果、ルーターからIPアドレスを割り付けられた。正常に機能した。

ハードの準備はArduino UNOにEthernet Shield W5100を重ねて差込み、
Ethernet ケーブルでルーターと接続。
シリアル通信のモニター用窓をCtrl + Shift + Mで出す。

スケッチ( プログラム )は「基礎からのIOT入門」に在る「DHCPからのIPアドレス取得」を使わせて頂きました。
それを書き込んで実行した結果が下記です。DHCPから割り付けられたIPアドレスが表示さた。
ルーターへの接続が確認できたのでIOTを勉強する準備ができた。



注:この部分もOSOYOO社のTutorial Lessons には無い。

• Lesson 1: Arduino と Cayenne IOT platform の接続

このレッスンを始めるまでCayenneを知らなかった。
CayennはMyDevice社が提供しているIOT用のサーバーで現時点では無料だ。
その中で使われている部品類をOSOYOO社が纏めたものが本キットだった。
Cayenneの存在を知っただけでもOSOYOOのIOT KITには価値があった

早速Cayenneのユーザー登録を済ませたところCayennが次々と導いてくれた
CayenneのDashboardが表示されたのでAdd new...をクリックした。
次に Device/Wigdet -> MicroController -> Arduino -> Next  -> Arduino Uno の順に選び
Ethernet Shield W5100にチェックを入れてSketchを押すとArduino UnoをCayenneへ接続する為のスケッチが表示された。

これをコピーしArduino IDEの窓に貼り付け、スケッチのコメントに従ってCayenneMQTTを包含させ、
スケッチ内のUSRNAME、PASSWORD、IDをCayenneが割り振った値に修正してコンパイルし、書込み実行した。

その結果、自分のAruduino Uno とCayenneが繋がりCayenneのDashboardへ反映された。
OSOYOO社のTutorial は眺めた程度でLesson 1は完了した。

• Lesson 2:  LED の遠隔制御

OSOYOO社のTutorial に記載された手順で難無く動いた。

パソコンからの操作でLEDは点滅するが、
iPhone用のアプリでは操作できなかった。操作すると瞬時にアプリが閉じてしまう。

6/10にiPhoneのアプリを更新したところ、この問題は解消していた。

• Lesson 3:  光抵抗素子の読み取り

一般的にCDSセルと呼ばれる感光素子の駆動で、その出力はアナログ電圧だ。
ここでは以下の問題が在った。

問題点1: Analogを選べない
Lesson2と同様な手順でSensor -> Luminosity -> Photoresistor と選び詳細な設定窓が現れた。
そのConectivityへAnalogを選ぶようにOSOYOO社のTutorial に記載されていた。
しかしAnalogは選べない。Conectivityを設定する枠にはVirtualしか出ない。
これを設定しないと次の段階へ進めない。

原因を求めてWebを探し回った。丸一日が過ぎた頃にOSOYOO社のTutorial Lessons Web版を見つけた。
そこにはVirtualを選べと書いてあった。

OSOYOO社製のArduino IoT スターターキット同梱されているDVDのTutorial は内容が古い
OSOYOO社の責任ではなく、Cayenne自体が発展途上にあり仕様変更を繰り返しているのだろう。

◎ 問題点2: センサーの端子配列が違う
下の写真で左はOSOYOO社のTutorial に記載されていた写真で、右は自分が撮影した実物の写真だ。
一見すると似ているが、端子の配列が逆だ。注意していなければ電源を逆に掛けるところだった。
  

これ以降はOSOYOO社のTutorial LessonsWeb版のとおりに進んだ。

• Lesson 4:  DHT11による温度湿度測定 ( '18,06,08 追記 )

一個の素子で温度と湿度を同時に測定する複合センサーモジュールで、
ワンワイヤーと呼ばれる信号線が一本だけのディジタルインターフェースだ。
モジュールにAD変換器を内蔵している優れ物だ。

◎ 問題点: センサーの端子配列が逆
下の写真で左はOSOYOO社のTutorial に記載されていた結線図で、端子は左から+ out  ーだ。
右は自分が撮影した実物の写真だ。OSOYOO社の結線図とは端子の配列が逆に並んでいる。
結線図を信じて逆に電圧を掛け、少し熱くなったところで気づいた。幸い破壊には至らずに済んだ。
  

端子配列がTutorial に記載されていたのと同じ物を入手 ( 06/30 追記 )
後日、仕事場のエアコンを遠隔で操作しようと計画した。
それには部屋の温度と湿度を把握する必要が在る為、AmazonからHiletgo社のDHT11を購入した。
下の写真のように端子配列や基板の形など、Tutorial 全く同じ物だった。
しかしAmazonの商品説明に在る写真には、端子配列が逆のもので購入品とは違う物が含まれている!!。


◎DHT11の性能のばらつき測定
AmazonからDHT11を3個纏めて買った。この機会にDHT11の性能のばらつきを調べてみた。
同時に3個を測定するのは結線が面倒なので1個ずつ順に取り付けて試験した。
何れも通電後10分程度で測定値が安定したので、その値を記録した。想像よりも性能が良い
なお部屋の壁に掛けてある安価なアナログの温湿度計は28℃で38%を示していた。

        試料番号        温度        湿度
            #1            28℃        55%
            #2            28℃        57%
            #3            28℃        55%

スケッチ(プログラム)
この部品はCayenneのライブラリーには無いので、下記URLからドライバーをダウンロードして包含させねばならない。
            http://osoyoo.com/driver/DHT.zip

サンプルスケッチは下記にある。
            http://osoyoo.com/driver/cayenne_dht11.txt

下のスケッチはLesson2、3、4を纏めて書いた。センサーに合ったライブラリーを包含させ、
初期設定を行い、ライブラリーの作法に従ってCayenneに読み取らせるだけなので難しくない。
これだけでフラッシュメモリーの87%を占有してしまった。残りは僅かだ。

/*
Example for Lesson2( LED ),Lesson3( CDS ),Lesson4 ( DHT11 )
*/
#include "DHT.h"
#define DHTPIN 2 // what digital pin we're connected to
#define DHTTYPE DHT11 // DHT 11

DHT dht(DHTPIN, DHTTYPE);

#define CAYENNE_PRINT Serial // Comment this out to disable prints and save space
#include <CayenneMQTTEthernet.h>

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[] = "Cayenneが割り付けたユーザー固有の名称";
char password[] = "Cayenneが割り付けたユーザー固有のパスワード";
char clientID[] = "Cayenneが割り付けたコンピュータ固有のID";

#define LED_PIN 3 // Lesson 2: LED
#define CDS_PIN 0 // Lesson 3: CDS

void setup()
{
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT); // Lesson 2: LED
Cayenne.begin(username, password, clientID);
dht.begin(); // Lesson 4: DHT11
}

void loop()
{
Cayenne.loop();
}

CAYENNE_IN(V15) // Lesson 2: VIRTUAL_CHANNEL:15 PIN: 3
{
int value = getValue.asInt();
CAYENNE_LOG("Channel %d, pin %d, value %d", V15, LED_PIN, value);
// Write the value received to the digital pin.
digitalWrite(LED_PIN, value);
}

CAYENNE_OUT(V16) // Lesson 3: VIRTUAL_CHANNEL:2 PIN: 0
{
Cayenne.virtualWrite(V2, analogRead(CDS_PIN));
}

CAYENNE_OUT(V0) // Lesson 4: VIRTUAL_CHANNEL:0 PIN: 2
{
Cayenne.virtualWrite(V0, dht.readTemperature());
}

CAYENNE_OUT(V1) // Lesson 4: VIRTUAL_CHANNEL:1 PIN: 2
{
Cayenne.virtualWrite(V1, dht.readHumidity());
}


CayenneのDashboard
下の図のようにした。左端の丸いボタンをクリックするとLEDの点滅が反転する。
343はCDSの出力で部屋が明るいと数値が小さくなる。照度ではないようだ。
29.0は室温で実際の温度より2℃ほど高い。56.0は部屋の湿度だ。

Cayenneの使い方は試行錯誤を繰り返している最中で詳しく判らない。



• Lesson 5:  BMP180による温度と気圧の測定 ( '18,06,10 追記 )

一個の素子で温度と大気圧を同時に測定する複合センサーモジュールで、
I2Cと呼ばれる信号線が2本のディジタルインターフェースだ。
これまたモジュールにAD変換器を内蔵している優れ物だ。OSOYOO社の結線図に間違いは見つからなかった。

スケッチ(プログラム)
スケッチはLesson2、3、4の要所に下記のスケッチを追記した。
これもまたセンサーに合ったライブラリーを包含させ、初期設定を行い、
ライブラリーの作法に従ってCayenneに読み取らせるだけなので難しくない。

これまでのスケッチでフラッシュメモリーの97%を占有してしまった。
これ以上にセンサーを追加するのは難しい。

/*
Example for Lesson2( LED ),Lesson3( CDS ),Lesson4 ( DHT11 ),Lesson5 ( BMP085 )
*/

#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;

void setup()
{
bmp.begin();
}

CAYENNE_OUT(V5) // Lesson 4: VIRTUAL_CHANNEL:5 PIN: A4( SDA ),A5( SCL )
{
Cayenne.virtualWrite(V5, bmp.readTemperature());
}

CAYENNE_OUT(V6) // Lesson 4: VIRTUAL_CHANNEL:6 PIN: A4( SDA ),A5( SCL )
{
Cayenne.virtualWrite(V6, bmp.readPressure() * 0.01);
}


CayenneのDashboard
Lesson4迄のデバイスに温度と気圧を加えた。
BMP180の示す温度はDHT11に比べて2℃程度低いようだが、BMP180の方が体感に近い。


• Lesson 6:  DS18B20による温度の測定 ( '18,06,18 追記 )

Lesson 5迄でArduino Unoのメモリーを97%も使ってしまったので、これ以上にセンサーを追加出来ない。
既に取り付けたセンサーを外せば済むのだが、一寸惜しい気がしたので新たにArduino Unoイーサネットシールドを購入した。
両方ともkeyestudio製だ。安価だが品質が良く気に入った。


DS18B20はワンワイヤーと呼ばれる信号線が一本だけのインターフェースだ。モジュールにAD変換器を内蔵している。
DS18B20はCayenneに登録されているのでCayenneのDashboardからAdd new...をクリックした。
次に Device/Wigdet -> Sensors -> Temperature -> の順に選ぶと各種の温度センサーが表示される。
DS18B20をクリックするとCayenneへ接続する為の設定を行う窓群が表示された。

Channelを17に設定しStep 1:Sketch Fileをクリックすると下記のスケッチが表示された。
ユーザー固有の名前やパスワード、ID等も書き込んであり凄く親切だ。
これをArduino IDEへ貼り付けコメントに従いライブラリーを包含の後にコンパイルして書き込み動いた。

/*
Cayenne DS18B20 Example

This sketch shows how to send DS18B20 Sensor data to the Cayenne Dashboard.

The CayenneMQTT Library is required to run this sketch. If you have not already done so you can install it from the Arduino IDE Library Manager.

Steps:
1. Install the OneWire library (http://www.pjrc.com/teensy/td_libs_OneWire.html) from the Arduino Library Manager.
2. Install the DallasTemperature library (http://milesburton.com/Main_Page?title=Dallas_Temperature_Control_Library#Code.2FLibrary) from the Arduino Library Manager.
3. Attach a DS18B20 to a digital pin on your Arduino.
Schematic:
[Ground] -- [DS18B20] -- [4.7k resistor] -- [5V]
|______________|
|
Digital Pin
4. Set the SENSOR_PIN value below to the pin number you used when connecting the sensor.
5. Set the VIRTUAL_CHANNEL value below to a free virtual channel (or the virtual channel of a DS18B20 Sensor widget you have added) in the Dashboard.
6. Set the Cayenne authentication info to match the authentication info from the Dashboard.
7. Compile and upload this sketch.
8. Once the Arduino connects to the Dashboard it should automatically create a temporary display widget (or update the DS18B20 Sensor widget you have added) with data.
To make a temporary widget permanent click the plus sign on the widget.
*/

#define CAYENNE_PRINT Serial // Comment this out to disable prints and save space
#include <OneWire.h>
#include <DallasTemperature.h>
#include <CayenneMQTTEthernet.h>

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[] = "*************************************";
char password[] = "****************************************";
char clientID[] = "**************************************";

#define SENSOR_PIN 2 // Do not use digital pins 0 or 1 since those conflict with the use of Serial.
#define VIRTUAL_CHANNEL 17

OneWire oneWire(SENSOR_PIN);
DallasTemperature sensors(&oneWire);

void setup()
{
Serial.begin(9600);
Cayenne.begin(username, password, clientID);
sensors.begin();
}

void loop()
{
Cayenne.loop();
}

// This function is called at intervals to send sensor data to Cayenne.
CAYENNE_OUT(VIRTUAL_CHANNEL)
{
// Send the command to get temperatures.
sensors.requestTemperatures();
// This command writes the temperature in Celsius to the Virtual Channel.
Cayenne.celsiusWrite(VIRTUAL_CHANNEL, sensors.getTempCByIndex(0));
// To send the temperature in Fahrenheit use the corresponding code below.
//Cayenne.fahrenheitWrite(VIRTUAL_CHANNEL, sensors.getTempFByIndex(0));
}


上記のスケッチのコメントには、DS18B20から出る信号線を4.7KΩでPull upせよと書いてある。
OSOYOOのTutorial にはPull up抵抗が無い。そこで両方を試したところ両方とも正しく動いた。

DS18B20にはPull up抵抗が必要だ。
OSOYOOのTutorial ではArduino Unoに内蔵されたPull up抵抗で済ませているようだ。
DS18B20の仕様にはPull up抵抗は4.7KΩと記載されている。
Arduino Unoに内蔵された30KΩ程度でも動くが、ノイズ耐力が低下する筈だ。

Cayenneの表示は下図の様だ。iPhoneでも同様の画面だった。
左端には登録されているマイクロコントローラーのリストが表示されている。
今回、Arduino Unoを追加したので合計3台になった。
下側の2台は連続通電して信頼性の評価を行っている。


OSOYOOのTutorialでは、
Lesson 6の末尾に沢山のセンサーを使用したCayenneのダッシュボードが示されている。
しかしArduino UNOのメモリー容量では、そんなに多くのセンサーをプログラムできない。
たぶん他種のメモリー容量が大きいマイクロコントローラの例を使い回したと思われるが、
実際と違う絵を表示するのは感心しない。

• Lesson 7:  サーボモーターの遠隔制御 ( '18,06,20 追記 )

これまでOSOYOO社のTutorial Lessons Web版を見ながら勉強してきた。
ところがLesson 7の記述は不可解だった。何を学習させようとしているのか判らない。
登録済みのArduinoにサーボモーターを追加するだけで良い筈なのに
新たにマイクロコントローラを登録させるなど不必要な操作を要求している様に見える。

そこでキットに添付されたDVD版のLesson 7を見てみると全く違う内容で合理的に見えた。
それに従って進めると簡単にサーボモーターが動いた。

下のスケッチはCayenneが示した物を丸写しにした。
しかし内容はDVDのLesson 7に在る説明と内容が違った。Cayenneは日々進歩しているのだろう。

/*
Cayenne Servo Motor Example

This sketch sample file shows how to connect a Servo Motor with CayenneMQTT Library.

The CayenneMQTT Library is required to run this sketch. If you have not already done so you can install it from the Arduino IDE Library Manager.

Steps:
1. Install the Servo library from the Arduino Library Manager.
2. In the Cayenne Dashboard add a new Servo Motor widget.
3. Select a virtual channel number for the widget.
4. Set min value to 0 and max value to 1.
5. Set the VIRTUAL_CHANNEL value below to the virtual channel you selected.
6. Connect the Servo's legs to GND, VCC (5.0), and a digital pin.
7. Set the ACTUATOR_PIN value below to the digital pin number you selected.
8. Set the Cayenne authentication info to match the authentication info from the Dashboard.
9. Compile and upload this sketch.
10. Once the Arduino connects to the Dashboard you can use the slider to change the servo position.
*/

#define CAYENNE_PRINT Serial // Comment this out to disable prints and save space
#include <CayenneMQTTEthernet.h>
#include <Servo.h>

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[] = "**************************************";
char password[] = "****************************************";
char clientID[] = "**************************************";

#define VIRTUAL_CHANNEL V1
#define ACTUATOR_PIN 4

Servo s1;

void setup()
{
Serial.begin(9600);
Cayenne.begin(username, password, clientID);
s1.attach(ACTUATOR_PIN);
}

void loop()
{
Cayenne.loop();
}

// This function is called when data is sent from Cayenne.
CAYENNE_IN(VIRTUAL_CHANNEL)
{
// Determine angle to set the servo.
int position = getValue.asDouble() * 180;
// Move the servo to the specified position.
s1.write(position);
}


Cayenneの表示は下図の様だ。
スライドバーの丸をマウスで移動するとサーボが音を出して動く。チョット面白い。
左の温度センサーはArduinoへ繋いであるが、駆動ソフトを削ったので動いていない。



• Lesson 8:  漏水検出 ( '18,06,21 追記 )

珍しくTutorial Lessons Web版の記載内容に従って何も変えずに動いた。
Cayenneの表示は下図の様だ。Tutorial Lessonsの図とは少し違う。


Lesson 8 Web版の日本語での表題は『スマートホーム 水位警告』となっているが、
英語では『Smart Home Water Leak Alert』になっていた。
直訳すれば漏水警報だが、Lesson 8では警報の機能は設定されていないので、
漏水検出が実態に沿った日本語での表現だ。

それに水位は測れない。このセンサーは電極間の電気抵抗を測定するのだが、
水に含まれる塩類の濃度によって同じ水位でも電気抵抗が変わるからだ。
水の有無は検知できるので漏水検出は出来る。

• Lesson 9:  可燃性ガスの検出 ( '18,07,09 追記 )

Tutorial Lessons Web版では表題が『スマートホーム 煙検知器』となっている。
しかし、ここで使われたセンサーは可燃性ガスを検出する。つまりガス漏れ警報機だ。煙は検知できない筈だが?


スケッチはTutorial Lessons Web版に記載の方法で動いた。
Arduino Unoのアナログ入力ピンを使うのでセンサーなのでLesson 3の光センサーと殆ど同じだ。

動作の確認は使い捨てライターのガスで行った。使い捨てライターの着火ボタンを押して着火し、
ボタンを押したままで火を吹き消して火口から出る可燃性ガスをセンサーへ近づけて測定値をCayenneで読んだ。

その結果、通常の表示は250前後で可燃性ガスを吹き付けた状態では500付近まで上昇した。
使い捨てライターのガスはブタンの筈だが、正常に検出できた。

この可燃性ガスセンサーには端子に記号が無い。正しく電源を加えると電源のパイロットLEDが点灯した。
また動作表示LEDも備えられている。ガスを吹き付けると点灯した。

• Lesson 10:  超音波距離検出器 ( '18,07,12 追記 )

概ねTutorial Lessons Web版の記載は正しいが、実際とは手順が違う。
Tutorial Lessons Web版では、先ずCayenneへSensorを登録し、次にスケッチを書き込めとの指示だ。
しかしArduino Unoへ駆動スケッチを書き込む前にCayenneへSensorの登録は出来ない
Sensorの登録はArduinoからVirtual Chanellの信号が送られて来ないとAdd Sensorボタンが有効にならないからだ。

手順1:超音波センサーへの配線
Tutorial Lessons Web版の通りで間違いは無かった。


手順2:スケッチの書込み
Cayenneには超音波距離センサーは登録されていないのでCayenneからスケッチ例は得られない。
 そこでスケッチはGitHubからコピーした。勿論固有の名前、パスワード、IDは自分用に修正した。
これを書き込んで実行したが動きが安定しない。メインループに50msものDelayを入れているのも感心しない。
そこで下記スケッチのようにタイマー割込みを使った。
また測定誤差を軽減するために移動平均フィルタも組み込んだ。

/*
HC-SR04 Ping distance sensor:
VCC to arduino 5v
GND to arduino GND
Echo to Arduino pin 7
Trig to Arduino pin 8
*/

#include <CayenneMQTTEthernet.h>
#include <MsTimer2.h>

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[] = "*************************************";
char password[] = "**************************************";
char clientID[] = "*************************************";

#define VIRTUAL_CHANNEL 18
#define echoPin 7
#define trigPin 8
int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed

long duration, distance, average; // Duration used to calculate distance
long filter[] = {0,0,0,0};

void Distance_measurement() { // Interrupt processing
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

digitalWrite(trigPin, HIGH);
delayMicroseconds(10);

digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);

// Moving average filter
filter[3] = filter[2];
filter[2] = filter[1];
filter[1] = filter[0];
filter[0] = duration;
average = ( filter[0] + filter[1] + filter[2] + filter[3] ) / 4;

// Calculate the distance (in cm) based on the speed of sound.
distance = average / 58.2;
}

void setup()
{
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Cayenne.begin(username, password, clientID);

MsTimer2::set(50, Distance_measurement); // Interrupt time setting 50 ms.
MsTimer2::start();

}

void loop()
{
Cayenne.loop();
}


// This function is called at intervals to send sensor data to Cayenne.
CAYENNE_OUT(VIRTUAL_CHANNEL)
 {
Cayenne.virtualWrite(VIRTUAL_CHANNEL, distance);
}


◎手順3:CayenneへSensorを登録

Tutorial Lessons Web版のCayenneへSensor登録図はMicrocontrollerを登録する際の物と間違えているようだ。
自分は下の図のように設定しAdd Sensorボタンを押して登録した。



下図のように距離センサーが登録されたが、表示は0.00のままで変化しなかった。
同じ画面をiPhoneで見ると60cmと示していた。Cayenneに問題が在りそうだ。


Dashboardの上部に在るDataをクリックするとCayenneが受信したデータが表示された
その表の右端にValueがある。正しく59cm付近を記録している。
Arduinoのスケッチは正しく働いている。



◎動作の確認
センサーの前方に箱を置き、その間の距離と計測値を記録した。室温は28℃だった。
 
       距離  [cm]            計測値  [cm]       誤差  [cm]  
            10                         10                            0
            20                         20                            0
            30                         29                           -1
            40                         39                           -1
            50                         49                           -1
            60                         59                           -1
            70                         69                           -1
            80                         78                           -2
            90                         89                           -1
            100                       98                           -2
   

• Lesson 11:  音検出器 ( '18,07,17 追記 )

Tutorial Lessons Web版では『ホームセキュリティ 音声検知器』となっているが、
音声を識別するような高度な物ではない。マイクで音を拾い設定値よりも大きかったら1、
小さかったら0と判別するだけの単純な機能だ。


しかし、そのサンプル スケッチのコメントには『汎用デジタル入力例』となっている。
各種のON-OFF信号を入力する例だ。ON-OFF信号の入力は音声検知器よりも実用性の高い機能だ。

スケッチはTutorial Lessons Web版で紹介された『サンプルコード』のピンの割付だけを変えて動いた。
サンプルでは4番ピンを使う事になっているが、4番では動かなかった。
3番で試しても5番でも動いたが何故か4番はダメだった。理由は分からない。

また、このサンプルコードにはピンの方向定義が無い。無くても動いている。
未定義は入力と扱われるのか? スケッチは動いたが謎が多い。

• Lesson 12:  リレーの遠隔制御 ( '18,07,18 追記 )

日本語では継電器と呼ばれる部品の駆動だ。結線は写真の様に動作用のLEDを省略した。
基板上にモニター用LEDが在るし動作音が出るので不要と考えた。


Cayenneへリレーを登録する過程でスケッチが示される。それで動いたがON-OFFが逆だった。
Tutorial Lessons Web版が指示するように修正して正常になった。

このスケッチでもLesson 3と同様に4番ピンを使っている。こちらではピンの方向定義を行っている。
試しに入力方向に定義したところ、当たり前だが動かなくなった。4番ピンには謎がある。

• Lesson 13:  焦電人感センサーの制御 ( '18,07,19 追記 )

動物が出す赤外線を検知するセンサーだ。人や獣の侵入を検出するのに使われる。
Tutorial Lessons Web版が指示する結線の通りで動いた。


スケッチもTutorial Lessons Web版が示すサンプルの通りで動いた。
勿論固有の名前、パスワード、IDは自分用に修正した。

このLessonsでは、
センサーやアクチュエーターの駆動は過去のLessonと類似だが、
過去のLessonには無いCayenneの重要な機能が使われている。
人感センサーが人や獣を検出した場合に対応動作を行える

例えば予め設定されたアドレスへメールを送信したり、
自分が登録している他のArduinoのActuatorsを動かしたりできる。

自分は他のArduinoに接続したLEDを点灯させて見たが、再現性が低かった。
もう少し研究せなばならない。

• 応用 1: WiFiによるLEDの制御 ( '18,08,01 追記 )

Ethernet でCayenneへ接続するのは電線の引き回しが面倒で不便だ。
趣味の一つに家庭菜園が在る。ビニールトンネルの温度測定や水の管理等をCayenneでと考えている。
そこでWiFiでの接続を試した。

AmazonでArduinonに使えるWiFiシールドを探していてWeMos D1を見つけた。
Arduino用シールドではなくArduino IDE環境でプログラムできるWiFi付のマイクロコントローラーだ。
しかもArduinonよりも処理が速く、メモリー容量も大きい。その上に廉価だ。

そのWeMos D1にLEDを取り付けてLesson 2と同じ動作をさせた。


WeMos D1のUSB-シリアル変換ICはオリジナルのArduinoとは違う。
自分が使っているWindows7ではドライバーを読み込まねばArduino IDEが動かなかった。
Windows10では最初から組み込まれているそうだが、使っていないので確認できていない。

Arduino IDEの設定は下記URLに従って行った。
https://www.instructables.com/id/Programming-the-WeMos-Using-Arduino-SoftwareIDE/

スケッチは下のように書いた。

// This example connects to Cayenne by WiFi and drives the LED.
// The microcontroller used is WeMos D1.

#include <CayenneMQTTESP8266.h>

// WiFi network info.
char ssid[] = "*************";
char wifiPassword[] = "************";

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[] = "********************************";
char password[] = "************************************";
char clientID[] = "***********************************";

//#define VIRTUAL_CHANNEL 3
#define LED_PIN 4 // Do not use digital pins 0 or 1 since those conflict with the use of Serial.

void setup() {
pinMode(LED_PIN, OUTPUT);
Cayenne.begin(username, password, clientID, ssid, wifiPassword);
}

void loop() {
Cayenne.loop();
}


// This function is called when data is sent from Cayenne.
CAYENNE_IN(V3)
{
int value = getValue.asInt();
// Write the value received to the digital pin.
digitalWrite(LED_PIN, value);
}

WeMos D1を使う上で注意する点は、基板表面に印刷してある入出力ポート側のピンの名称だ。
殆ど出鱈目で正しいのはLEDを繋いだピン4だけだ。他は裏側に記載してある名称が正しい。

Arduino Uno とWeMos D1を2台ずつ一ヶ月連続で動かした。
その間にArduino Uno は2台とも1回ずつ通信途絶が起こった。
リセットボタンを押して通信は再開したが原因は判らない。
ところがWeMos D1では2台共に一回も通信途絶は起こらなかった。信頼性が高いようだ。

• 応用 2: WiFiによる温度と湿度の測定 ( '18,08,06 追記 )

接続するセンサーはLesson 4と同じだが、LEDの遠隔制御も一緒に組み込んだ。
LEDはピン4へ、DHT 11はピン5に接続した。

DHT11へ供給する電源は、WeMos D1に合わせて3Vを使用した。

写真のブレッドボード付シールドはアマゾンから入手した。
青いArduino保護枠はThingiverseからデーターを頂き印刷した。

スケッチは下のように書いた。これで動いた。

// This example shows how to connect to Cayenne using an WeMos D1 and send/receive sample data.
#include "DHT.h"

#define LED_PIN 4
#define DHTPIN 5 // what digital pin we're connected to
#define DHTTYPE DHT11 // DHT 11

DHT dht(DHTPIN, DHTTYPE);

#include <CayenneMQTTESP8266.h>

// WiFi network info.
char ssid[] = "************";
char wifiPassword[] = "*************";

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[] = "***********************************";
char password[] = "***************************************";
char clientID[] = "*************************************";


void setup() {
    pinMode(LED_PIN, OUTPUT);
    Cayenne.begin(username, password, clientID, ssid, wifiPassword);
    dht.begin();
}

void loop() {
    Cayenne.loop();
}

// This function is called when data is sent from Cayenne.
CAYENNE_IN(V3) // VIRTUAL_CHANNEL 3
{
    int value = getValue.asInt();
    digitalWrite(LED_PIN, value);
}

CAYENNE_OUT(V0) // Lesson 4: VIRTUAL_CHANNEL:0
{
    Cayenne.virtualWrite(V0, dht.readTemperature());
}

CAYENNE_OUT(V1) // Lesson 4: VIRTUAL_CHANNEL:1
{
    Cayenne.virtualWrite(V1, dht.readHumidity());
}

スケッチは動きいたのだが、稀にデーターが欠落する。
下の表で中断付近に2箇所のnanが在る。原因を究明中だが分からない。
DHT11からデータを読む段階では正常なのでノイズの影響では無い。
異常はCayenneMQTTESP8266.hで発生するようだ。Bugかもしれない。



家とは少し離れた作業場にWeMos D1を置いて温度を測ったのが下のグラフだ。
このところ作業はしていないのでエアコンは使っていない。
昼間は暑く夜間は気温が下がる様子が記録されていた。
8月に入ってから日中も夜間も温度が上がっているのが一目瞭然だ。


WeMos D1とCayenneによって従前では面倒だった測定が簡単になった。
IOTは素晴らしい。

◎データー欠落の対策
データーが時折欠落する問題を解消すべく、時間を掛けて試行錯誤を繰り返した。
その結果、下のリストの様にsetupに Serial.begin(9600); を追加するだけで解消した。しかし理由は全く判らない。

void setup() {
    Serial.begin(9600);
    pinMode(LED_PIN, OUTPUT);
    Cayenne.begin(username, password, clientID, ssid, wifiPassword);
    dht.begin();
}

Serial.begin(9600); はデバグの際にArduino IDEのターミナルへの表示を可能にする命令だ。
必要無いので削った事が仇になった。

不思議なことに #define CAYENNE_PRINT Serial の宣言をしなくともエラーにならなかった。
問題は解消したが疑問が残った。

• 土壌水分センサーの製作 ( '19,06,05 )

自宅から少し離れた所で野菜を作っている。そこへ週に2日程出向き世話をしている。
その為に毎日水遣りが出来ず枯らしてしまう事がしばしばある。
この水遣りをIOTで自動化しようと考えた。

先ず土壌の乾き具合を把握するのが先決だと考え土壌水分センサーを作った。

電極棒の太さは4mm、金属が露出している電極部の長さは47mm。
黒い熱収縮チューブを被せた部分は長さ20mm。
電極棒の中心から中心迄の間隔は15mm、全体の長さは110mmだ。 

電極棒には直径4mm、長さ100mmのステンレス製釘を使った。
下の写真には#8*100と書いてあるが、#8の意味は不明だ。
直径8mmではなく4mmだ。若しかすると頭の部分の直径かもしれない。


ステンレスには普通の半田が使えない。世の中にはステンレス用半田が存在するが、手元に無い。
仕方なく直径1mmの錫メッキ銅線を捲きつけ強く捩って半田付け用端子を作った。
この部分は長期的な使用では接触不良を起こすかもしれない。その場合にはステンレス用半田を買おう。


電極棒を保持するボディは3D-CADで設計し3Dプリンターで印刷した。
ボディの直径は細い部分が25mm、太い部分は30mm、長さは42mmだ。
材料は弾力性が在り吸湿性の少ないABSを使った。下の写真は2台分だ。


電極棒はボディの穴へ押し込んだだけで充分に固定された。
3D-CADでは穴の直径を4mmで設計したが、印刷されたボディの穴は僅かに狭かったようだ。
これを4mmのドリルで整形したが、ABSの弾力性の為か4mmよりも小さいようだ。
釘の直径を実測すると3.93mmだったが、いい具合の固さでボディへ収まった。

この後、電線を半田付けしてから接続を覆う部分にホットボンドを使って防水処理をした。
これで雨が降る屋外でも問題なく使える筈だ。

完成した土壌水分センサーを評価するために団地の花壇で実験した。
花壇は朝の水遣りを済ませた後のようで水溜りは無いが、見た目で判るほどしめっていた。
3箇所にセンサーを刺して測定したところ3.078kΩ、4.701kΩ、6.026kΩだった。


花壇には花がない場所もある。そこは水遣りされてない様子だったので試した。
ここ数日は雨が降っていないので湿度は40%だったが、植物が枯れる程には乾燥していない。
2箇所にセンサーを刺して測定したところ18.117kΩ、12.229kΩだった。


水分の量によって電気抵抗が桁違いに変化するのが判った。
これならば自動水遣りの水分センサーとして使えそうだが、
安定性や再現性は未知数だ。

気になったのは水分センサーを刺す場所によって測定値が違う事だ。
ここの土は細かな土と粒状に固まった土が混じっている。
その為に電極棒との接触面積が変わる為ではないかと考えている。