工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

給湯器熱電対電圧モニター

コンポーネントと消耗品

Adafruit Raspberry Pi Zero WH
× 1
Arduino Nano R3
× 1

このプロジェクトについて

給湯器パイロットライトモニタリングシステム

従来のガス給湯器は、24時間365日パイロットライトを維持します。このパイロットライトは、小さな電圧(最大30ミリボルト)を生成する熱電対を加熱します。この電圧は、給湯器のサーモスタットがガスバルブを開いたままにするために使用されます。種火が消えると、電圧が止まり、ガスバルブが自動的に閉じます。

私の給湯器では、種火が時々消えます。これは年に3回程度しか起こらないので、高価な給湯器を交換したくありません。熱電対を交換してみましたが、問題は解決しませんでした。

私の解決策:熱電対によって生成される電圧を監視します。ゼロになったら、テキストとメールを送信して、パイロットライトを再点灯できるようにします。熱電対の電圧がゼロになるたびにガスバルブが閉じるため、ここではガス漏れの危険がないことを忘れないでください。

概要

Raspberry Pi Zero WHは、パイロットライトが消えたときにメールとテキストを送信するために使用されます。 Raspberry Piには電圧を測定する方法がないため、ArduinoNanoを使用して熱電対からの電圧を監視します。

Arduinoには、電圧を読み取って0〜1023の数値に変換できるアナログ-デジタルコンバーター(ADC)があります。このプロジェクトでは、Arduinoは熱電対から電圧を読み取り、この値をRaspberryPiに伝達します。 Raspberry Piは電圧の読み取り値を受け取り、それを解釈します。値が低すぎる場合は、種火が消えたと見なして通知を送信します。

ステップ1:ラズベリーパイを準備する

Raspberry Piをネットワーク上で稼働させます(これを行う手順については、他のプロジェクトを確認できます)。

Arduinoから電圧の読み取り値を受け取るPythonプログラムを作成します。電圧の読み取り値が低すぎると、プログラムはループして通知を送信します。ソースコードが添付されています。

ステップ2:Arduinoを準備する

安価な中国のArduinoNanoを購入したので、これらをWindows10コンピューターで動作させるには試行錯誤が必要でした。

Arduinoにスケッチをロードして、30秒ごとに入力ピンの電圧を測定します。 Arduinoは0と基準電圧の間の電圧を測定できます。基準電圧として1.1Vまたは5Vを選択できます。熱電対は最大30ミリボルトしか出力しないため、分解能を上げるために1.1Vの基準電圧を使用します。 Arduino ADCは、0Vの場合は0を出力し、1.1Vの場合は1023を出力します。前述のように、熱電対は最大30ミリボルトを出力するため、読み取り値は28以下になります。

ステップ3:Arduinoを電圧源に接続する

熱電対は、同軸線を介して給湯器のサーモスタットに電圧を送信します。ワイヤーの外側はプラスです。

<図>

給湯器のサーモスタットから約5インチ離れたところにワイヤーを切ります。同軸線の外側を少し切り戻して、真ん中の線にアクセスできるようにします。真ん中のワイヤーに塗られている絶縁体を破壊しないでください。中線が同軸線の外側に短絡することは望ましくありません。

<図>

給湯器のサーモスタットとArduinoの入力ピンに正の電圧が供給されるようにワイヤーを接続します。入力ピンA0を使用しました。電圧源のマイナス側は、Arduinoのアースに接続する必要があります。また、給湯器のサーモスタットのマイナス側も接続する必要があります。

接続には、両端にワニ口クリップが付いた1フィートの長さのワイヤーを使用しました。

<図>

ステップ4:ArduinoをRaspberryPiに接続する

Arduinoで実行されているスケッチは、ADCからRaspberryPiに電圧番号を送信します。 Arduinoはデジタルピン9からの出力として信号を送信します。

Arduinoは+ 5Vで信号を送信します。 RaspberryPiは3V入力のみを受信できます。したがって、ArduinoとRaspberry Piの間には、分圧器が必要です。これにより、電圧が5Vから約2.8Vに低下します。

分圧器は、入力電圧を下げる抵抗器のシステムです。

<図>

出力電圧は、分圧器の関係によって決まります。

<図>

