トドお父さん通信 -38ページ目

トドお父さん通信

北部九州在住 高BMI中高年のオタク趣味の活動記録

みなさん、こんにちは。 トドお父さんです。
家庭菜園の自動水やりシステム、EasyIoTとの連携の説明が3回でも終りませんでしたので、

今回 4回目です。 ながながとお付きあい、有難うございます。

ようやく、ESP8266のプログラムコードの説明に進めますね。 (仕事みたいでつorz)

 

前のブログから、説明が続いてますので併せて見てくださいねー。メラメラ

前回のブログ

[電子工作]Part4 家庭菜園の自動水やりシステムの作成再開!(EasyIoTとの連携 Ⅲ)

 

前々回のブログ、

[電子工作]Part3 家庭菜園の自動水やりシステムの作成再開!(EasyIoTとの連携 Ⅱ)

 

前々々回のブログ、

[電子工作]Part2 家庭菜園の自動水やりシステムの作成再開!(EasyIoTとの連携)

 

また、もとネタのインストラクタブルの下記の記事も併せて参照してくださいね。

ESP8266 Smart Plant Irrigation System

この記事にある、Githubに登録されたコードをベースに私のシステムに合わせて修正しました。

 

プログラムはこのプロジェクト初回の下記レスで説明した、Arduino IDEを使って作りました。

Arduinoの統合環境、使いやすいです。 ESP8266チップでLチカまでできれば確認はOKですよー。

[電子工作]家庭菜園の自動水やりシステムの作成再開!(Part1ESP8266 Wifiチップ)

 

【プログラムの説明】

今回作ったプログラムは本家と同様に、GitHubに登録しました。

GitHubまで使うことになるとは、半年前までは思いもつきませんでしたね。

この年でも、だんだん進化しております、トドお父さん (自画自賛 乙)爆  笑

My ESP8266 Vegitable gardem iIrigation System

 

このプロジェクトのプログラムは、一番上の ESP8266_mqtt_irrigator_Aug09a  というフォルダです。

その下は、前回説明した回路図と部品リスト(BOMリスト)を登録しています。

Readmeは、従来プログラムの先頭にコメントととして入れていた内容を書き込んでいます。

 

 

プログラムは、HTMLでコピーして貼り付けるのでしたね、やってみましょう。

おぅっ、結構、きれいに貼りつけましたね。
<Head> </Head>タグの間に入れるCSSで<Pre> </pre>タグのスタイルを制御できれば、
縦・横の大きさを固定でオーバーする部分はスクロールバーでスクロールできるのですが、ここは
初心者向けのアメブロ、そんな機能はありませんので、プログラムを分割して部分ごとに説明しますね。

1、プログラム 定義部

#include <ESP8266WiFi.h>
#include <MQTT.h>
#include <EEPROM.h>
#define DEBUG

#define AP_SSID     "xxxxxx" 
#define AP_PASSWORD "xxxxxx"

#define EIOTCLOUD_USERNAME "xxxxx"
#define EIOTCLOUD_PASSWORD "xxxxx"

// create MQTT object
#define EIOT_CLOUD_ADDRESS "cloud.iot-playground.com"

#define PIN_PUMP         13   //BUILTIN_LED //D0  // nodemcu built in LED
#define PIN_BUTTON       12    // D3  // nodemcu flash button
#define PIN_HUM_ANALOG   A0  // humidity pin

#define MAX_ANALOG_VAL         925   // 2017.8.10 changed from 956
#define MIN_ANALOG_VAL         225   // 2017.8.10 changed from 250

#define IRRIGATION_TIME        10 // irrigation time in sec
#define IRRIGATION_PAUSE_TIME  300 // irrigation pause time in sec - only for auto irrigator

// irrigator state
typedef enum {
  s_idle             = 0,  // irrigation idle
  s_irrigation_start = 1,  // start irrigation
  s_irrigation       = 2,  // irrigate
  s_irrigation_stop  = 3,  // irrigation stop
} e_state;

まずは、先頭部。

ESP8266内蔵のWifiととEEPROMを制御するライブラリのインクルードです。

MQTTはEasyIoT Cloudとの情報のPublish(データ出力)とSubscribe(データ入力)を制御

