【IoTとPython実践!】構造設計者がラズパイで水質測定プログラミングに挑戦!

本サイト、記事にはプロモーションを含む場合があります。

IoT/Web/プログラミング
スポンサーリンク
  • 構造設計者でも気軽にプログラミングに挑戦したい!
  • 本に載っているLEDのLチカ以外の実践をやってみたいけどやり方がわからない。。。
  • 自分でセンサを使ってIoTを作ってみたい!

IoTがブームになっており、いたるところでプログラミング人気がでています。特に簡単にIoT・プログラミングが実践ができるラズパイは人気。しかし、ラズパイ用の書籍はどれも初心者がメインでメインで脱初心者を目指すヒトにとっては少し簡単すぎるところがあります。

当ブログの管理人
  • 構造設計:3D CAD、UX、コストダウンなど様々な内容にたずさわり、12年になる。
  • 資格:2016年に電気工事士2種合格。他に簿記やQC検定など合格率20~30%の資格合格に実績アリ。
  • 投資:インデックス投資・FX・仮想通貨・高配当株を少額から実施。利益額は小さいが確実にプラスになっている。今はインデックス投資・高配当株を中心にFX自動売買も実践中。
Ruizi54
(たっちん)

この記事では、水質センサとPythonを使ってIoTの簡単システムの方法を解説していきます。この記事を読むことで、初心者向け書籍には書かれていないラズパイとセンサを使ったIoT・プログラミングに触れるそことができます。そして、ラズパイのさらなる使い方がわかるはずです。

書籍やネット情報だけではたどり着けない内容まで掲載しています。脱初心者をはかるには自分で考える必要がありますが、その手助けになればと思っています。

※すべて合っているとは限らないので、ソースコードをコピーする場合は自己責任でお願いします。

スポンサーリンク

今回使用する準備物(Python含む)

今回使用するモノは次の通りです。プログラミング言語は「Python」を使っています。

  • ラズパイ
  • 水質センサ
  • 配線
  • 汎用電動機制御基板
  • キーボード
  • マウス
  • microSDカード

それぞれの準備物について詳しく説明していきます。

ラズパイ

初心者の方にオススメキットを選びました。ポイントしては次の通りです。

  • OSがプリインストール。
  • CPUなどに放熱フィンがある。
  • ON/OFF付電源アダプタ付である。
  • モニタ用の専用ケーブルがついている。

自分で選定やOSインストールする必要がないので、キットをオススメします。

そもそもラズパイは何か?を解説します。

ラズパイとは、、、

イギリスのラズベリーパイ財団が提供する教育用コンピュータです。価格が比較的安いのにも関わらず色々な処理を行わせることができます。

ラズパイも今やバージョン4まできています。バージョン4以外にもZEROという小型サイズも販売されており、用途によって使い分けができます。

よく目にするラズパイを表にして比較しました。

型式写真特徴CPUメモリUSBネットワークBluetooth映像出力GPIOピンサイズ電源参考価格
(スイッチサイエンス)
ラズパイ4
Model B
処理速度がとにかく早い
熱対策必要
重い処理に最適
4コア
1.5GHz
1GB
2GB
4GB
8GB
USB2.0 × 2
USB3.0 × 2
有線/無線(2.4GHz/5Ghz)micro HDMI ポート × 285 x 56 x 17 mm5V
3A
USB C ポート
1GB:ー
2GB:7,150円
4GB:8,580円
8GB:11,440円
ラズパイ3A+少し外径が小さい
熱はほどほど
処理も速度もほどほど
4コア
1.4GHz
512MBUSB2.0 × 1有線/無線(2.4GHz/5Ghz) HDMI ポート × 165 x 56 x 12 mm5V
2.5A
micro USB ポート
3,795円
ラズパイ3B+熱はほどほど
処理も速度もほどほど
4コア
1.4GHz
1GBUSB2.0 × 4有線/無線(2.4GHz)HDMI ポート × 185 x 57 x 17 mm5V
2.5A
micro USB ポート
6,435円
ラズパイ3B熱はほどほど
処理も速度もほどほど
4コア
1.2GHz
1GBUSB2.0 × 4有線/無線(2.4GHz)HDMI ポート × 185 x 57 x 17 mm5V
2.5A
micro USB ポート
6,435円
Zero/
Zero W/
Zero WH
とにかく小さい
簡単な処理向き
1コア
1.0GHz
512MBmicroUSB × 1Zero:無/
Zero W:無/
Zero WH:アリ
Zero:無/
Zero W:アリ/
Zero WH:アリ
mini HDMI × 1Zero:無/
Zero W:無/
Zero WH:アリ
Zero:
65 x 30 x 5 mm/
Zero W:
65 x 30 x 5 mm/
Zero WH:
65 x 30 x 9 mm
5V
1.2A
micro USB ポート
Zero:715円/
Zero W:1,430円/
Zero WH:2,145円
Ruizi54(たっちん)
Ruizi54(たっちん)

