ラズパイで水槽の液肥 PH測定 Homelab PHを使う

PH 校正液 栽培ガジェット

水耕栽培でPHを定期的に測るのにPHを測定するデジタルPH経を買って使っていましたが、やはり自動的に測って勝手にグラフや数値を表示してくれたほうが楽!

Arduino UNOやESP32でもできそうだったので試しましたがうまくいかず、ということでPHセンサーを買ってラズパイに接続してPHを測定することにしました。

BeslandsデジタルPH計 pHメーター 0.00-14.00pH 自動校正

BeslandsデジタルPH計 pHメーター 0.00-14.00pH 自動校正

2,000円前後

ESP32でできないか?とかラズパイで試したりしましたが、ちょっと正確な値が取得できなさそうだったのでebayで売っているHomelab PHというラズパイやArduinoに接続してPHを計測できるハットを買ってみました。

Homelab PHを買ってみる

Homelab PHのサイト・ebayの販売ページ

こちらがサイト

HomeLab-pH

ebayで販売されています。

pH meter to monitor aquariums & hydroponics using Raspberry Pi, Arduino, ESP8266

pH meter to monitor aquariums & hydroponics using Raspberry Pi, Arduino, ESP8266

 

こちらを買ってみました。アイソレーターがあるので正確かな?

PHのプローブは別途購入する必要がありました。

プローブはアマゾンでもこういうのがたくさん売っていますので、とりあえずこういうのを使っています。ただ1個目は4ヶ月程度で使えなくなりまして現在2個目のPHプローブ。

水にずっと浸けて置くのは良くないとのことで、自分はずっと液肥に入れっぱなしなのですぐに使えなくなるのかもしれません。

zmart pH計 交換電極 BNC ペーハー メーター モニター

zmart pH計 交換電極 BNC ペーハー メーター モニター

5千円くらいのちゃんとしたやつだと液肥につけっぱなしでも、もっと持つのかもしれません。

Homelab PHをラズパイで使う設定作業

それではラズパイでPHを計測する準備をしていきましょう。

水温計用に1-wireを有効にしてconfig.txtを編集

raspi-configで1-wireを有効にする

$ sudo raspi-config

以下のような画面になる。

水耕栽培 水温 ラズパイ 設定

5 Interfacing Options

水耕栽培 水温 ラズパイ 設定

P7 1-Wire

水耕栽培 水温 ラズパイ 設定

「はい」を選ぶ

config.txtを編集

黄色のケーブルをGPIO4にしました。

$ sudo vim /boot/config.txt
dtoverlay=w1-gpio,pullup=on,gpiopin=4 #変更する
$ sudo reboot

動くかどうかテストしてみる

設定完了したのでテストします。以下、デバイスが無い場合。

$ cd /sys/bus/w1/devices/
$ ls -al
total 0
drwxr-xr-x 2 root root 0 Nov 19 13:50 .
drwxr-xr-x 4 root root 0 Feb 14  2019 ..
lrwxrwxrwx 1 root root 0 Nov 19 13:54 28-011437996daa -> ../../../devices/w1_bus_master1/28-011437996daa
lrwxrwxrwx 1 root root 0 Nov 19 13:54 28-011437ef5daa -> ../../../devices/w1_bus_master1/28-011437ef5daa
lrwxrwxrwx 1 root root 0 Nov 19 13:54 28-01143805afaa -> ../../../devices/w1_bus_master1/28-01143805afaa
lrwxrwxrwx 1 root root 0 Nov 19 13:54 28-0114380e63aa -> ../../../devices/w1_bus_master1/28-0114380e63aa
lrwxrwxrwx 1 root root 0 Nov 19 13:54 28-01143836b3aa -> ../../../devices/w1_bus_master1/28-01143836b3aa
lrwxrwxrwx 1 root root 0 Nov 19 13:50 28-01143fab4caa -> ../../../devices/w1_bus_master1/28-01143fab4caa
lrwxrwxrwx 1 root root 0 Nov 19 13:50 28-02131af2c8aa -> ../../../devices/w1_bus_master1/28-02131af2c8aa
lrwxrwxrwx 1 root root 0 Nov 19 13:50 w1_bus_master1 -> ../../../devices/w1_bus_master1