するライブラリですね。Adafruutなんかにも、似たようなライブラリがありますが、間違わない

ようにしてくださいね。

 

つづく #define はプログラム内で使用する定数の値の設定になります。

wifi のSSID、パスワード、EasyIot Cloudに登録した皆さんのIDとパスワードを入力します。

#define DEBUG はDEBUG用のSWコントロールで、使用しないときは//でコメントアウトにします。

 

つぎはハード的な設定です。ここは皆さんの環境や好みで変更できます。

#define PIN_PUMP          13   ⇒ ポンプ(水バルブ)の出力ピン IO13
#define PIN_BUTTON       12   ⇒ 手動でポンプON/OFFをするスイッチの入力ピン IO12
#define PIN_HUM_ANALOG   A0  // ESP8266 はアナログ入力が1個しかありません。TOUTピン
               // 0V~1Vが 0~1024変換されます。(3.3Vの場合は分圧)
#define MAX_ANALOG_VAL         925   // 2017.8.10 changed from 956 乾燥センサのMAX値
#define MIN_ANALOG_VAL         225   // 2017.8.10 changed from 250 乾燥センサのMIN値
               // この2つは乾燥センサで実際にテストして決めます。
#define IRRIGATION_TIME        10 // irrigation time in sec ON時にポンプが働く時間  10秒
#define IRRIGATION_PAUSE_TIME  3000 // 自動動作のときにポンプが再開する間隔 50分間

 

つぎのtypedef enum{ 以降は、この基板の動作状態を判断するステートを4種類定義しています。

enum型宣言ということですが、詳しくはググって勉強して下さいね。

 

2、プログラム 定義部 続き

// define ESP8266 parameter
#define CONFIG_START 0
#define CONFIG_VERSION "v01"

struct StoreStruct {
  // This is for mere detection if they are your settings
  char version[4];
  // The variables of your settings
  uint moduleId;  // module id
} storage = {
  CONFIG_VERSION,
  // The default module 0
  0,
};

#define PARAM_HUMIDITY_TRESHOLD   "/Sensor.Parameter1"
#define PARAM_MANUAL_AUTO_MODE    "/Sensor.Parameter2"
#define PARAM_PUMP_ON             "/Sensor.Parameter3"
#define PARAM_HUMIDITY            "/Sensor.Parameter4"
#define MS_IN_SEC  1000 // 1S  
MQTT myMqtt("", EIOT_CLOUD_ADDRESS, 1883);

つぎはEEPROMに収納するパラメータの一群です。

初回に、EasyIoT Cloudと通信して、作成した新規モジュールのパラメータが構造体のなかの

配列に入ります。 2回目以降は読みだすでけですので、デバッグ時はEEPROMを初期化する

必要があります。(自分はeap8266_flasher.exeを使用して、ファームを上書きします)

 

最後のMQTT myMqtt("", EIOT_CLOUD_ADDRESS, 1883); はMQTTライブラリのコンストラクタで

MQTTライブラリ(クラス)のmyMqtt というインスタンスを作成します。(意味不明?すまそです)

 

3、プログラム 定義部 続き

// intvariables
int state;
bool stepOk = false;
int soilHumidityThreshold;
bool autoMode;
String valueStr("");
String topic("");
boolean result;
int lastAnalogReading;
bool autoModeOld;
int soilHumidityThresholdOld;
unsigned long startTime;
int soilHum;
int irrigatorCounter;

プログラムで使う変数の定義です。 変数なのでESP8266のRAMに入ります。

 

4、プログラム 初期化処理 1(変数の初期設定とWif接続)

void setup() {
  state = s_idle;
  pinMode(PIN_PUMP, OUTPUT); 
  pinMode(PIN_BUTTON, INPUT);

  autoMode = false;
  stepOk = false;
  soilHumidityThresholdOld = -1;
  startTime = millis();
  soilHum = -1;
  
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);  
  WiFi.begin(AP_SSID, AP_PASSWORD);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(AP_SSID);
    
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  };

  Serial.println("WiFi connected");
  Serial.println("Connecting to MQTT server");  

  EEPROM.begin(512);
  loadConfig();

