【かんすい升製作日誌】モニタリング3GWが終わります。
【かんすい升製作日誌】モニタリング2では、水分計2からの値の取得に苦労しました。
その後もあれこれ試しましたが、結局、値の取得には成功しませんでした。今思いつくことをひとつずつ確認していきましたが、どれもうまくいきませんでした。
G19,G22でも値は変わらず、pinModeのパラメータを変えてみてもうまく行かず、他のピンも試してみましたが全滅でした。
そもそも、水分計を2つ接続したい理由は、同時に2か所のモニタリングができることで、土壌の違いを比較したり、2つの樹の生長具合を比較しようと考えていたためでですが、これはまた別の機会にいたします。
ということで、かんすい升用のモニタリング装置は、土壌水分量、温度、湿度をモニタリングする装置となりました。
マイコンについては、今回、M5Atom Liteを用いました。M5シリーズでいちばん安いマイコンです。LEDが1つ付いています。
// WLMon2 bbd
#include <M5Atom.h>
#include <Wire.h>
#include <TH02_dev.h>
#include "Ambient.h"
//デモモード(ON:1, OFF:0)
//#define DEMO_MODE 1
#define DEMO_MODE 0
#define P(col, row) (((row) * 5) + (col))
#define RGB(r, g, b) (((g) << 16) + ((r) << 8) + (b))
#define SECONDS(s) ((s) * 1000)
#define MINUTES(m) SECONDS(m * 60)
const int WAIT_TIME = (DEMO_MODE) ? SECONDS(10) : MINUTES(30);
WiFiClient client;
Ambient ambient;
const char * ssid = "ssid";
const char * password = "password";
unsigned int channelId = 0; // AmbientのチャネルID
const char * writeKey = "your writeKey"; // ライトキー
//ピン配置
// ■3V3
//G21□ □G22
//G25□ □G19
// 5V□ □G23
//GND■ ■G33:水分計センサ1
const uint8_t WL_PIN1 = 33; // 水分計センサ
int waterLevel = 0;
float temper = 0.0;
float humidity = 0.0;
float
WlRate(int wl)
{
return ((4096.0 - wl) / 4096.0) * 100.0;
}
void
WlInit(void) {
pinMode(WL_PIN1, INPUT);
}
float
GetWl(void)
{
float val = 0.0;
// pinMode(WL_PIN1, INPUT);
for (int i = 0; i < 3; i++) {
float v = analogRead(WL_PIN1);
//Serial.printf("ML(%d):%8.3f\r\n", i, v);
val += v;
}
return (val / 3);
}
void
SendData(void) {
static int c = 0;
Serial.printf("SendData():\n");
Serial.printf("1:waterLevel:%.2f\n", WlRate(waterLevel));
Serial.printf("2:temper:%.2f\n", temper);
Serial.printf("3:humidity:%.2f\n", humidity);
Serial.printf("4:c:%d\n", c);
ambient.set(1, WlRate(waterLevel));
ambient.set(2, temper);
ambient.set(3, humidity);
ambient.set(4, c++);
ambient.send();
}
//---------------------------------------
void
setup(void) {
Serial.begin(115200);
M5.begin(true, false, true);
WiFi.begin(ssid, password); // Wi-Fi APに接続 ----A
while (WiFi.status() != WL_CONNECTED) { // Wi-Fi AP接続待ち
M5.dis.drawpix(0, RGB(0xf0, 0, 0));
delay(500);
M5.dis.drawpix(0, RGB(0, 0, 0));
delay(500);
Serial.print(".");
}
M5.dis.drawpix(0, RGB(0, 0, 0xf0));
Serial.print("WiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
while (!ambient.begin(channelId, writeKey, &client)) { // チャネルIDとライトキーを指定してAmbientの初期化
M5.dis.drawpix(0, RGB(0xf0, 0, 0));
delay(500);
M5.dis.drawpix(0, RGB(0, 0, 0));
delay(500);
Serial.print("*");
}
M5.dis.drawpix(0, RGB(0, 0, 0xf0));
WlInit();
/* Power up,delay 150ms,until voltage is stable */
delay(150);
/* Reset HP20x_dev */
TH02.begin();
delay(100);
//初期状態のセット
waterLevel = GetWl();
temper = TH02.ReadTemperature();
humidity = TH02.ReadHumidity();
SendData();
}
void
loop(void) {
waterLevel = GetWl();
temper = TH02.ReadTemperature();
humidity = TH02.ReadHumidity();
SendData();
Serial.printf("待機:%d秒\n", WAIT_TIME / 1000);
delay(WAIT_TIME);
}
既知の問題点として、電源投入後、2回に1度はWifiの接続に失敗します。リトライ中はLEDを赤点滅させ、正常に接続すると青点灯します。
定期的にAmbientへデータを送り、モニタリングします。
半年ぶりの電子工作ですが、少し装置つくりが上手くなった気がします。
あれこれ悩まず、どんどん先へ進める感じになってきました。
ブレッドボードを用いて、温湿度計もきれいに固定できました。そのブレッドボードをスチレンボードに張り付け、密閉容器にセットしました。
封水はいい加減なのですが、エアコン取り付け工事の人が使っていたこちらのテープが便利です。幅広で低粘着で耐候性にすぐれています。
ときれいにまとめようと思っていましたが、どうもうまくいっていません。
青色のグラフ線、水分%が100%あたりをふらふらしていますし、湿度も温度のミラーのような振れ方で100%を超えてしまうこともあります。らせんさんにアドバイスも頂いていたのに悔しいです。
そして、じっくりと取り掛かろうと思っているうちにGWが終わってしまいました。
この記事が気に入ったらサポートをしてみませんか?