たくさんのセンサーが認識されているのは以下のページで作業したds18b20センサーの水温計が6個ほど表示されています。残る1個がHomelab PHの水温計。

ラズパイ+ds18b20センサーで6つの栽培容器の水温計測・グラフ化
水耕栽培なので夏になると栽培容器の水温が心配、水温が上昇して30度を超えてしまうと、野菜が枯れてしまいそうなので各栽培容器の水温を測ることにしました。栽培容器は現在15個くらいありますが、とりあえずセンサーを6個つけてそのうち1個は一番...

必要なツールをインストール

Apache2

Web表示するのにApache2が必要になるのでインストールします。

$ sudo apt-get install apache2

Homelab

Homelabのサイトからラズパイ用のソースを取ってきてインストールします。

Software for HomeLab-pH
$ cd script
$ mkdir ph
$ cd ph
$ wget http://homelab.link/downloads/hl_install_181126B_BETA.tar.gz
$ tar xzvf hl_install_181126B_BETA.tar.gz
$ sudo bash homelab_install.sh

これでインストールは完了。

Homelab PHのページにアクセスしてみる

とりあえずhttp://192.168.31.53:7223(ラズパイからアクセスの場合はhttp://localhost:7223)にアクセスしてみると、以下のように表示されました。

水温計が7個もあるので、Homelab PH用の水温計を見つけて選択するのに手間取った。

homelab_install.sh

たさ、まだ温度しか表示ません。

温度

しばらくするとPHも表示sれましたが、エラー表示がでます。

どうやらキャリブレーションしないといけないようです。

校正が必要

キャリブレーションしないと正確なPHが出ないのでやってみます。

Homelab PH キャリブレーション

 キャリブレーションにはPHの値になっている校正液が必要です。

PH校正液を用意する

他のPHセンサーに点いていたPH4.0とPH7.0の校正液を持っていたのでこれでキャリブレーションします。

PH 校正液

一般的で激安な校正液は粉末タイプで↓このように3個セットのものがアマゾンでも販売されています。

Nynelly PH緩衝剤 PHテスター校正点 測定校正粉末 5パック 4.00

Nynelly PH緩衝剤 PHテスター校正点 測定校正粉末 5パック 4.00

キャリブレーション画面へ

キャリブレーションをやってみましょう。開始するには左上にあるレーダーのようなアイコンをクリックします。

PH 校正液

Homelab PH本体のボタンを2秒長押し

以下のようにキャリブレーションを開始するには本体のボタンを2秒長押ししてください。と書いてあるので、押してみます。

To enter the calibration mode press and hold for 2 seconds the button on the board. The board light should be off when button is released.

通訳するとこのようになりました。→『校正モードに入るには、ボード上のボタンを2秒間押し続けます。 ボタンを離すと、ボードのライトが消えます。』

PH 校正液

本体の側面↓ボタンがあるのでこちらを2秒長押しします。

PH キャリブレーション

キャリブレーション開始

以下の画面になります。キャリブレーションは3通りの方法があるようです。

今回はスタンダードなPH7とPH4を使った2点でキャリブレーションします。

PH キャリブレーション

きれいな水を用意してPHプローブを洗浄しておきましょう。

PH7.0校正液

まずはPH7にPHプローブを浸けてPH7.0になるまで待ちます。

PH キャリブレーション

PH7.0になったら「GO TO STEP 2」ボタンを押します。

PH4.0校正液

続いてPH4.0の校正液にPHプローブを浸けてPH4.0になるまでしばらく待ちます。

PH キャリブレーション

PH4.3~PH4へと少しずつ下がってくるので、ちょうどPH4になったところで「CALIBRATE」ボタンを押しました。