初期化で最初の状態を定義します。

enumで定義した4つのステートは 初期ではs_idle アイドル状態

ピンモードでpin13をPIN_PUMP出力に、pin12をPIN_BUTTON入力に設定

自動モード OFF,100mSタイマー、乾燥度 -1、現在時刻=millis();

wifi設定とWifi初期接続、EEPROM初期化までを終了します。

 

5、プログラム 初期化処理2 (MQTTサーバー接続)

  //set client id
  // Generate client name based on MAC address and last 8 bits of microsecond counter
  String clientName;
  //clientName += "esp8266-";
  uint8_t mac[6];
  WiFi.macAddress(mac);
  clientName += macToStr(mac);
  clientName += "-";
  clientName += String(micros() & 0xff, 16);
  myMqtt.setClientId((char*) clientName.c_str());

  Serial.print("MQTT client id:");
  Serial.println(clientName);

  // setup callbacks
  myMqtt.onConnected(myConnectedCb);
  myMqtt.onDisconnected(myDisconnectedCb);
  myMqtt.onPublished(myPublishedCb);
  myMqtt.onData(myDataCb);
  
  //////Serial.println("connect mqtt...");
  myMqtt.setUserPwd(EIOTCLOUD_USERNAME, EIOTCLOUD_PASSWORD);  
  myMqtt.connect();

  delay(500);
  
  Serial.print("ModuleId: ");
  Serial.println(storage.moduleId);

上はMQTTサーバと接続するための一意のClient名を生成しています。

wifiのmacアドレスを文字列に変換して、その末尾にランダムなマイクロ秒値の下位8ビットを

取り出して、16進数に変換した値を文字に変換して最後にnullを入れて終端しています。

生成したClientName文字列がMQTT Client IDとなり、MQTTサーバのClientIDとして

設定します。

その他のMQTTのメンバ関数の設定もここで行っています。

 

MQTTサーバーへの接続の実施

myMqtt.setUserPwd(EIOTCLOUD_USERNAME, EIOTCLOUD_PASSWORD); myMqtt.connect();

myMqtt.connect();

 

なんか、ここまでの説明で力尽きました。

いやー、会社の仕事より疲れましたよ、プログラムの説明。

自分が初心者だから、今のうちに理解しないと、って頑張りすぎたみたいですね。

 

今日、一日で説明が終わりませんでした。

いや~疲れました。プンプン

このへんで、カンベンしてやろう!(勘弁してね!)って捨て台詞で今日は終わりにします。

 

次回 Part6 EasyIoTとの連携Ⅴ でプログラムは完結する予定です。

続きを乞うご期待!

 

それでは、おやすみなさい グッド!

 リレーと土壌センサを接続!

 

みなさん、こんにちは。 トドお父さんです。
先日のEasyIoTとの連携が(ハードの説明が入って)終りませんでしたので、今回 3回目です。

前回説明できなかった、新しいカスタムのModule Typeの作成、うまくいけばESP8266のコードの説明に進みたいと思います。爆  笑

 

前のブログから、説明が続いてますので併せて見てくださいねー。

前回のブログ、

[電子工作]Part3 家庭菜園の自動水やりシステムの作成再開!(EasyIoTとの連携 Ⅱ)

 

前々回のブログ、

[電子工作]Part2 家庭菜園の自動水やりシステムの作成再開!(EasyIoTとの連携)

 

また、もとネタのインストラクタブルの下記の記事も併せて参照してくださいね。

ESP8266 Smart Plant Irrigation System

この説明のステップ2にあるとおり、下のリンクにアクセスして、新しいModule Typeを作ります。

EasyIoT Cloud module configuration

 

その流れにそって説明しますねー。メラメラ

 

前々回のブログでEasuIot Cloudにログインして、画面右下のConfigureをおしたところの画面から

始めますよー。

下のような画面がでますよー。

 

ここで、Module Types をクリックします。

下の画面がでると思います。

 

 

つぎに、下の赤ワクを入力してください。   

New/Edit ModuleType ⇒ ZMT_IRRIGATOR

New/Edit module description ⇒ Irrigator (AO, 2x DO, DI)

