水耕栽培でPHを定期的に測るのにPHを測定するデジタルPH経を買って使っていましたが、やはり自動的に測って勝手にグラフや数値を表示してくれたほうが楽!
Arduino UNOやESP32でもできそうだったので試しましたがうまくいかず、ということでPHセンサーを買ってラズパイに接続してPHを測定することにしました。
ESP32でできないか?とかラズパイで試したりしましたが、ちょっと正確な値が取得できなさそうだったのでebayで売っているHomelab PHというラズパイやArduinoに接続してPHを計測できるハットを買ってみました。
Homelab PHを買ってみる
Homelab PHのサイト・ebayの販売ページ
こちらがサイト
ebayで販売されています。
こちらを買ってみました。アイソレーターがあるので正確かな?
PHのプローブは別途購入する必要がありました。
プローブはアマゾンでもこういうのがたくさん売っていますので、とりあえずこういうのを使っています。ただ1個目は4ヶ月程度で使えなくなりまして現在2個目のPHプローブ。
水にずっと浸けて置くのは良くないとのことで、自分はずっと液肥に入れっぱなしなのですぐに使えなくなるのかもしれません。
5千円くらいのちゃんとしたやつだと液肥につけっぱなしでも、もっと持つのかもしれません。
Homelab PHをラズパイで使う設定作業
それではラズパイでPHを計測する準備をしていきましょう。
水温計用に1-wireを有効にしてconfig.txtを編集
raspi-configで1-wireを有効にする
$ sudo raspi-config
以下のような画面になる。
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の水温計。
必要なツールをインストール
Apache2
Web表示するのにApache2が必要になるのでインストールします。
$ sudo apt-get install apache2
Homelab
Homelabのサイトからラズパイ用のソースを取ってきてインストールします。
$ 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用の水温計を見つけて選択するのに手間取った。
たさ、まだ温度しか表示ません。
しばらくするとPHも表示sれましたが、エラー表示がでます。
どうやらキャリブレーションしないといけないようです。
キャリブレーションしないと正確なPHが出ないのでやってみます。
Homelab PH キャリブレーション
キャリブレーションにはPHの値になっている校正液が必要です。
PH校正液を用意する
他のPHセンサーに点いていたPH4.0とPH7.0の校正液を持っていたのでこれでキャリブレーションします。
一般的で激安な校正液は粉末タイプで↓このように3個セットのものがアマゾンでも販売されています。
キャリブレーション画面へ
キャリブレーションをやってみましょう。開始するには左上にあるレーダーのようなアイコンをクリックします。
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秒間押し続けます。 ボタンを離すと、ボードのライトが消えます。』
本体の側面↓ボタンがあるのでこちらを2秒長押しします。
キャリブレーション開始
以下の画面になります。キャリブレーションは3通りの方法があるようです。
今回はスタンダードなPH7とPH4を使った2点でキャリブレーションします。
きれいな水を用意してPHプローブを洗浄しておきましょう。
PH7.0校正液
まずはPH7にPHプローブを浸けてPH7.0になるまで待ちます。
PH7.0になったら「GO TO STEP 2」ボタンを押します。
PH4.0校正液
続いてPH4.0の校正液にPHプローブを浸けてPH4.0になるまでしばらく待ちます。
PH4.3~PH4へと少しずつ下がってくるので、ちょうどPH4になったところで「CALIBRATE」ボタンを押しました。
すると以下のように『Calibration completed』の表示が出る。成功のようです。
これでキャリブレーション完了したので、液肥に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を下げる液体を入れてました。
水耕栽培PHダウン剤をたまに入れてます。
|
全体のGrafana環境グラフはこんな感じ↓TDS・ECセンサーはまだ常用していません。プローブつけっぱなしは良くないと書いてあったので・・・日に1回プローブを液肥につけて計測するのを忘れたり面倒だったりするんですよねぇ、
以上で、Homelab PHを設定してPHデータをInfluxDBに飛ばして保存、Grafanaでグラフ表示できるようになりました。
以下失敗メモになります。役に立たない情報が多いので読み飛ばしてください。
PHデータ取得 失敗メモ
ESP32
このページを参考にやってみる
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 こちらも失敗
こちらを参考に、↓
うまくいったと思ったが水や石鹸水に入れても同じ・・・・
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が一番下みたい。これ以上いかない。
2つあったので両方共やってみたが、一つは2.64Vまでしか下がらなかった。
PH3ファイル
以下のようになる・・・
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ファイル
あってるかな?
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
どっちにしろ売ってるやつのほうが良いみたい。
でもエラーになるのでプローブが良くないかもしれない。
コメント