画像処理やサーバーなど、重い処理をしていきたいので、迷わずラズパイ4を購入したよ!

あと、サイズの小ささからラズパイ Zero WHも購入しましたが、快適さから言えば断然だ図パイ4です。ラズパイ Zero WHは、ネットにつなごうとしてもつながらない状況なので。。。

Python

Pythonとは、1991年にオランダのグイド・ヴァン・ロッサムが開発した言語です。読みやすく、かつ効率がよいコードをできる限り簡単に書けるように目指された言語であり、次の特徴があります。

  • いくつも手法を用意せず、方法が1つだけ。
  • シンプルで比較的に覚えることが少ない。
  • 1行で多くの処理を記述できる。
  • 標準ライブラリが豊富。
  • Python向けの応用モジュールも豊富。
  • AI、機械学習に取り組みやすい。
  • Webへのアクセスなどがしやすい。
Ruizi54(たっちん)
Ruizi54(たっちん)

比較的、プログラミングを直感的に読むことができるので、Pythonはプログラミングに触れていない方にもオススメだよ。実際に使って、C言語よりやりやすいと思うよ。

ITエンジニアが2021に学びたいプログラミング言語の第1位に挙げているのがPython。現在、かなり注目を浴びているプログラミング言語です。

順位言語割合
1位Python32.8%
2位Java9.3%
3位JavaScript5.9%
4位C5.7%
5位VC・VC++5.4%
6位C++4.8%
7位C# .NET4.5%
8位Ruby4.3%
9位Swift2.0%
10位COBOL1.8%
10位PHP1.8%
10位VB1.8%
11位以降その他19.9%
出典:ITエンジニアが 2021年に学びたい(強化したい)プログラミング言語ランキング

AIや機械学習をやっていくうえで、欠かせないプログラミング言語となっているPython。シンプルがコードなので、初心者でも比較的触りやすいのが特徴です。プログラミングを全く触っていない機械設計者には大変オススメできるプログラミング言語です。

配線

配線については、初心者がすぐにプログラミングができるセットを購入すれば問題はありません。初めから筐体を作ってそこにラズパイを入れるといった高難易度のようなことはしないので、簡単に組立ができるようにしてもらえれば問題ありません。

「KeeYees 電子工作キット 初心者向け スターターキット」 は、センサはついていませんが、配線が豊富です。延長できる配線もあるので重宝します。

水質センサ

水質センサには様々な手法が存在します。

