見出し画像

【かんすい升製作日誌】モニタリング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へデータを送り、モニタリングします。

画像1

半年ぶりの電子工作ですが、少し装置つくりが上手くなった気がします。
あれこれ悩まず、どんどん先へ進める感じになってきました。

ブレッドボードを用いて、温湿度計もきれいに固定できました。そのブレッドボードをスチレンボードに張り付け、密閉容器にセットしました。

封水はいい加減なのですが、エアコン取り付け工事の人が使っていたこちらのテープが便利です。幅広で低粘着で耐候性にすぐれています。

画像2

画像3

画像4

ときれいにまとめようと思っていましたが、どうもうまくいっていません。

2021-05-06 19_04_38-かんすい升のモニタリング -Ambient

青色のグラフ線、水分%が100%あたりをふらふらしていますし、湿度も温度のミラーのような振れ方で100%を超えてしまうこともあります。らせんさんにアドバイスも頂いていたのに悔しいです。

そして、じっくりと取り掛かろうと思っているうちにGWが終わってしまいました。

#かんすい升 #盆栽 #モニタリング #M5ATOM #温湿度 #水分計 #Ambient

この記事が気に入ったらサポートをしてみませんか?