SCP1000 + Arduino + CentOS6.4 データ取得法改善
公開日:
:
プログラミング
結構な頻度でデータの取りこぼしや異常数値を記録してしまい、グラフがいびつになってしまうので、Arduino側のプログラムとCentOS側のプログラムの双方を変更しました。その記録。
目次
Arduino側プログラムの変更
Arduinoで気圧計測より戴いたSPC1000forArduino1_0.zipを若干変更しました。
- スタートアップメッセージを削除
- 温度・気圧の両方とも異常値を除去するようにした
- 強引ですが、電圧の関係か温度が違いすぎるため、逆算して温度変換の定数を80.0から88.2に変更(TempC = temp_in / 88.2; // Convert to real DegC
)
Arduino側で変な数字を排除してるため、cactiのグラフがきれいになりました。ありがとうございます!
CentOS側プログラムはPythonに変更
CenOS側での取得プログラムも変更しました。今回はPythonに挑戦です。こういうことは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 |
#!/usr/bin/python # -*- coding: utf-8 -*- import serial import time import datetime # シリアルポートオープン # タイムアウトは3秒に設定。Adruino側では1秒ごとにデータ吐き出し ser=serial.Serial('/dev/ttyUSB0', 38400, timeout=3) # 1行取得後、改行除去 line = ser.readline().strip() # 時刻取得・時刻書式設定 now = datetime.datetime.now() read_time = now.strftime("%Y-%m-%dT%H:%M:%S+09:00") # CSV形式で出力 p=大気圧 t=温度 # YYYY-MM-DDTHH:MM:SS+09:00,pppp.pp,tt.tt res = read_time + ',' + line print res # シリアルポートクローズ ser.close() |
保存したデータからcacti,xively(旧Pachube)へはそのまま
以前と同じ
SCP1000+Arduino+Pachube+cacti | 望遠鏡ドットコム
の下のほうに記録してある方法です。Pachubeはxivelyに変わりましたが、Pachubeのまま使えている状態。
SPC1000forArduino1_0.zip内のSCP1000testFor1_0.inoからの変更点差分
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 |
158c158 < Serial.println("Starting up"); --- > // Serial.println("Starting up"); 162c162 < Serial.println("Initializing SCP1000..."); --- > // Serial.println("Initializing SCP1000..."); 176a177 > long int temperature_value, temperature_values[pressure_buff_size]; 183a185 > temperature_values[i]= (long int)(scp1000.TempC * 100.0); 187c189,190 < --- > temperature_value = getMean(temperature_values, pressure_buff_size, false); > 189,191c192 < Serial.print("$TTM,utc,lat,lon,height,"); < Serial.print(scp1000.TempC); < Serial.print(",Pressure (hPa),"); --- > 194,197c195,208 < long int decimal = (pressure_value % 1000l) / 10l; < Serial.print(decimal / 10l); < Serial.print(decimal % 10l); < Serial.println("*"); --- > long int decimal_pressure = (pressure_value % 1000l) / 10l; > Serial.print(decimal_pressure / 10l); > Serial.print(decimal_pressure % 10l); > > Serial.print(","); > > Serial.print(temperature_value / 1000l); > Serial.print("."); > long int decimal_temperature = (temperature_value % 1000l) / 10l; > Serial.print(decimal_temperature / 10l); > Serial.println(decimal_temperature % 10l); > > // Serial.print("\n"); > 200c211 < } --- > } |