電流が流れていないときは、抵抗の両側の電圧がVin(5V)になるため、単一の抵抗を使用して電圧を下げることはできません。分圧器を使用すると、電流が流れていない状況でも電圧が低下します。

すべてのアース線を接続する必要があります。接続図を参照してください。

ステップ5:Arduinoが電圧測定値を送信する

30秒ごとに、ArduinoスケッチはADCから電圧測定値を取得し、その数値をRaspberryPiに送信します。 Arduinoピン9からRaspberryPiピン16までの原始的な単線信号システムを使用することにしました。

ステップ6:RaspberryPiが電圧測定値を受信する

Raspberry Piは、無限ループのPythonプログラムを使用して、ピン16の立ち上がりエッジをリッスンします。立ち上がりエッジが検出されると、Arduinoが数値の送信を開始したと見なされます。

信号システム
2桁の数字を送信します(例:「12」)。各桁の前には、ピン16で受信された正のパルスがあります。20ミリ秒(ms)未満で分離された後続の正のパルスは、この桁の値をインクリメントします。 40msを超える一時停止は、この数字が完了し、次の数字が始まることを示します。 40msを超える別の一時停止は、2桁目が完了したことを示します。これで2桁の数字全体が完成しました。

Raspberry Piで実行されているPythonコードでは、Arduinoから受信した番号は、Arduinoからの信号を解釈するメソッドから返されます。他のPythonコードは、通知を送信する必要があるかどうかを決定します。次に、コードはピン16の次の立ち上がりエッジでの待機に戻ります。

ステップ7:通知を送信する

電圧が低すぎる場合は、低カウントをインクリメントします。誤警報を防ぐために、低いカウントが維持されます。低いカウントが5に達すると、電圧は5回の測定で低くなっています。各測定は30秒間隔です。通知を送信し、ローカウントをリセットします。通知は、smtplibとGmailアカウントを使用して送信されます。通知が送信されると、タイムスタンプがPythonコードに保存されます。次の通知は6時間送信されません。

テキストアラートを送信するために、私はほとんどの携帯電話プロバイダーが提供する機能を使用しました:ユーザーにテキストを電子メールで送信する機能。例:Verizonの場合:[email protected]はその番号にテキストを送信します。

Gmail
通知の送信に使用する新しいGmailアカウントを作成しました。最初に、このGmailアカウントのセキュリティ設定を構成して、「安全性の低い」アクセスを許可し、Pythonコードがメールを送信できるようにしました。ただし、数か月後、Gmailはこの安全性の低いアクセスを無効にする場合があります。 Gmailはユーザーがアプリのパスワードを使用することを好むことを発見しました。

アプリのパスワードを設定する
https://support.google.com/accounts/answer/185833

ステップ8:すべてを接続する

Arduinoを給湯器の熱電対ワイヤーと分圧器を介してRaspberryPiに接続します。 (分圧器の上部には、合計550オームの2つの抵抗器が使用されています。これは、手元にあった抵抗器であるためです。)Arduinoの電源を入れると、電圧の測定とRaspberryPiへの信号の送信が30秒ごとに開始されます。

<図>

ステップ9:Pythonプログラムを実行する

  • Pythonプログラムを開始するスクリプトを作成します。
  • ルートcrontabを編集して、起動時にスクリプトを自動的に実行します。 Raspberry Piと、Pythonプログラムを保存した場所に応じてディレクトリパスを編集します。
  • crontabを編集するには:
    sudo crontab -e
  • RaspberryPiの再起動時に「キックオフ」スクリプトを実行する行を追加します。
    @reboot sh /home/pi/hotwater/run_HotWaterNotifier.sh>> / home / pi / hotwater /logs/HotWaterNotifier.log 2>&1
  • 手動で実行するには(crontabを設定する前に)
    最初にプロセスを実行します(run_HotWaterNotifier.shスクリプトを実行します)
    次に、 ctrl-Z と入力します プロセスを一時停止するには
    次に、 bg と入力します プロセスをバックグラウンドに送信するために1〜2回
    disown 」と入力します 、これにより、ログオフした後もプロセスを実行し続けることができます
  • プロセスがまだ実行されているかどうかを確認するには
    ps aux | grep -i HotWater