最後に Create/update ModuleType をポチっと押して下さい。

 

 

つぎに、新しく作成したモジュールタイプに切り替えます。

下の画面のExisting Module Type の右をクリックしてくださいね。

 

   

つぎに、新しく作成したモジュールタイプに切り替えます。

表示されるモジュールタイプから、今回作成した ZMT_IRRGATORを選択します。

 

 

これで、新しいモジュールタイプができました。

 


次に、この新しいModule TypeのHTMLとJavaScripを編集します。

 

さきほど説明した、下のリンクにアクセスして、HTMLとJavaScriptをコピペします。

 

EasyIoT Cloud module configuration

 

ここまで来たら、再度 Create/update Module Typeをクリックして内容を更新します。

これで、新しいModule Typeが作れました。

 

次にこのモジュールがうまく表示されるか確認をします。

 

 

ここで、Module をクリックします。

下の画面になります。

これは、すでに水やりシステムがEPS8266 で登録されているからですね。

これにもう一つ追加します。 右下の Add Module を押します。

 

 

下の画面がでますので、Module Typeにて今回作成したZMT_IRRIGATORを選択します。

 

 

ここで 中央左下のSave module を押して、次に Back を押して戻って下さいね。

 

あたらしく、水道栓のマークのModule0が登録されているのがわかります。

(画面上にもともとあったModule1は、このさい無視してくださいね)

 

これで、水やりシステム用のModule TypeZMT_ IRRIGATORの作成が完了です。

お疲れさまでした。

 

実際は、一番最初にESP8266のプログラムを起動するときに、プログラムから新規にModule

Parameterの追加が自動的に行われるので、こんかい追加したModuleは余ります。

その時は Delete Moduleを使って消して下さいねー。

 

この辺は次のパート、プログラムの説明の時に、詳しく説明しますね。

やっぱり、残念ながら今回もESP8266のプログラムの説明まで行き着きませんでしたね。

 

さきのInstructablesで公開されているプログラムとの違いは、IOピンの違いのみです。

ポンプ(水バルブ)のON/OFF(LEDのモニタを含む)出力はGPIO13 (IO13) ピンを使います。

ポンプのON/OFFはPC(スマホ)のUI画面だけではなく、ESP8266基板上のタクトSWでも

行うことができます。

