ともさんのHP >ものつくり >ラズパイ(Raspberry Pi)で電子工作 >ラズパイとArduinoの間でシリアル通信
ラズパイとArduinoの間でシリアル通信
Arduinoに気象センサーをつけて家の外の観測箱に設置、家の中から計測できるようにしました。最初はパソコンとArduinoを繋いでいましたが、24時間計測したいのでパソコンをラズパイに差し替えました。
ラズパイ楽天 とアルディの間は10mのUSBケーブルでつないであります。Arduinoの電源もこのUSBケーブルから供給されています。ラズパイとArduino間はシリアル通信でデータをやり取りをしています。
ラズパイ側のプログラム
定期的に時刻を調べて30分ごとにArduinoへ気象センサーのデータを出すよう指令を出します。USBテーブルには他にUSBカメラもつけてあって、こちらは10秒ごとに撮影して雲のタイムラプス画像を作るようにしています。
ラズパイとArduino
Arduino側のプログラム
シリアルケーブルから特定の文字が送られてきたらセンサーの温度湿度気圧データを取得して返信します
#include <Wire.h>
#include "SparkFunBME280.h"
BME280 sensor;
//気温
float tmp=-1.;
//湿度
float hum=-1.;
//気圧
float hpa=-1.;
boolean serialreceived= false;
void setup() {
Serial.begin(9600);
Wire.begin();
sensor.beginI2C(); // Wire を用いて I2C 接続開始
}
void loop() {
if( serialreceived ){
sokutei();
send();
serialreceived= false;
}
}
//シリアル割り込み処理
void serialEvent(){
if(Serial.available()>0) {
int incomingByte = Serial.read(); // 受信データを読み込む
if( incomingByte==72 ){ serialreceived= true; }//Hを受け取っていたら
}
}
//データを発送する
void send(){
// Serial.print( 'G' );
// Serial.print( ',' );
//気温湿度気圧の送信
Serial.print( tmp , 2 );
Serial.print( ',' );
Serial.print( hum , 2 );
Serial.print( ',' );
Serial.print( hpa / 100.0, 1);
return;
}
//センサーから気象情報を得る
void sokutei(){
// Serial.print("Temp: ");
tmp = sensor.readTempC();
// Serial.print( tmp[i] , 2);
hum = sensor.readFloatHumidity();
// Serial.print(" °C, Humidity: ");
// Serial.print( hum[i] , 2);
hpa = sensor.readFloatPressure();
// Serial.print(" %, Pressure: ");
// Serial.print( hpa[i] / 100.0, 1);
// Serial.println(" hPa");
return;
}
ラズパイだけで十分なのでは
家の中にラズパイを置いて10mのUSBケーブルの先にある観測箱のディノと
UBSカメラ
楽天 を設置していますが、観測箱の中にラズパイをおけばArduinoは不要になります。
データの引き抜きはwi-fiで行なっているので外とwi-fi通信ができれば、観測箱へUSBケーブルの代わりに充電ケーブルを繋げばOKです。
今回の場合先にUSB
カメラ
楽天 をつけていてUSBケーブルが既に設置済みでした。なのでわざわざ充電ケーブルに差し替えるのが手間だったのです。
今の方式だとラズパイの代役としてパソコンを使うことも可能です。こちらの方が汎用性も高いしということでこんな構成になりました。
mport datetime
def add():
ser = serial.Serial('/dev/ttyACM0', 9600,timeout=5)#ACM0
#setuzokujini Arduinogarisettosurunode 2byoumatu
time.sleep(2)
ser.write(b'H')
time.sleep(1)
str = ser.readline()
str2 = str.decode()
print(str2)
#print( str2.split(',') )
#close suruto Arduinoga risetto suru
ser.close()
#print("aaa")
dt_now = datetime.datetime.now()
with open('/home/pi/workspace/test.csv' , mode='a') as f:
f.write('\n')
f.write(dt_now.strftime('%Y/%m/%d %H:%M:%S'))
f.write(',')
f.write(str2)
return
if __name__ == "__main__":
add()
観測結果
こんな感じで温度をグラフ化できます。欠測しているところは、USBカメラとの通信に失敗して停まってしまったためです。
温度グラフ
ちなみに雲のタイムラプス動画はこんな感じになります。
最終更新日: 2021-10-21 06:09:29
ともさんのHP >ものつくり >ラズパイ(Raspberry Pi)で電子工作 >ラズパイとArduinoの間でシリアル通信
ツイート