<図>


コード

  • Arduinoコード
  • フィトンコード
  • Pythonコードを開始するためのスクリプト
Arduinoコード Arduino
これは30秒ごとに電圧を読み取り、Raspberry Pi
 / ********************************に信号を送信します。 ********************************************** HotWaterHeater電圧を測定します給湯器の熱電対から来ています。シグナリングを使用して、この電圧センサー測定値をRaspberryPiに送信します。 ************************************************** ************************** /// double ReferenceVoltage =5.0; //未使用の参照電圧doubleReferenceVoltage =1.1; int OUTPUT_PIN =9; int INTRA_DIGIT_WAIT =20; int BETWEEN_DIGIT_WAIT =50; ////////////////////////// ////////////////////////////////////////////////// /////リセットを押すか、ボードに電源を入れると、セットアップ機能が1回実行されます//////////////////////////////// /////////////////////////////////////////////// void setup( ){//デジタルピンLED_BUILTINを出力として初期化します。 pinMode(LED_BUILTIN、OUTPUT); pinMode(OUTPUT_PIN、OUTPUT); //デジタルピン9を出力analogReference(INTERNAL);として設定します。 Serial.begin(9600); //シリアルポートを開き、データレートを9600bpsに設定します} ///////////////////////////////////// ////////////////////////////////////////////ループ関数が実行され、 //入力ピンの電圧を測定します。//次に、その読み取り値をRaspberry Pi //////////////////////////に送信します。 ////////////////////////////////////////////////// /// void loop(){int pinInput;倍電圧; pinInput =analogRead(A0); //プローブ入力Serial.print( "PinInputA0 ="); Serial.print(pinInput); // Arduino ADCは10ビットコンバータです。つまり、出力値は0〜1023の範囲になります。電圧=(pinInput * ReferenceVoltage)/ 1023; Serial.print( "、VoltageA0 ="); Serial.println(電圧); //注:5 =5.38 mVの読み取り値sendNumberSignal(pinInput、OUTPUT_PIN、INTRA_DIGIT_WAIT、BETWEEN_DIGIT_WAIT); // 30秒ごとに1回チェックを実行delay(30000);} / ********************************** ************************************************番号を通知します単線。 * *各桁について、一連のパルスを送信します。 *初期キックオフパルスもあります。 *各パルスは次のようになります:__ / 20ms \ __ 20ms __ *同じ桁内の立ち上がりエッジ間で20+ 20ms * *桁間:__ / 20ms \ __ 20ms__ 50ms ___ * 20 + 20 + 50ms桁間********* ************************************************** ****************** / void sendNumberSignal(int number、int pin、int intraDigitWait、int betweenDigitWait){int tens =number / 10; int ones =数値%10; Serial.print( "シグナリング:"); Serial.println(number); //デバッグ//////////Serial.print("tens: "); //Serial.println(tens); //Serial.print("ones: "); //Serial.println(ones); //Serial.print("millis: "); //Serial.println(millis()); //デバッグ//////////Serial.println("send tens "); //Serial.print("millis: "); //Serial.println(millis()); //十の数を送信しますsendPulse(pin、intraDigitWait); for(int i =0; i  