すると以下のように『Calibration completed』の表示が出る。成功のようです。

PH キャリブレーション

これでキャリブレーション完了したので、液肥にPHプローブを入れておけば常時PH値を計測してくれます。

他のラズパイでキャリブレーションも可能

うまくキャリブレーション出来ない場合は他のラズパイでやって、ファイルをコピーする方法もある。他のラズパイで同じようにApache2やHomelabのソースをインストールしてキャリブレーションすると以下のディレクトリにキャリブレーションデータが保存されているのでこれをメインのラズパイにコピーする。

/var/www/homelab/cgi-bin/data

  • t_sensor_id:28-01143fab4caaなどのセンサー固有のIDが書かれている
  • ccalib_data:キャリブレーションしたデータ。これをコピーする。
  • calib_user_id:1557816527.787554842などのID。これもコピーする。

ccalib_data・calib_user_idの2つのファイルをDLしたあと/home/piにアップロードする。

$ sudo chmod 644 ccalib_data calib_user_id
$ sudo chown www-data.www-data ccalib_data calib_user_id
$ sudo mv ccalib_data calib_user_id /var/www/homelab/cgi-bin/data/

このように所定の場所にパーミッションやオーナーを変更してファイルを移動したらキャリブレーション警告が出なくなりました。

shファイルを作ってInfluxDBにインサート・Grafana表示

最終的にInfluxDBに計測したPHのデータを保存して、Grafanaでグラフ表示させたいので、ph.shファイルを作ってCronで定期的に実行させていきます。

get_pH.shを改造してInfluxDBにインサート

すでにHomelab PHにあるスクリプトget_pH.shを少し改造してInfluxDBに上げるスクリプトを作っていきます。

まずはph.shにコピー

$ cp /home/pi/script/script/ph/site/cgi-bin/get-pH.sh /home/pi/script/ph.sh

ph.sh

writeOutput関数の中のcurlの部分を追加したのみです。

function writeOutput {
	[ "${#errorStrings}" -gt "0" ] && jsonError='"errorStrings":'$errorStrings'],'
	case $ouputFormat in
		json )
			echo '{"taskStatus":"'$taskStatus'",'$jsonError'"time":'$time',"v":'$v',"t":'$t',"pH":'$pH',"calibID":"'$calibID'","calibDate":"'$calibDate'"}'
			;;
		console )
			echo "taskStatus=$taskStatus"
			[ "${#errorStrings}" -gt "0" ] && echo "errorStrings=$errorStrings"
			echo "time=$time"
			echo "v=$v"
			echo "t=$t"
			echo "pH=$pH"
			echo "calibID=$calibID"
			echo "calibDate=$calibDate"

			curl -i -XPOST "http://localhost:8086/write?db=sensor&u=root&p=xxxxxx" --data-binary "ph,place=homelab,host=raspi3B+ ph=$pH,phtemp=$t,phvol=$v"

			;;
		file )
			str="time=$time\nv=$v\nt=$t\npH=$pH\ncalibID='$calibID'\ncalibDate='$calibDate'"
			if [ "$t" == "skipped" ]; then t=false; fi
			if [ "$pH" == "skipped" ]; then pH=false; fi
			#jsonStr='{"taskStatus":"'$taskStatus'",'$jsonError'"time":'$time',"v":'$v',"t":'$t',"pH":'$pH',"calibID":"'$calibID'","calibDate":"'$calibDate'"}'
			jsonStr='{"taskStatus":"'$taskStatus'",'$jsonError'"time":'$time',"v":'$v',"t":'$t',"pH":'$pH'}' # skips the calibration data - shorter string for unassisted measurements file
			str="$str\njsonStr='$jsonStr'\n"
			printf "$str" > $1 # writes data to file $1
			if [ "$?" -ne 0 ]; then exit 2; fi
			;;
	esac
}