pH:水素イオン濃度
pHは、水の水素イオン濃度を示す数値です。計算式としては、「pH=-Log10[H+]」で示します。pHでわかることは、ある数値で「酸性」・「中性」・「アルカリ性」が判断できます。
酸性は、0<pH<7。
中性は、pH=7。
アルカリ性は、7<pH<14。
ORP:酸素還元電位
酸化力と還元力の差を電位差で示した数値。この数値がプラスなら酸化力が高く、マイナスなら還元力が高い。一般的に酸化力が高いと人や細菌には毒といわれている。強力な酸化剤はよく除菌剤として売られているのがその証拠。あとは、酸化というと鉄のサビなども引き起こすので、酸化は腐食や老化を引き起こすものだと思ってもらえばわかりやすい。一方で、還元は酸素を離す行為であり、このORPが低い水は酸化作用が低い体に優しい水と言える。
DO:溶存酸素
水に溶け込んでいる酸素の量を示す。この値は温度・塩分濃度・気圧によって変動します。水に住む生物は水に溶け込んでいる酸素を消費して生活してますので、水に住む生物の生きやすさの一つの指標として用いられる。生物が生きるのに必要なDO値は3mg/lと言われいる。また河川などの悪臭にも使われているようで、DO値が2mg/l未満になると悪臭を感じるという。
EC:電気伝導率
水中の電気の通りやすさを示します。純粋は電気を通しませんが、水中の電解質が多いほど電気が通りやくなり、EC値が上がります。例としては排水に溶けている窒素などが多いほどEC値は高くなる。また、水草の養分を測定する場合に用いられる。
TDS:総溶解固形物
物質が水にどの程度溶け込んでいるかを示す。数値が低いほど不純物は少ないと言われている。もう少し詳しく説明すると水に溶けている無機塩類(カルシウムやマグネシウムなど)と有機物の濃度の総合計の濃度のことである。ただし、ミネラルウォーターには、カルシウムやマグネシウムなどといったミネラルがとえこんでいるので、単純な不純物(水が汚れているかどか)測定には使えないが、安価なセンサがたくさんあり、自分でIoTをするには使いやすい。
一般的にミネラルウォーターで60~70ppm、水道水で100~160ppmと言われている。
水の硬度(ミネラルなど)を測定する場合に用いられる。
ちなみに水道水の濃度が高いのは、水道水の場合は浄水のために塩素が配合されています。だから、どうしても塩素が残ってしまい、その塩素から発生するトリハロメタンという物質などが含まれるのでミネラルウォーターより高い数値を示します。
Ruizi54(たっちん)
Ruizi54(たっちん)

今回はTDSが測定できるセンサでシステムを作ってみるよ!TDSセンサは、Amazonや楽天で比較的安価に購入できるので、まずはこれでやってみることにしたよ!

水質センサには様々な測定法があるので、測定したいものによってセンサを変えていく必要があります。

汎用電動機制御基板

今回の水質センサはデジタルをアナログに変換する必要があります。しかし、ラズパイにはデジタル信号しか持ち合わせていません。そのため、アナログ信号を使う場合は、電気回路を考えてデジタルをアナログに変換する必要があります。

今回は、この電気回路を省略するために「汎用電動機制御基板」を使用します。

ADRPTB8C-中紙_組立済

汎用電動機制御基板の特徴は次の通りです。

  • ハンダ、アナログ・デジタルコンバータを使用しないので、初心者は使いやすい。
  • アナログ信号を6系統持っている。
  • ラズパイに端子の差込だけで装着ができるのでかなり簡単。
  • PWM出力、モータ出力をサポートしている。
  • 配線の接続は差込式でハンダいらず。

Ruizi54(たっちん)
Ruizi54(たっちん)

汎用電動機制御基板は電力・電圧ミスによるラズパイ本体の破損を防止する仕組みも組み込まれているから安心だね。

電気初心者の方は、汎用電動機制御基板はかなりオススメです。プログラミングを勉強する上ですでに電気回路がわかっていれば問題ありません。でも電気回路もプログラミングも両方勉強するのは大変です。なので、電気回路ができない方は「汎用電動機制御基板」は購入した方が良いです。

キーボード&マウス

キーボードとマウスは、現在持っているもので十分問題ありません。

購入したいという人向けにワイヤレスマウス付きキーボードを載せておきます。現在はワイヤレスマウス・キーボードが中心です。ラズパイ4はでもワイヤレスマウス・キーボードは使えます。

Ruizi54(たっちん)
Ruizi54(たっちん)

私もワイヤレスキーボード・マウスを使っているよ。その方がUSBのポートを1つ使わずに済むからね!

モバイルバッテリー

ラズパイ4を通常使用するには5V・3Aのアダプタコンセントプラグが必要です。その場合、コンセントから少し離れて作業ができません。

そこに登場するのが、モバイルバッテリーです。「Anker PowerCore Fusion 5000」は5V・3Aの出力を出してくれるので、ラズパイにも使用できます。

Ruizi54(たっちん)
Ruizi54(たっちん)

スマホであれば5V・3Aも必要ないよ。しかも3Aという大きな電流を出力できるモバイルバッテリーは少し特殊だから入手性も若干悪い。ネットなどで見つけたときにぜひ買っておこう!