Phythonコード Python
このコードは、Arduinoから信号を受信します。信号を電圧測定値に解釈します。次に、電圧が低すぎるかどうかを判断します。電圧が低すぎると、電子メールとテキストが送信されます。
 ################################## ############################################## HotWaterNotifier.py#入力ピンを監視し、Arduinoから信号を受信します。#信号を数値の電圧センサー測定値にデコードします。#受信電圧の読み取り値が低すぎる場合、これは#パイロットライトが消灯していることを示します。これが連続して5回の測定で発生する場合、#パイロットライトが実際に消灯していると想定します。メール/テキストを送信して時間を記録します。#6時間ごとにのみメール/テキストを送信します。##これはPython2.7用に作成されました。 Python3ではマイナーな変更が必要になる場合があります。######################################### ###################################### import smtplibimport RPi.GPIO as GPIOimport osimport os.pathimport timeimport datetimeimport stringimport loggingimport sys#Arduinoから信号を受信するための入力GPIOGPIO_Alert =16#emailsemailWaitHours =6#の間に待機する時間低電圧センサーの読み取り値。#これ以下は低電圧です。lowSensorReading=1#この数が低い場合センサーの読み取り値に達した場合は、GPIO番号付けにalertmaxLowVoltageCount =5#を送信し、BCMGPIO.setmode(GPIO.BCM)GPIO.setup(GPIO_Alert、GPIO.IN、pull_up_down =GPIO.PUD_DOWN)lastEmailSentTime =datetime.datetime(2000,1 1,0,0,0,0)#declare global variable #################################### ############################################ロガーをセットアップします。## #################################################### ########################### def setup_custom_logger(name):formatter =logging.Formatter(fmt ='%(asctime)s%(levelname )-8秒%(message)s '、datefmt ='%Y-%m-%d%H:%M:%S ')handler =logging.FileHandler(' HotWaterLog.txt '、mode =' a ')handler.setFormatter( formatter)screen_handler =logging.StreamHandler(stream =sys.stdout)screen_handler.setFormatter(formatter)logger =logging.getLogger(name)logger.setLevel(logging.DEBUG)logger.addHandler(handler)logger.addHandler(screen_handler)return logger #################################################### ##############################メール/テキストを送信する機能############## #################################################### ############### def send_email_alert():#グローバル変数に書き込みを許可するglobal lastEmailSentTime#最後のメールから十分な時間が経過したかどうかを確認するnowTime =datetime.datetime.now()emailWaitDelta =datetime.timedelta(hours =emailWaitHours)limitTime =nowTime --emailWaitDelta#十分な時間が経過した場合は、電子メールを送信します。 lastEmailSentTimeがNoneまたはlimitTime> lastEmailSentTimeの場合:logger.info( 'Sending email alert ...')HOST ="smtp.gmail.com" PORT =587 SUBJECT ="Hot Water Heater Alert"#これは、複数のアドレスTO =["[email protected]"、 "[email protected]"] #TO =["[email protected]"] FROM ="[email protected]" PWD ="XXXXXXXXXXXXXX" text ="温水ヒーターで測定された低電圧」#toフィールドはここで1つのストリングに結合されます。 #これは、受信者に電子メールで表示されるものです。 BODY =string.join(( "from:%s"%FROM、 "to:%s"% "、" .join(TO)、 "Subject:%s"%SUBJECT、 ""、text)、 "\ r \ n ")try:s =smtplib.SMTP(HOST、PORT)s.set_debuglevel(1)s.ehlo()s.starttls()s.login(FROM、PWD)s.sendmail(FROM、TO、BODY) s.quit Exception as e:logger.exception( '例外がファイル送信メールをキャッチしました。6時間後に再試行します')#メールが6時間送信されないように時間を設定しますlastEmailSentTime =nowTime else:logger.info( 'メールを送信していません。最後に送信されたメール: '+ lastEmailSentTime.strftime( "%Y-%m-%d%H:%M:%S"))############### #################################################### ############### Arduinoから信号を受信します。#数値は2桁で構成されます。 (10桁、1桁)#Arduinoは常に2桁の数値を送信します。#受信した信号は入力ピンの一連の高パルスです。#waitReceiveNumber()メソッドは高パルスをカウントします。 [count -1]は#桁の値です。#各桁の前に1パルスがあります。##同じ桁内の信号エッジ間で最大70ミリ秒#70ミリ秒未満で区切られた立ち上がりエッジは同じ桁#大きい場合70ミリ秒を超えた場合は、次の桁に移動します#200ミリ秒は、番号が完了したことを意味します################################## ############################################## def waitReceiveNumber(GPIO_Alert ):lastSignalTime =datetime.datetime(2000,1,1,0,0,0,0)isTens =True isFirstIteration =True tensValue =0 onesValue =0 receiveEdge =None#パルス間の70ms未満:これはまだ同じ桁です送信中#現在の桁の値をインクリメントします#70ms以上:次の桁に切り替えますsingleDigitMilliseconds =datetime .timedelta(milliseconds =70)#このタイムアウトに達すると、数値の終わりになりますwholeNumberWaitTime =200#立ち上がりエッジが検出されるまでここで待機します#logger.info( 'GPIOピンで待機中:' + str(GPIO_Alert)) Trueの場合:#Arduinoは、フラッシュするとパルスを送信し、RaspberryPiを2番目に起動します。 #停電が発生した場合、Arduinoはより速く起動するはずです。 if isFirstIteration:receivedEdge =GPIO.wait_for_edge(GPIO_Alert、GPIO.RISING、timeout =-1)#キックオフパルスまで永久に待機else:receivedEdge =GPIO.wait_for_edge(GPIO_Alert、GPIO.RISING、timeout =totalNumberWaitTime)#wait for up to waitTime ms#この信号のタイミングメトリックを計算しますsignalTime =datetime.datetime.now()signalInterval =signalTime --lastSignalTime lastSignalTime =signalTime #debugging:logger.info( 'signalInterval:' + str(signalInterval.total_seconds()* 1000 ))#インクリメントする桁を決定するif(signalInterval  =singleNumberMilliseconds:if isTens:#shift to ones isTens =False onesValue + =1それ以外の場合:#isOnes#次の桁に移動できないため、番号は完全です。 #これは起こらないはずです。数値が完了すると、#waitはタイムアウトになり、receivedEdgeはNoneになります。 return((tensValue -1)* 10)+(onesValue -1)else:#timeoutなので、数値は完全です。 return((tensValue -1)* 10)+(onesValue -1)################################## ##############################################主な方法# #################################################### ############################ def main():logger.info( 'Starting HotWaterNotifier')referenceVoltage =1.1 lowVoltageCount =0 try: Trueの場合:#これは、Arduinoから信号を受信するまでブロックされます。 #完了した番号を受け取った場合にのみ返されます。 SensorReading =waitReceiveNumber(GPIO_Alert)#Arduinoセンサーの読み取り電圧から電圧を計算=(sensorReading * referenceVoltage)/ 1023; logger.info( 'sensorReading:' + str(sensorReading)+ '、電圧:' + str(電圧))if SensorReading <=lowSensorReading:lowVoltageCount + =1 #increment if lowVoltageCount> =maxLowVoltageCount:logger.info( '低電圧アラート')send_email_alert()lowVoltageCount =0#アラートを送信したため、カウンターをリセットしますelse:lowVoltageCount =0#KeyboardInterrupt以外の良好な電圧を受信したため、カウンターをリセットします:logger.info(' Keyboard Interrupt receive ')GPIO.cleanup() #CTRL + CでGPIOをクリーンアップするGPIO.cleanup()#GPIOをクリーンアップする################################ ################################################テスト電子メール方式################################################## ############################### def testEmail():logger.info( 'Starting HotWaterNotifier')referenceVoltage =1.1 lowVoltageCount =0試行:se KeyboardInterruptを除くnd_email_alert():logger.info( 'キーボード割り込みを受信しました')GPIO.cleanup()#CTRL + CでGPIOをクリーンアップします終了GPIO.cleanup()#GPIOをクリーンアップします########### #################################################### ###################グローバル変数############################ #################################################### ##ログファイルロガーを設定する=setup_custom_logger( 'HotWaterNotifier')#################################### ############################################メインメソッドを呼び出します。# #電子メール機能をテストする場合は、代わりにここでtestEmail()を呼び出します。################################## ############################################# if __name __ ==" __main __ ":main()
Pythonコードを開始するためのスクリプト SH
これは、crontabがPythonコードを開始するために呼び出すスクリプトです
#!/ bin / bash#run_HotWaterNotifier.sh#notifiercd / home / pi / hotwatersudo python HotWaterNotifier.py 
を起動します

製造プロセス

  1. MoteinoとRaspberryPiを使用して室温を監視する
  2. Arduinoを使用してモニターをAmbilightにする
  3. Arduinoを使用したソーラーパネルのリアルタイムデータ取得
  4. Arduinoで水滴をキャプチャする
  5. Arduinoエネルギーモニターとデータロガーを構築する方法
  6. IoTを使用した心拍数モニター
  7. ArduinoTemp。 3.2ディスプレイを備えたモニターとリアルタイムクロック
  8. カスタマイズ可能なガイガーミュラーカウンター
  9. 完璧なヒートポンプ温水
  10. 最高の家庭用温水ポンプを選択する方法?
  11. 温水ポンプの紹介