通常は、シェル画面にPH値や温度を表示するだけですが、そのデータをInfluxDBに投げるようにcurlで命令しただけになります。

curl -i -XPOST "http://localhost:8086/write?db=sensor&u=root&p=xxxxx" --data-binary "ph,place=homelab,host=raspi3B+ ph=$pH,phtemp=$t,phvol=$v"

これを以下のようにApacheのcgi-binの中で実行できるようにシンボリックリンクで置きました。

$ sudo ln -s /home/pi/script/ph.sh /var/www/homelab/cgi-bin/ph.sh

Cronで3分おきに実行

以下のようにrootユーザーになってCronを編集モードでph.shを定期的に実行するように追加します。

$ sudo crontab -e
2-57/3 * * * * /usr/bin/sudo /bin/bash /var/www/homelab/cgi-bin/ph.sh

保存したデータをGrafanaで表示

データベースのInfluxDBに保存したPHデータをGrafanaで表示させてみました。

以下のように毎日結構な数値が移り変わります。急激にPHが下がったのは水槽を洗って新しい液肥を入れたとき。だいたいPH7前後になっています。7.5以上になったときは、液肥を追加するかPHを下げる液体を入れてました。

Homelab PH

水耕栽培PHダウン剤をたまに入れてます。


 

全体のGrafana環境グラフはこんな感じ↓TDS・ECセンサーはまだ常用していません。プローブつけっぱなしは良くないと書いてあったので・・・日に1回プローブを液肥につけて計測するのを忘れたり面倒だったりするんですよねぇ、

Homelab PH

以上で、Homelab PHを設定してPHデータをInfluxDBに飛ばして保存、Grafanaでグラフ表示できるようになりました。

 

 

以下失敗メモになります。役に立たない情報が多いので読み飛ばしてください。

PHデータ取得 失敗メモ

ESP32

このページを参考にやってみる

Redirecting...

6ピン、上から順に

  • TO : 温度出力
  • DO : 3.3V
  • PO – PH analog output ==> Arduino A0
  • Gnd – Gnd for PH probe (can come from Arduino GND pin) ==> Arduino GND
  • Gnd  – Gnd for board (can also come from Arduino GND pin) ==> Arduino GND
  • VCC – 5V DC (can come from Arduino 5V pin) ==> Arduino 5V pin
    POT 1 – Analog reading offset (Nearest to BNC connector)
    POT 2 – PH limit setting

オフセット調整

上側のネジを反時計回りにめいいっぱい回した。最初は4.7Vくらいでめいいっぱいで2.629Vくらいまでしか調整できなかった。

const int analogInPin = 34; 
int sensorValue = 0; 
unsigned long int avgValue; 
float b;
int buf[10],temp;
void setup() {
 Serial.begin(9600);
}
 
void loop() {
 for(int i=0;i<10;i++) 
 { 
  buf[i]=analogRead(analogInPin);
  delay(10);
 }
 for(int i=0;i<9;i++)
 {
  for(int j=i+1;j<10;j++)
  {
   if(buf[i]>buf[j])
   {
    temp=buf[i];
    buf[i]=buf[j];
    buf[j]=temp;
   }
  }
 }
 avgValue=0;
 for(int i=2;i<8;i++)
 avgValue+=buf[i];
 float pHVol=(float)avgValue*5.0/1024/6;
 float phValue = -5.70 * pHVol + 21.34;
 Serial.print("sensor = ");
 Serial.println(phValue);
 
 delay(20);
}

こういう?数値が出る。

sensor = -74.41
sensor = -74.27
sensor = -74.58
sensor = -74.25
sensor = -74.30
sensor = -74.52

ArduinoのやつなのでESP32ではうまくいかない?みたい。

ESP32 こちらも失敗

こちらを参考に、↓

i want to map analog pins on 5volt between 0 to 1023 (10 bit resolution) - Page 4 - ESP32 Forum
Espressif ESP32 Official Forum