モバイルバッテリーがあると好きなところでラズパイを使って水の測定ができます。スマホ充電にも使えるので1台は持っておいて損はありません。

水の汚れ具合を測定するプログラミングに挑戦!

では水の汚れ具合を測定していきます。大まかな流れは次の通りです。

  1. ラズパイの初期設定(OSインストール状態からスタート)
  2. 配線接続
  3. Pythonによるプログラミング
  4. 値やゼロ調整などの修正

動きとしては、フロー図に詳細を記載しますが、大きくは次の通りです。

  1. 測定ボタンを押して測定開始。
  2. センサを水などの溶液につけて測定
  3. 測定された値をクラウド(Googleスプレッドシート)にリアルタイム保存。
  4. クラウド以外にラズパイ側にcsv保存。
  5. 終了ボタンでプログラムすべてを終了。

プログラミングの解説

プログラミングの詳細を解説していきます。解説する内容は次の通りです。

  • 必要なモジュールのインストール。(初期設定)
  • 配線接続。(電気回路省略)
  • IFTTTの設定(クラウド化)
  • フロー図とプログラム。
Ruizi54(たっちん)
Ruizi54(たっちん)

OSインストール済みだと思うけど、さらにボタンなどのを動かすためのモジュールをインストールする必要があるよ。最初は少しめんどくさいけど、一度やれば後は何もする必要がないから、はじめだけ辛抱してね。

ラズパイ初期設定

パッケージマネージャの更新

今回はOSにすでにインストールされているモジュール・ライブラリで動作が可能です。ここでは、システムにインストールされているモジュールやライブラリの更新だけ行っておきます。

sudo apt update -y

Ruizi54(たっちん)
Ruizi54(たっちん)

アップデートしなくても作成できると思うよ。でも出来り限り最新のばーしょんのものを使おう!

配線接続

配線接続は非常に簡単です。今回はラズパイのGPIOの5chを使用しています。

  1. ラズパイ4のpinに汎用電動機制御基板を差し込む。
  2. 汎用電動機制御基板の「5V・GND・A5GPIO」のコネクタに水質センサをつなぐ。
Ruizi54(たっちん)
Ruizi54(たっちん)

ぼくの場合は、中継する配線がなかったので、ブレッドボードを使って配線したよ!直接、汎用電動機制御基板に配線できるならブレッドボードは必要ないよ!

今回は電圧を5Vに差し込んでいますが、3.3Vでも問題なく動作します。ただし、その場合は係数が少し変わってくるので、自分で計算してみてください

GPIOとは、、、

GeneralPurposeInput/Outputの頭文字です。日本語では「汎用入出力」と呼びます。ラズパイに搭載されている信号ピンのことです。ラズパイ4のGPIOは全部で26個(GPIO0を除く)あります。プログラムでGPIOの番号を指定することで、その番号のピンとやり取りをすることができます。

GPIO pins
出典:Raspberry Pi GPIO

