Python3とArduino(+GROVEスターターキットV3)を使って簡易温度ロガー製作

スポンサーリンク
Arduino
スポンサーリンク

知人からGROVEスターターキットV3を譲り受けたので簡単な温度ロガーを作ってみたいと思います。

基本的な方法は『Python3でArduinoからのデータを受信する』と変わりません。

スポンサーリンク

GroveスターターキットV3とは

Aruduinoなどでプロトタイピングを簡単に行うための温度センサや近接センサなどのセンサ類とArduinoに接続するためのベースシールドのセットです。

<セット内容>
* ベースシールド
* LCD
* リレー
* ブザー
* サウンドセンサ
* タッチセンサ
* 回転角センサ
* 温度センサ
* 照度センサ
* ボタン
* サーボモータ

作るもの

  • ArduinoにGroveのベースシールドと温度センサを取り付ける
  • PCとArduinoでシリアル通信を行い温度データを取得する
  • 取得した温度データは取得時の時間と共にファイルに保存する
  • ボーレートは9600bps
  • Arduinoからの送信は1s周期とする
  • PC側のプログラムはPython3で作成する

ハードウェア

  • Arduino uno
  • GloveスターターキットV3
  • USB-シリアル変換基板(AE-UM232R)
  • ブレッドボード
  • ジャンパワイヤ(適量)
  • USBケーブル×2(ArduinoへのプログラムDL&電源供給用とシリアル通信用)

arduino側のプログラム

githubにサンプルスケッチが公開されているのでそのまま使わせてもらいます。

git clone https://github.com/Seeed-Studio/Sketchbook_Starter_Kit_for_Arduino.git
  • Grove_Temperature_Sensor.ino
// demo of Starter Kit V2.0 - Grove Temperature Sensor
//

const int pinTemp = A0;      // pin of temperature sensor

float temperature;
int B=3975;                  // B value of the thermistor
float resistance;

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

void loop()
{
    int val = analogRead(pinTemp);                               // get analog value
    resistance=(float)(1023-val)*10000/val;                      // get resistance
    temperature=1/(log(resistance/10000)/B+1/298.15)-273.15;     // calc temperature
    Serial.println(temperature);

    delay(1000);          // delay 1s
}

測定間隔はdelay()に渡す引数を変更して調整可能(単位はミリ秒)。

PC側のプログラム

いつもどおりPySerialモジュールを使います。
ますはPySerialモジュールのインストール。

$ sudo pip3 install PySerial

プログラムはこちら。serialで受信したデータはByte型なのでstr型に変換する必要があります。

  • serial_rx.py
    # -*- coding: utf-8 -*-
    import serial,time,datetime
    
    ser = serial.Serial('/dev/ttyUSB0',9600)    #ボーレートは9600bpps
    ser.reset_input_buffer()    #受信バッファのクリア。これをやらないとゴミが混ざる
    
    while True:
    
        line = ser.readline()
        print(line.decode('utf-8'))
        f = open('Result.txt','a')
        f.write(datetime.datetime.today().strftime("%Y/%m/%d %H:%M:%S")+","+line.decode('utf-8'))
        f.close()
    
    ser.close()
    

見てのとおり例外処理なんかは一切考慮していないのでご注意を。

動かす

python3 serial_rx.py

結果

2017/10/02 09:52:33,11.58
2017/10/02 09:52:34,11.58
2017/10/02 09:52:35,11.50
2017/10/02 09:52:36,11.50
2017/10/02 09:52:37,11.50
2017/10/02 09:52:38,11.50
2017/10/02 09:52:39,11.50

11.58℃?実験を行っている室内の温度は25℃前後なのでズレが大きすぎますね。ベースシールドに付いているVCCの切り替えスイッチが3.3V側になっていたので5Vに切り替えてみたところ、取得する値が26℃くらいになりましたこの値は信用できそうです。

製造元のSEEED社?のHPを確認した所、こんな記述がありました。

1.Power Compatible:
Every Grove connector has four wires, one of which is the VCC. However, not every micro-controller main board needs a supply voltage of 5V, some need 3.3V. That’s why we add a power toggle switch to Base Shield v2 so that you can select the suitable voltage of the micro-controller main board you are using via this switch.
For example, if you are using Arduino UNO with Base Shield v2, please turn the switch to 5v position; while using Seeeduino Arch with Base Shield v2, please turn the switch to 3.3v.

と、言うことでArduinoで使用する分にはベースシールドのVCC切り替えスイッチは5V側にしておけば良さそうです。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

新品価格
¥3,996から
(2017/10/2 10:06時点)

コメント