うまくいったと思ったが水や石鹸水に入れても同じ・・・・

long sum;
float average, voltage, pHValue, Offset=10.5 - 7;

void setup()
{
  Serial.begin(115200);
}
void loop()
{
  for (int i=0 ; i<100 ; i++)
  {
    sum = sum + analogRead(34);   // Input pin 34, 12 bits
    delay(10);
  }
  average =sum/100;
  sum=0;
  voltage = average*0.000817 + 0.15;
  pHValue = 3.5*voltage - Offset;
  Serial.printf("V= %4.2f   pH= %4.2f \n", voltage, pHValue);
}

3V(2.5Vまで下がらなかった)でPH7に合わせて水・石鹸水をやってもこのような表示。

V= 2.97   pH= 6.89 
V= 2.97   pH= 6.90 
V= 2.97   pH= 6.91 
V= 2.97   pH= 6.89 
V= 2.97   pH= 6.89 
V= 2.97   pH= 6.90 

Arduino Nano互換機 PH測定できず失敗

古いけど・・・Arduino Nano互換機買った。ケーブルが旧タイプのMiniUSB・・・

Arduino IDE 1.8.8で書き込めない・・・

Arduino:1.8.8 (Windows 10), ボード:"Arduino/Genuino Uno"

ビルドオプションが変更されました。全体をリビルドしています。
最大32256バイトのフラッシュメモリのうち、スケッチが2858バイト(8%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が192バイト(9%)を使っていて、ローカル変数で1856バイト使うことができます。
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x52
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x52
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x52
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x52
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x52
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x52
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x52
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x52
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x52
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x52
マイコンボードに書き込もうとしましたが、エラーが発生しました。
このページを参考にしてください。
ERROR: The request could not be satisfied
「ファイル」メニューの「環境設定」から 「より詳細な情報を表示する:コンパイル」を有効にすると より詳しい情報が表示されます。

このようなエラーが出る。

別バージョン Arduino IDE 1.0.5-r2

Arduino IDE 1.0.5-r2のZipをダウンロードして解凍してからEXEを起動して接続してみた。

書けたけど、プロープが壊れてる?

Arduino UNO 買ったけどPH測定できず失敗

600円くらいでヤフオクでMicroUSBのが売ってたので買った。

オフセット 調整 2.5Vにする

このスクリプトでやる

void setup() {
 // initialize serial communication at 9600 bits per second:
 Serial.begin(9600);
}

// the loop routine runs over and over showing the voltage on A0
void loop() {
 // read the input on analog pin 0:
 int sensorValue = analogRead(A0);
 // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
 float voltage = sensorValue * (5.0 / 1023.0);
 // print out the value you read:
 Serial.println(voltage);
 delay(300);
}

左回りにめいいっぱいやっても2.64しかいかなかった;・・・2.5Vにはできない(泣)

PHプローブの接続と校正 キャリブレーション

左の左側を反時計回りにして2.5Vにする。2.56Vが一番下みたい。これ以上いかない。

Redirecting...

2つあったので両方共やってみたが、一つは2.64Vまでしか下がらなかった。

PH3ファイル

Redirecting...

以下のようになる・・・

sensor = -14.91
sensor = -14.93
sensor = -14.93
sensor = -14.91
sensor = -14.90
sensor = -14.92
sensor = -14.92
sensor = -14.92

PHファイル

arduinoでpHメーター(動作確認編) - くま出没注意
ある目的でpHメーターをarduinoで作りたいと思った。まずは、材料調達。...

あってるかな?

535
535
535
535

PH2ファイル

このような数値になる・・・

V=0.42 pH=-2.04
V=0.37 pH=-2.20
V=0.35 pH=-2.29
V=0.33 pH=-2.34
V=0.32 pH=-2.36
V=0.32 pH=-2.37

どっちにしろ売ってるやつのほうが良いみたい。

でもエラーになるのでプローブが良くないかもしれない。

コメント

タイトルとURLをコピーしました