- 構造設計者でも気軽にプログラミングに挑戦したい!
- 本に載っているLEDのLチカ以外の実践をやってみたいけどやり方がわからない。。。
- 自分でセンサを使ってIoTを作ってみたい!
IoTがブームになっており、いたるところでプログラミング人気がでています。特に簡単にIoT・プログラミングが実践ができるラズパイは人気。しかし、ラズパイ用の書籍はどれも初心者がメインでメインで脱初心者を目指すヒトにとっては少し簡単すぎるところがあります。
この記事では、水質センサと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 ポート × 2 | 85 x 56 x 17 mm | 5V 3A USB C ポート | 1GB:ー 2GB:7,150円 4GB:8,580円 8GB:11,440円 | |||
ラズパイ3A+ | 少し外径が小さい 熱はほどほど 処理も速度もほどほど | 4コア 1.4GHz | 512MB | USB2.0 × 1 | 有線/無線(2.4GHz/5Ghz) | HDMI ポート × 1 | 65 x 56 x 12 mm | 5V 2.5A micro USB ポート | 3,795円 | |||
ラズパイ3B+ | 熱はほどほど 処理も速度もほどほど | 4コア 1.4GHz | 1GB | USB2.0 × 4 | 有線/無線(2.4GHz) | HDMI ポート × 1 | 85 x 57 x 17 mm | 5V 2.5A micro USB ポート | 6,435円 | |||
ラズパイ3B | 熱はほどほど 処理も速度もほどほど | 4コア 1.2GHz | 1GB | USB2.0 × 4 | 有線/無線(2.4GHz) | HDMI ポート × 1 | 85 x 57 x 17 mm | 5V 2.5A micro USB ポート | 6,435円 | |||
Zero/ Zero W/ Zero WH | とにかく小さい 簡単な処理向き | 1コア 1.0GHz | 512MB | microUSB × 1 | Zero:無/ Zero W:無/ Zero WH:アリ | Zero:無/ Zero W:アリ/ Zero WH:アリ | mini HDMI × 1 | Zero:無/ 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円 |
画像処理やサーバーなど、重い処理をしていきたいので、迷わずラズパイ4を購入したよ!
あと、サイズの小ささからラズパイ Zero WHも購入しましたが、快適さから言えば断然だ図パイ4です。ラズパイ Zero WHは、ネットにつなごうとしてもつながらない状況なので。。。
Python
Pythonとは、1991年にオランダのグイド・ヴァン・ロッサムが開発した言語です。読みやすく、かつ効率がよいコードをできる限り簡単に書けるように目指された言語であり、次の特徴があります。
- いくつも手法を用意せず、方法が1つだけ。
- シンプルで比較的に覚えることが少ない。
- 1行で多くの処理を記述できる。
- 標準ライブラリが豊富。
- Python向けの応用モジュールも豊富。
- AI、機械学習に取り組みやすい。
- Webへのアクセスなどがしやすい。
比較的、プログラミングを直感的に読むことができるので、Pythonはプログラミングに触れていない方にもオススメだよ。実際に使って、C言語よりやりやすいと思うよ。
ITエンジニアが2021に学びたいプログラミング言語の第1位に挙げているのがPython。現在、かなり注目を浴びているプログラミング言語です。
順位 | 言語 | 割合 |
1位 | Python | 32.8% |
2位 | Java | 9.3% |
3位 | JavaScript | 5.9% |
4位 | C | 5.7% |
5位 | VC・VC++ | 5.4% |
6位 | C++ | 4.8% |
7位 | C# .NET | 4.5% |
8位 | Ruby | 4.3% |
9位 | Swift | 2.0% |
10位 | COBOL | 1.8% |
10位 | PHP | 1.8% |
10位 | VB | 1.8% |
11位以降 | その他 | 19.9% |
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と言われている。
水の硬度(ミネラルなど)を測定する場合に用いられる。
ちなみに水道水の濃度が高いのは、水道水の場合は浄水のために塩素が配合されています。だから、どうしても塩素が残ってしまい、その塩素から発生するトリハロメタンという物質などが含まれるのでミネラルウォーターより高い数値を示します。
今回はTDSが測定できるセンサでシステムを作ってみるよ!TDSセンサは、Amazonや楽天で比較的安価に購入できるので、まずはこれでやってみることにしたよ!
水質センサには様々な測定法があるので、測定したいものによってセンサを変えていく必要があります。
汎用電動機制御基板
今回の水質センサはデジタルをアナログに変換する必要があります。しかし、ラズパイにはデジタル信号しか持ち合わせていません。そのため、アナログ信号を使う場合は、電気回路を考えてデジタルをアナログに変換する必要があります。
今回は、この電気回路を省略するために「汎用電動機制御基板」を使用します。
汎用電動機制御基板の特徴は次の通りです。
- ハンダ、アナログ・デジタルコンバータを使用しないので、初心者は使いやすい。
- アナログ信号を6系統持っている。
- ラズパイに端子の差込だけで装着ができるのでかなり簡単。
- PWM出力、モータ出力をサポートしている。
- 配線の接続は差込式でハンダいらず。
汎用電動機制御基板は電力・電圧ミスによるラズパイ本体の破損を防止する仕組みも組み込まれているから安心だね。
電気初心者の方は、汎用電動機制御基板はかなりオススメです。プログラミングを勉強する上ですでに電気回路がわかっていれば問題ありません。でも電気回路もプログラミングも両方勉強するのは大変です。なので、電気回路ができない方は「汎用電動機制御基板」は購入した方が良いです。
キーボード&マウス
キーボードとマウスは、現在持っているもので十分問題ありません。
購入したいという人向けにワイヤレスマウス付きキーボードを載せておきます。現在はワイヤレスマウス・キーボードが中心です。ラズパイ4はでもワイヤレスマウス・キーボードは使えます。
私もワイヤレスキーボード・マウスを使っているよ。その方がUSBのポートを1つ使わずに済むからね!
モバイルバッテリー
ラズパイ4を通常使用するには5V・3Aのアダプタコンセントプラグが必要です。その場合、コンセントから少し離れて作業ができません。
そこに登場するのが、モバイルバッテリーです。「Anker PowerCore Fusion 5000」は5V・3Aの出力を出してくれるので、ラズパイにも使用できます。
スマホであれば5V・3Aも必要ないよ。しかも3Aという大きな電流を出力できるモバイルバッテリーは少し特殊だから入手性も若干悪い。ネットなどで見つけたときにぜひ買っておこう!
モバイルバッテリーがあると好きなところでラズパイを使って水の測定ができます。スマホ充電にも使えるので1台は持っておいて損はありません。
水の汚れ具合を測定するプログラミングに挑戦!
では水の汚れ具合を測定していきます。大まかな流れは次の通りです。
- ラズパイの初期設定(OSインストール状態からスタート)
- 配線接続
- Pythonによるプログラミング
- 値やゼロ調整などの修正
動きとしては、フロー図に詳細を記載しますが、大きくは次の通りです。
- 測定ボタンを押して測定開始。
- センサを水などの溶液につけて測定
- 測定された値をクラウド(Googleスプレッドシート)にリアルタイム保存。
- クラウド以外にラズパイ側にcsv保存。
- 終了ボタンでプログラムすべてを終了。
プログラミングの解説
プログラミングの詳細を解説していきます。解説する内容は次の通りです。
- 必要なモジュールのインストール。(初期設定)
- 配線接続。(電気回路省略)
- IFTTTの設定(クラウド化)
- フロー図とプログラム。
OSインストール済みだと思うけど、さらにボタンなどのを動かすためのモジュールをインストールする必要があるよ。最初は少しめんどくさいけど、一度やれば後は何もする必要がないから、はじめだけ辛抱してね。
ラズパイ初期設定
パッケージマネージャの更新
今回はOSにすでにインストールされているモジュール・ライブラリで動作が可能です。ここでは、システムにインストールされているモジュールやライブラリの更新だけ行っておきます。
sudo apt update -y
アップデートしなくても作成できると思うよ。でも出来り限り最新のばーしょんのものを使おう!
配線接続
配線接続は非常に簡単です。今回はラズパイのGPIOの5chを使用しています。
- ラズパイ4のpinに汎用電動機制御基板を差し込む。
- 汎用電動機制御基板の「5V・GND・A5GPIO」のコネクタに水質センサをつなぐ。
ぼくの場合は、中継する配線がなかったので、ブレッドボードを使って配線したよ!直接、汎用電動機制御基板に配線できるならブレッドボードは必要ないよ!
今回は電圧を5Vに差し込んでいますが、3.3Vでも問題なく動作します。ただし、その場合は係数が少し変わってくるので、自分で計算してみてください。
GPIOとは、、、
GeneralPurposeInput/Outputの頭文字です。日本語では「汎用入出力」と呼びます。ラズパイに搭載されている信号ピンのことです。ラズパイ4のGPIOは全部で26個(GPIO0を除く)あります。プログラムでGPIOの番号を指定することで、その番号のピンとやり取りをすることができます。
汎用電動機制御基板を使っているので、複雑な電気回路を使わずに配線ができます。汎用電動機制御基板を使わない場合、センサへの入力をアナログ方式にするためにADコンバータMCP3208を使って回路を作る必要があります。例えば次のような回路です。(出典:そう忘録)
センサによってはそのまま回路を作成してもうまく動作しない場合があり、都度回路を考えていく必要があります。汎用電動機制御基板を使っていれば、アナログポートを使えば必ずアナログ入力をしてくれるので、大変便利です。
汎用電動機制御基板をつかって配線を楽にして、まずはプログラミングに専念しましょう!
IFTTTの設定
IFTTT(イフト)は、LINE、Gmail、TwitterなどのWedサービスと簡単に連携を行うことができるサービスです。
普通ならややこしいプログラミングが必要だけど、IFTTTを使えば簡単に連携が可能だよ!
色々な連携サービスが可能!
最大の特徴は、「プログラミング」無しに連携サービスを行えること。まさにこれにつきます。そして最大の難点が、説明言語が英語しかないことです。日本語サービスはないので、英語を読んでいく必要があります。
IFTTTの設定を解説していきます。
大まかな流れは次の通りです。
- Googleアカウントを使ってIFTTTに登録する。(無料)
- webhooksを使ってgoogleスプレッドシートに送る条件(If)を決めてやる。
- googleスプレッドシートへの保存するパラメータ(Then That)を決めてやる。
- 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をクリックしてください。
- 保存先のgoogleスプレッドシートの名前をきめる。
- 「EventName」と一か所の「|||」削除する。
- CreateactionをクリックしてThenThatの条件を終了する。
Continueをクリックしてください。これで、「IF」おび「Then」の条件は終了です。
Finishをクリックしてください。
Pythonへ反映させる準備
顔マークをクリックすると、コマンドがおります。My servicesをクリックしてください。
My sevicesの中の「Webhooks」をクリックしてください。
はじめは「Applets」が選択されています。これを「My Applets」にしてください。そのあと、「Settings」にして
「thhps://~use」以降がIFTTT-KEYになります。Pythonに貼り付ける必要がありますので、コピーしてください。
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
これでようやく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()
このソースコードで動くと思うよ!ただ、ソースコードをコピーする場合は自己責任でお願いします。私の方で新しくOSをインストールし、試してみました。でもOSによってはモジュールのインストールがされていないものがあるかもしれません。だから各々確認をお願いします!
完成状態と動き
プログラムを立ちあげ、「水質自動測定」のボタンを押すとすぐに日付・現時刻・TDS値が現れます。
実際に水やお茶にセンサをつけると数値が高くなります。この測定は「STOPボタン」もしくは「終了ボタン」を押すまで続きます。
また、これらの数字が実際にGoogleスプレッドシートに保存もされています。全く同じタイミングではありませんが、保存されていることがわかります。
Googleスプレッドシートにリアルタイムに保存されるので、いちいちラズパイを直接見なくても時間による変化が簡単にわかるね!まさにIoTだね!
TDS値とクラウド化を一度にラズパイで処理をしてもラズパイ4では止まらずに動作してくれます。そして、自分のパソコン上から簡単に測定結果を見ることができます。
実際に何が測定できるか?
この水質測定システムを使えば、次のようなことが測定できます。
- 金魚の水槽の水換え時期のお知らせや確認。
- 水耕栽培時の水の管理。
- 天然水が軟水(TDS:40~80ppm)か硬水(TDS:180~300ppm)かわかる。
金魚や水耕栽培の水の管理をリアルタイムに映し出し、おおよその交換タイミングがわかるのはかなり便利かと思います。ただし、センサ自身は安い部材なので、今回作成したシステムが出力したTDSの数値をすべて鵜呑みにするのは危険ですが、かなり管理はしやすくなると思います。
もっと色々な使い方ができると思うので、もっと模索してみよう!
身近な悩みをIoTを使って解決することで、もっとラズパイをすることができます。
最後に:苦労するがラズパイを使ってIoTを学ぼう!
今回は水質の度合をみるシステムを作ってみました。今回のやり方は、電気回路を省略してプログラミングに専念できる方法です。そのメリットとデメリットは次の通りです。
また、今回苦労したのは次の通りです。
- TDSの値が思っていた通りにならない
- 水道水のTDS値が100~160ppmといわれているが、ディスプレイにでる値が全く違うので、計算でうまく算出する方法に苦労しました。すでにわかっている値を2~3種類ほど選んでその値に近づくように計算しました。今回は水道水・ミネラルウォーターを使いました。
- 0出力がうまくできない
- 水などに入れない状態を0にしたいが、何もしていない状態でもわずかながら濃度数値はでてしまいます。また数値が安定しないので、それを0にするのが苦労しました。今回は、5ppm以下はすべて0にするという大胆なやり方を取っています。
- 出力結果のクラウド化
- 出力結果をリアルタイムでクラウドに保存する方法として、比較簡単にできるIFTTTを採用。Googleスプレッドシートにリアルタイムに保存するようにしました。
クラウド化ははじめの設定だけすればあとは使いまわしができるから一回やってみてね!
今回のまとめです。
- Pythonとラズパイを使うことで簡単にIoTを実現できる。
- 汎用電動機制御基板を使うことでラズパイが不得意とするアナログ出力を簡単に実現できる。
- 安いセンサも数式などをうまく活用することで、使えるシステムとなる。
ぜひ、自分でドンドンチャレンジをしてIoTを習得してください。
構造設計者がプログラミングを学んだ方が良いオススメ理由と勉強法を解説しています。興味があれば、ぜひ読んでみてください。
(たっちん)