このタクトSWの入力には、GPIO12((IO12)ピンを使っています。

 

プログラムは、下のGitHubで公開していますので、参考にしてくださいねー。

todopapa/my_ESP8266_mqtt_irrigator

My ESP8266 Vegitable gardem iIrigation System

 

それでは、次回は自動水やりプログラムの説明を行いますねー。

MQTTのIoTプロジェクトの説明、内容が複雑なだけに結構大変ですね。

本当は、ここまで行き着くのに、かなりの試行錯誤があったんですよー。

 

5月にプロジェクトが再起動してシステムのプロトが動作するまで、うっかり2か月も

かかってしましました。 笑い泣き

進んだのはインストラクタブルズの先の記事が6月末に公開されて、カスタムの

Module Typeの作り方が分かったことが大きいですね。

 

つぎのPart5を乞うご期待 !!

 

それでは、まったねー! グッド!

 スピンオフのWhether Station

 

みなさん、今晩は。トドお父さんです。
先週のEasyIoTとの連携が終りませんでしたので、今回 2回目です。

新しいカスタムのModule Typeの作成、うまくいけばESP8266のコードの説明に進みたいと思います。

 

上の写真は、スピンオフのI2C 極小 OLED( 有機EL ) SSD1306 を使ってウェザーステーションです。

センサーはドイツBOSH製のBME280を使っています。温度と湿度に加えて大気圧も測れます。

いいでしょ!?。ニコニコ

Easy IoTでの表示は今回の水やりシステムと併せて、下の写真のような表示になります。

 

 

話が脱線しました。

今回の説明は、上の蛇口のアイコンの部分 水やりシステムの説明の続きでしたね。
ここのIoTの設定とESP8266でのプログラムについて前回に続けて説明しますね。

 

まずは米Instructables のこの記事を参考にしました。

ESP8266 Smart Plant Irrigation System

 

以下、この翻訳 (google翻訳なのでちょっとおかしい点はご容赦してください)

灌漑(水やり)システムの機能(仕様):

     遠隔操作式ウォータポンプ
     土壌水分が少ない場合は自動灌漑
     自動/手動モード
     土壌水分(値%)およびウォーターポンプ状態表示
     土壌水分履歴値を記録する

灌漑は、WEBユーザーインターフェースでトリガーすることができます。 この場合、ポンプは10秒間始動します。 自動モードを使用することもできます。 この場合、WEBインタフェースでは土壌水分の閾値を設定します。 土壌水分がこの値以下になると、ポンプは10秒間オンになります。 10分後、再び土壌水分をチェックし、必要に応じてポンプをオンにする。

 

という内容です。キョロキョロ

ここではプランターの水やりなので、ポンプをオン/オフしていますが、家庭菜園なので水道栓から

水を引いて、電動バルブのON/OFFをしようと考えています。

ポンプからの水では、水量が全然足りませんからねー。 信号でリレーを動作させればどちらもOKです。

 

回路図は下記になります。

 

① リレーの回路が5Vアースだった場合の回路図(PNPタイプのデジトラを使用)ー>使用せず

 

② リレーの回路がGNDアースだった場合の回路図(PNPタイプのデジトラを使用)ー>今回使用

 

次は部品リストです。 

Q1がDTA114ESAになっていますが、実際はDTC114ESAを使いました。

 

いつものように部品のリンクです。

U1 ESP-WROOM-02 スイッチ・サイエンス ESP-WROOM-02ピッチ変換済みモジュール  ¥909

U2  FTDI_FT232RL  アマゾン FTDI FT232RL 3.3V 5.5V USB to TTL シリアルモジュール ¥245

U3 TA48033S(3.3V_LDO) 秋月電商 低損失三端子レギュレーター 3.3V 1A TA48033S ¥100

Q1 DTC114ESA RoHM  秋月電商  デジタルトランジスタ DTC143ZSATP( 10個入り) ¥100

 (5VGNDの場合は DTA114ESAと①の回路図を使って下さい)

SW1~SW3  タクトSW (緑色、黄色、橙色) 秋月電商  タクトスイッチ(各色)    ¥10(1個)

D1 LED 赤LED なんでもOK

CN1~CN4  ピンヘッダ 適宜

C1~C4  0.1uF x2  セラコン 、 47uFx2 電解コン 6.3V以上であれば、なんでもOK

R1~R10 各数値の抵抗 1/4W以上であればOK

ユニバーサル基板 両面スルホール・ガラス・ユニバーサル基板Aタイプ2.54mmピッチ ¥400

これからは、外部モジュールです。 Ebayで購入。、国内で信頼性あるものを買った方がいいかも?

土壌湿度センサ ebay Soil Humidity Hygrometer Moisture Detection Sensor   JPY112

5Vリレー (1個)  ebay  5V One 1 Channel Relay Module Board Shield For Arduino JPY108

 

インストラクタブルズさんの説明で、回路図はほぼほぼ説明できていると思います。

ただし、リレーのインターフェースで少々てこずりました。

 

回路図を見てもらえば分かりますが、IO13をポンプ(水バルブ)ON/OFFに使っています。

”H”でモニターのLEDが点灯して、ポンプがONなのですが、中華のリレー、論理が逆です。

 

デジトラのDTA114ESAを入れて、論理を逆転したのですが、回路図に書いたリレー側のPCを

駆動する回路が色々あるようです。(GNDアースと5Vアース)

 

今回、GNDアースだったので(回路を下記に示します) NPNのデジトラで駆動しました。

5Vアースの場合は、PNPのデジトラを使って、トランジスタのエミッタを5Vに接続して下さいね。

 

中華製5Vリレー駆動回路の例

 

中華製部品は安くていいんですが、地雷もいっぱいあって結構楽しめます(爆)。爆  笑

ありゃりゃ、ハードの説明ばかりで、ソフトの説明に行きつけませんでした。

 

この続きはPartIII になります。

乞うご期待 プンプン

 

それでは、おやすみなさい。