Arduino筆記(78):利用Python讀取序列埠溫濕度值儲存到csv檔

上一篇 Arduino筆記(77):在Windows下使用Python 從序列埠讀取 Arduino 感測值 實做使用 Python 讀取串列埠的資料繪製成圖形,另一個應用是將讀取的感測值,儲存到 Excel 檔,就可以用 Excel 的繪圖功能,繪出折線圖。這個實做就來看看如何利用 Python 讀取串列埠傳來的感測值,並存成 Excel 可以讀取的 CSV 檔。


[安裝AM2320程式庫]

本實作需要安裝以下程式庫:
程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)

[線路圖]


[程式]

以下是Arduino程式:讀取AM2320的溫濕度值,送到COM Port,可以打看串列埠視窗,每 5  秒鐘測得一個感測值。
#include <Wire.h>
#include <AM2320.h>
AM2320 th(&Wire);
int line_count=0;

void setup() {
  Serial.begin(9600);  
  Wire.begin();
}

void loop() {
  int ths = th.Read();
  switch(ths) {
    case 2:
      Serial.println("CRC failed");
      break;
    case 1:
      Serial.println("Sensor offline");
      break;
    case 0:
      // 第一列印出 Excel 標題列
      if(line_count == 0) {
        Serial.println("temperature,humidity");
      }  
      else {
        Serial.print(th.cTemp);
        Serial.print(",");
        Serial.println(th.Humidity);
      }
      line_count ++;
    break;
  }
  // 5秒鐘讀取一筆資料
  delay(5000);
}
以下是Python程式:讀取COM Port的資料,我的 Arduino 用的序列埠是COM11,可以實際執行的 COM Port修改程式,並在命令視窗執行程式。
C:\>python your_prgoram_name.py
在撰寫程式過程中,遇到一個狀況是從 Python 讀取序列埠的一列文字時,將這串文字轉成變數時,在每個欄位前面會出現「b'」,如下圖:

為了解決這個問題,找了一下資料,只要做 utf-8 字元集的轉換即可,也就是程式中的「data_raw = data_in.decode('utf-8')」這一行。Line_count變數是判斷是否為第一列,如果是就擷取不同字段的文字,會截出「temperature」跟「humidity」。
import csv
import serial

SerialIn = serial.Serial("COM11",9600)

with open('AM2320.csv', mode='w' , newline='') as am2320_file:
   am2320_writer = csv.writer(am2320_file, delimiter=',')
   line_count=0 
   try:
       while True:
           while SerialIn.in_waiting:
               data_in = SerialIn.readline() 
               data_raw = data_in.decode('utf-8') 
               print(data_raw)

               if line_count==0:
                  temper = str(data_raw[0:11])
                  humid  = str(data_raw[12:20])                 
               else:
                  # Turn string into float value:   
                  temper = float(str(data_raw[0:5]))
                  humid  = float(str(data_raw[6:12]))

               am2320_writer.writerow([temper,humid])

               line_count = line_count + 1

   except KeyboardInterrupt:
       SerialIn.close()   

[結果]

開啟 Arduino 的串列埠,可以看到溫濕度感測值:

寫到與執行 Python 程式相同目錄的 CSV 檔,可以用 Excel 開啟,結果如下:

[參考資料]

1 留言

張貼留言

較新的 較舊