Raspberry pi 3とArduinoの連携によるハリネズミ温度管理システムの改良Ver1.1
前回はArduinoを用いた温度の取得とLEDによる警告を行うシステムを作りました。
今回はRaspberry piとシリアル通信によりデータを共有し、もう少し改良を行います。
- やる事
前回のArduino側のソースコードを少し変更しました。
↓変更部分
void loop(){ // アナログピンから計測値を取得(0〜203) a_in = analogRead(0); // 入力値を摂氏に換算 temp_c = ((5 * a_in) / 1024) * 100; // 改行しながら出力 Serial.println( temp_c );
シリアル通信でデータを投げる部分は温度だけ投げるように変更しました。
これでRaspberry pi とUSB接続してRaspberry pi 側で取得のプログラムを書けば温度が取得できるはずです。
- Raspberry pi側のソースコード
こちらはPythonを用いてプログラムを書いていきます。
シリアル通信によるデータ取得とメール送信用のプログラムは以下のようになります。
# -*- coding: utf-8 -*- import serial import time import os.path import datetime import smtplib from email import Encoders from email.Utils import formatdate from email.MIMEBase import MIMEBase from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText #Google account ADDRESS = "送信用のアドレス" PASSWARD = "パスワード" #SMTP Server SMTP = "smtp.gmail.com" PORT = 587 def create_message(from_addr, to_addr, subject, body): msg = MIMEMultipart() msg["From"] = from_addr msg["To"] = to_addr msg["Date"] = formatdate() msg["Subject"] = subject body = MIMEText(body) msg.attach(body) return msg def send(from_addr, to_addrs, msg): smtpobj = smtplib.SMTP(SMTP, PORT) smtpobj.ehlo() smtpobj.starttls() smtpobj.ehlo() smtpobj.login(ADDRESS, PASSWARD) smtpobj.sendmail(from_addr, to_addrs, msg.as_string()) smtpobj.close() if __name__ == '__main__': count = 0; ser = serial.Serial('/dev/ttyACM0', 9600) print(ser.portstr) time.sleep(3) while 1: time.sleep(1) data = ser.readline() if count > 0: data = float(data) print(time.ctime() + ', ' + str(data)) if data < 20 : #adress to_addr = "送信先のアドレス" #subject and body subject = "温度警告" body = "現在の温度 " + str(data) + "度です。\n温度調節して下さい。" #create message msg = create_message(ADDRESS, to_addr, subject, body) #send send(ADDRESS, [to_addr], msg) print('send aleart message.\n') count = count + 1
- 実行結果
計測した温度が20度を下回った際に警告のメールが送信されるようになりました。
実際に送られてきたメール
- まとめ
ArduinoとRaspberry piを連携させたシステムを構築した。
Arduinoではセンサーの管理、Raspberry piではメール送信などの仕事をさせた。
何か他に良いアイディアが思いついたら随時追加していきます。