汎用電動機制御基板を使っているので、複雑な電気回路を使わずに配線ができます。汎用電動機制御基板を使わない場合、センサへの入力をアナログ方式にするためにADコンバータMCP3208を使って回路を作る必要があります。例えば次のような回路です。(出典:そう忘録

センサによってはそのまま回路を作成してもうまく動作しない場合があり、都度回路を考えていく必要があります。汎用電動機制御基板を使っていれば、アナログポートを使えば必ずアナログ入力をしてくれるので、大変便利です。

汎用電動機制御基板をつかって配線を楽にして、まずはプログラミングに専念しましょう!

IFTTTの設定

IFTTT(イフト)は、LINE、Gmail、TwitterなどのWedサービスと簡単に連携を行うことができるサービスです。

Ruizi54(たっちん)
Ruizi54(たっちん)

普通ならややこしいプログラミングが必要だけど、IFTTTを使えば簡単に連携が可能だよ!

色々な連携サービスが可能!

最大の特徴は、「プログラミング」無しに連携サービスを行えること。まさにこれにつきます。そして最大の難点が、説明言語が英語しかないことです。日本語サービスはないので、英語を読んでいく必要があります。

IFTTTの設定を解説していきます。

大まかな流れは次の通りです。

  1. Googleアカウントを使ってIFTTTに登録する。(無料)
  2. webhooksを使ってgoogleスプレッドシートに送る条件(If)を決めてやる。
  3. googleスプレッドシートへの保存するパラメータ(Then That)を決めてやる。
  4. IFTTTのKeyを使ってPythonでIFTTT経由でラズパイで取り出した値をGooglスプレッドシートに保存するプログラムを作成する。(ifttt.py)

基本は画像内の説明に沿っていけばできるようになっています。

IFTTTの登録

Start for freeをクリックします。

今回は、Googleのアカウントを使っていきます。

有料ページに飛ぶので、戻るようにしてください。

Createボタンをクリックしてください。

Ifの設定

まずは、「If」の設定を行います。

webhooksを選んでクリックしてください。

「Receive a web request」をクリックしてください。

Connectをクリックしてください。

ここでは、Event Nameに「send_data」を入れます。入力後、Create triggerをクリックしてIf条件を終了させます。

Then Thatの設定

つぎは、「Then That」の設定を行います。

google sheetを選択してください。

「Add row to spreadsheet」をクリックしてください。

Connectをクリックしてください。

  1. 保存先のgoogleスプレッドシートの名前をきめる。
  2. 「EventName」と一か所の「|||」削除する。
  3. CreateactionをクリックしてThenThatの条件を終了する。

Continueをクリックしてください。これで、「IF」おび「Then」の条件は終了です。

Finishをクリックしてください。

Pythonへ反映させる準備

顔マークをクリックすると、コマンドがおります。My servicesをクリックしてください。

My sevicesの中の「Webhooks」をクリックしてください。

はじめは「Applets」が選択されています。これを「My Applets」にしてください。そのあと、「Settings」にして

「thhps://~use」以降がIFTTT-KEYになります。Pythonに貼り付ける必要がありますので、コピーしてください。

Ruizi54(たっちん)
Ruizi54(たっちん)

IFTTT-KEYは人に知られないようにしてね!知られると簡単にアクセスできるので、悪いことに使われる可能性があるよ!

最後にifttt.pyをフォルダに保存してください。

import requests
class Webhook:
    def __init__(self, event_name, ifttt_key):
        self.event_name = event_name
        self.ifttt_key = ifttt_key
        self.update_url()
    def update_url(self, event=None):
        if event:
            self.event_name = event
        self.url = "https://maker.ifttt.com/trigger/" + \
            self.event_name + "/with/key/" + self.ifttt_key
    def post(self, *, event=None, payload={}):
        if event:
            self.update_url(event)
        response = requests.post(self.url, data=payload)
        return response
Ruizi54(たっちん)
Ruizi54(たっちん)

これでようやくIFTTTの設定が終了だよ。

他のwebサービスと連携が簡単なので、IFTTTはかなり便利です。しかし、簡単にアクセスできてしまうので、セキュリティには十分に気を付ける必要があります。とくにIFTTT-KEYは人に教えたりしないでください。

プログラムの中身について

プログラミングのフローは次の通りです。

ボタンを押せば自動であとはクラウド保存までしてくれるので、フロー図にするとかなりシンプルになります。

また、プログラムコードは次の通りです。一部個人情報が入っている部分については削除しております。ifttt.pyと同じフォルダに保存を必ず行ってください。

from gpiozero import MCP3208 #モジュールの呼び出し
from time import sleep
import RPi.GPIO as GPIO
import time
import datetime
import time
import sys
import math
import tkinter as tk
import smtplib   #smtplibモジュールをインポート
import spidev
import threading
import board
 
from datetime import datetime
import csv
import numpy as np
import matplotlib.pyplot as plt
import collections
#from sense_hat import SenseHat
from sense_emu import SenseHat
import tkinter as tk2
#import dill
import smtplib   #smtplibモジュールをインポート
from email import message #メール用モジュールインポート
from ifttt import Webhook
IFTTT_KEY = '{IFTTT-KEY-HERE}' #{}ごと消して、自分のIFTTTのアカウントのキーを入れる
TEMP_DELTA = 0
CHECK_SPAN = 1
webhook = Webhook('send_data', IFTTT_KEY)
last_day = 0
ref  = 0
base = 0.0001
basevalue = 0
#終了ボタン時のコマンド関数
def cleanAndExit():
    print("Cleaning...")
        
    GPIO.cleanup()
    sleep(0.01)
    print("Bye!")
    root.destroy()
    root.quit()
    sys.exit()
#main関数    
def main():
    after_id = None
    repet_nums = 0
    update_intarval = 1000 #更新時間(msec)
    
    #TDS値を繰り返し出力させる関数
    def convert_data():
        global after_id
        global last_day
        global total_watth_ch0
        global total_watth_ch1
        global after_id
        global v_nf
        global ref
        global base
        global basevalue
        
        Vref = 5.0
        pot = MCP3208(channel=5,differential=False)
        data=[]
        
        s_time = time.time()
 
        dt = datetime.fromtimestamp(s_time)
        if last_day!=dt.day:
            total_watth_ch0 = 0
            total_watth_ch1 = 0
            last_day = dt.day
            
        pass_sec = time.time()-s_time
        today = dt.strftime("%Y-%m-%d")
        nowtime = dt.strftime("%H:%M:%S")
        file_end = dt.strftime("%Y%m%d")
        ####この下の部分に繰り返したい操作を書く#########################################
        
        data.append(pot.value * Vref)
        #TDS値の値を合わせるための計算式
        basevalue = (133.42/(pot.value * Vref/1023)*(pot.value * Vref/1023)*(pot.value * Vref/1023)-255.86 * (pot.value * Vref/1023)*(pot.value * Vref/1023)+857.39*(pot.value * Vref/1023))*0.5
        
        #5ppm未満をすべて0ppmにする
        if (basevalue/0.793-1.0)*10000 <5 :
            print('日付: %s 時刻: %s TDS: 0.00 ppm' % (today,nowtime))
        else:        
            print('日付: %s 時刻: %s TDS: %.2f ppm' % (today,nowtime,(basevalue/0.793-1.0)*10000))
        
        #googleスプレッドシートに保存する値
        payload = {
          "value1": today,  #today
          "value2": nowtime,  #nowtime
          "value3": (basevalue/0.793-1.0)*10000,
        }        
        res = webhook.post(payload=payload)
        if not res.ok:
           print('Request failed with status code', res.status_code)
            
        #csvに記録 今はwater-censer_日付.csvで固定
        #このプログラムファイルを保存しているフォルダパスを記載。日にちもcsvファイルに記載できる。
        with open('****************************/water-censer_%s.csv' % (file_end),'a') as f:
           writer = csv.writer(f)
           writer.writerow([today,nowtime,(basevalue/0.793-1.0)*10000])
        
        time.sleep(CHECK_SPAN) #出力させるタイミングのためディレイ
        #############################################################################
        after_id = showinfo.after(update_intarval, convert_data)
    def start():
        global repet_nums
        repet_nums = 0
        convert_data()
    def stop_convert():
        global after_id
        if after_id: 
         showinfo.after_cancel(after_id) 
         after_id = None 
         showinfo.destroy()
    showinfo = tk.Tk()
    frame_top = tk.Frame(showinfo,bd=2,relief="ridge")
    frame_top.pack(fill="x",pady=2)
    label1 = tk.Label(frame_top, text="自動モードだよ")
    label1.pack(side="left")
    frame_bottom = tk.Frame(showinfo,bd=2)
    frame_bottom.pack(fill="x")
    button1 = tk.Button(frame_bottom, text="STOP", bg="#f0e68c", fg="#ff0000", command=stop_convert)
    button1.pack()
    start()
    showinfo.mainloop()
# 関数
#def main():
def jidoutenmetu():
#while True:
  try:
    main()  
  except KeyboardInterrupt:
    print("終了しました")
    GPIO.cleanup()                     # ポートをクリア
root = tk.Tk()
root.geometry("180x95") #画面サイズ
root.title(u"UV測定")
# メインフレームの作成と設置
sbtn = tk.Button(root, text='終了ボタン',font = ('', 20), command=cleanAndExit,bg = "gray")
sbtn.grid(column=0, row=7)
#sbtn.pack(side = 'bottom')
mbtn = tk.Button(root, text='水質自動測定',font = ('', 20),command=jidoutenmetu,bg="yellow")
mbtn.grid(column=0, row=3)
#mbtn.pack(side = 'bottom')
root.mainloop()
Ruizi54(たっちん)
Ruizi54(たっちん)

このソースコードで動くと思うよ!ただ、ソースコードをコピーする場合は自己責任でお願いします。私の方で新しくOSをインストールし、試してみました。でもOSによってはモジュールのインストールがされていないものがあるかもしれません。だから各々確認をお願いします!

完成状態と動き

プログラムを立ちあげ、「水質自動測定」のボタンを押すとすぐに日付・現時刻・TDS値が現れます。

実際に水やお茶にセンサをつけると数値が高くなります。この測定は「STOPボタン」もしくは「終了ボタン」を押すまで続きます。

また、これらの数字が実際にGoogleスプレッドシートに保存もされています。全く同じタイミングではありませんが、保存されていることがわかります。

Ruizi54(たっちん)
Ruizi54(たっちん)

Googleスプレッドシートにリアルタイムに保存されるので、いちいちラズパイを直接見なくても時間による変化が簡単にわかるね!まさにIoTだね!

TDS値とクラウド化を一度にラズパイで処理をしてもラズパイ4では止まらずに動作してくれます。そして、自分のパソコン上から簡単に測定結果を見ることができます。

実際に何が測定できるか?

この水質測定システムを使えば、次のようなことが測定できます。

  • 金魚の水槽の水換え時期のお知らせや確認。
  • 水耕栽培時の水の管理。
  • 天然水が軟水(TDS:40~80ppm)か硬水(TDS:180~300ppm)かわかる。

金魚や水耕栽培の水の管理をリアルタイムに映し出し、おおよその交換タイミングがわかるのはかなり便利かと思います。ただし、センサ自身は安い部材なので、今回作成したシステムが出力したTDSの数値をすべて鵜呑みにするのは危険ですが、かなり管理はしやすくなると思います。

Ruizi54(たっちん)
Ruizi54(たっちん)

もっと色々な使い方ができると思うので、もっと模索してみよう!

身近な悩みをIoTを使って解決することで、もっとラズパイをすることができます。

最後に:苦労するがラズパイを使ってIoTを学ぼう!

今回は水質の度合をみるシステムを作ってみました。今回のやり方は、電気回路を省略してプログラミングに専念できる方法です。そのメリットとデメリットは次の通りです。

メリット
デメリット
  • 電気回路を飛ばすことができる。
  • Pythonのやり方に専念できる。
  • 数万円でIoTを実体験できる。
  • 回路設計を学ぶことができない。
  • 配線がたくさん出て、見た目がちっぽけに見える。
  • センサの精度が不安定。

また、今回苦労したのは次の通りです。

TDSの値が思っていた通りにならない
水道水のTDS値が100~160ppmといわれているが、ディスプレイにでる値が全く違うので、計算でうまく算出する方法に苦労しました。すでにわかっている値を2~3種類ほど選んでその値に近づくように計算しました。今回は水道水・ミネラルウォーターを使いました。
0出力がうまくできない
水などに入れない状態を0にしたいが、何もしていない状態でもわずかながら濃度数値はでてしまいます。また数値が安定しないので、それを0にするのが苦労しました。今回は、5ppm以下はすべて0にするという大胆なやり方を取っています。
出力結果のクラウド化
出力結果をリアルタイムでクラウドに保存する方法として、比較簡単にできるIFTTTを採用。Googleスプレッドシートにリアルタイムに保存するようにしました。
Ruizi54(たっちん)
Ruizi54(たっちん)

クラウド化ははじめの設定だけすればあとは使いまわしができるから一回やってみてね!

今回のまとめです。

  • Pythonとラズパイを使うことで簡単にIoTを実現できる。
  • 汎用電動機制御基板を使うことでラズパイが不得意とするアナログ出力を簡単に実現できる。
  • 安いセンサも数式などをうまく活用することで、使えるシステムとなる。

ぜひ、自分でドンドンチャレンジをしてIoTを習得してください。

構造設計者がプログラミングを学んだ方が良いオススメ理由と勉強法を解説しています。興味があれば、ぜひ読んでみてください。