前回まで/次回以降の取り組みはこちらから。
どんどん続きを作っていきますよー。
今日はArduinoからRaspberryPiにデータを渡すことを考えていきます。
Arduino→Raspberry Piにデータを渡す
ArduinoからRaspberry Piにデータを渡すために、今回はUSBケーブルでつないでシリアル通信で接続します。
Arduino側スケッチの変更
スケッチを変更しました。
一旦テストのために照度データだけをシリアル通信するようにします。
∵照度センサは光を当てたり手で覆ったりすることで簡単に数値を変えられるからです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | // あさがおIoT観察日記 Arduino側プログラム // 2020.05.21 V0.0.1 DHT11による温度・湿度取得(DHT11サンプルスケッチより作成) // V0.0.2 BME280気圧取得(BME280サンプルスケッチより作成) // 2020.05.23 V0.0.3 TEMT6000による照度取得 // 2020.05.24 V0.0.4 KeyStudio製センサで土の水分量取得 // 2020.06.02 V0.0.5 RaspberryPi側通信制御開発のため、一度シリアル送信するのを照度データだけに変更 // 今後の準備としてLED照明、ポンプ、水切れセンサ、ボタンSWに関する制御パートを追加 #define LED_pin 13 #define pump_pin 12 #define SW_B_pin 11 #define SW_R_pin 10 #define sensor_tank 2 #define sensor_water 1 #define sensor_bright 0 #include <Adafruit_Sensor.h> #include <DHT.h> #include <DHT_U.h> #define DHTPIN 2 // Digital pin connected to the DHT sensor #define DHTTYPE DHT11 // DHT 11 DHT_Unified dht(DHTPIN, DHTTYPE); #include <Wire.h> #include <SPI.h> #include <Adafruit_BME280.h> #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; // I2C uint32_t delayMS; int Alt = 120; void setup() { Serial.begin(9600); pinMode(LED_pin, OUTPUT); pinMode(pump_pin,OUTPUT); pinMode(SW_B_pin,INPUT_PULLUP); pinMode(SW_R_pin,INPUT_PULLUP); dht.begin(); delayMS = 1000; bme.begin(0x76); } void loop() { double temp; double temp_0; double humid; double pres; double pres_0; int bright; int water; int tank; delay(delayMS); sensors_event_t event; //温度取得 dht.temperature().getEvent(&event); if (!isnan(event.temperature)) { temp = event.temperature; } //湿度取得 dht.humidity().getEvent(&event); if (!isnan(event.relative_humidity)) { humid = event.relative_humidity; } //気圧取得 pres = bme.readPressure() / 100; pres_0 = pres/(pow((1-((0.0065*Alt)/(bme.readTemperature()+0.0065*Alt+273.15))),5.257)); //海面更生 //照度取得 bright = analogRead(sensor_bright); //水分量取得 water = analogRead(sensor_water); //水やり判断 tank = analogRead(sensor_tank); //シリアル送信 // Serial.println(temp); // Serial.println(humid); // Serial.println(pres); // Serial.println(pres_0); Serial.println(bright); // Serial.println(water); // Serial.println(tank); } |
Raspberry Pi側のソフトの制作
今回は
- シリアル通信を受け取れるようにする
- 照度センサの値をリアルタイムに表示する
所まで作りました。
できた画面はこんな感じ。
前回の画面に照度センサの数値が追加されただけです。
pythonのソースコードはこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #coding:utf-8 # 2020.06.01 V0.0.1 画面作成、現在時刻表示 # 2020.06.02 V0.0.2シリアル通信対応、とりあえず照度データのみ表示 import tkinter as tk import datetime import serial #使用するシリアルポート(Arduino IDEなどで調べる) serialport = "/dev/ttyACM0" #シリアル通信 class SerialCom: def __init__(self): self.sc = serial.Serial(serialport,9600) def data_read(self): rc_data = self.sc.readline() return rc_data def window_refresh(): #時刻更新 now = datetime.datetime.now() label_time =tk.Label(root,text="現在時刻:",font=("Helvetica",18)) label_time.place(x=20,y=15) label_time_v =tk.Label(root,text=now.strftime('%Y/%m/%d %H:%M:%S'),font=("Helvetica",18)) label_time_v.place(x=140,y=15) #照度データ更新 bright = myserial.data_read() bright_text = str("{0:4}".format(int(bright))) label_bright=tk.Label(root,text="照度[Lx]:",font=("Helvetica",18)) label_bright.place(x=20,y=100) label_bright_v=tk.Label(root,text= bright_text ,width=5,anchor="e",font=("Helvetica",18)) label_bright_v.place(x=200,y=100) root.after(100,window_refresh) #メイン画面 root = tk.Tk() root.attributes("-fullscreen", True) root.title("あさがおIoT観察アプリ") #シリアル通信のインスタンス生成 myserial = SerialCom() window_refresh() root.mainloop() |
シリアル通信するポートはwindowsのソフトなんかだと
こんな感じで選択できたりしますが、今回はひとまずArduino IDEで通信できているポートの名前を控えて、pythonファイルに直接書き込んで選択するようにしました。
今は照度データだけを受け取っているので、受け取ったデータをそのまま照度の数値のところに当てはめているだけです。
最終的にはいろいろなセンサの値が届くようになるので、「どのデータがどの数値か?」を判断して、正しい場所に表示していく必要がありますね。
まだまだ続きます。
コメント