スケッチ(プログラム)の見通しを良くするためにGYSFDMAXBを制御する機能をC++クラス化し、配線を少し修正してから照度センサーを追加しました。テストに使用したスケッチはNMEAセンテンスの中のGGA(Global Positioning System Fix Data)センテンスからデータを測位結果を得るようにしたものです。
次はBluetoothモジュールとArduinoをシリアル接続して、Arduino側でシリアル割り込みの機能を付加し、Konashi(Bluetoothモジュール)からの要求に対して直近の計測データを返す処理を実装してみようと思います。
以前ならこういうことはやろうと思わなかったことですが、敷居がすごく低くなりました。素晴らしいですね。
Arduinoのスケッチ(プログラム)
#include "GYSFDMAXB_GPS.h" #include "BME280.h" #include "L3GD20.h" // Softwareシリアルで使うデジタルピン番号 const byte rxPin = 10; const byte txPin = 11; // 照度センサーから値を読み込むアナログピン番号 const byte illumPin = 0; SoftwareSerial mySerial(rxPin, txPin); GYSFDMAXB_GPS GPS(&mySerial); BME280 BME; L3GD20 GYRO; int illuminance = 0; // GPSレシーバーの設定 void beginGPS() { GPS.begin(9600); GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz更新レート GPS.sendCommand(PGCMD_ANTENNA); delay(1000); mySerial.println(PMTK_Q_RELEASE); } // BME280温湿度・気圧センサーの設定 void beginBME() { if(!BME.begin( BME280_ADDRESS, BME.BME280_STANDBY_1000, BME.BME280_FILTER_OFF, BME.BME280_SPI3_DISABLE, BME.BME280_TEMP_OVERSAMPLING_1, BME.BME280_PRESS_OVERSAMPLING_1, BME.BME280_MODE_NORMAL, BME.BME280_HUMID_OVERSAMPLING_1)) { Serial.println("Unable to initialize BME280 sensor"); while(true); } } // L3GD203軸ジャイロセンサーの設定 void beginGYRO() { if(!GYRO.begin(GYRO.L3GD20_RANGE_250DPS)) { Serial.println("Unable to initialize L3GD20"); while(true); } } void setup() { Serial.begin(57600); while(!Serial) { ; } Serial.println("Hello"); beginGPS(); beginBME(); beginGYRO(); } // 計測したデータをJSON形式に変換 String jsonResult() { String str = "{"; str += "\"gps.hour\":"; str += GPS.data.hour; str +=","; str += "\"gps.minute\":"; str += GPS.data.minute; str +=","; str += "\"gps.seconds\":"; str += GPS.data.seconds; str +=","; str += "\"gps.milliseconds\":"; str += GPS.data.milliseconds; str +=","; str += "\"gps.year\":"; str += GPS.data.year; str +=","; str += "\"gps.month\":"; str += GPS.data.month; str +=","; str += "\"gps.day\":"; str += GPS.data.day; str +=","; str += "\"gps.fix\":"; str += GPS.data.fix; str +=","; str += "\"gps.quality\":"; str += GPS.data.fixquality; if(GPS.data.fix) { str += ","; str += "\"gps.latitude\":"; str += GPS.data.latitude; str += GPS.data.lat; str +=","; str += "\"gps.longitude\":"; str += GPS.data.longitude; str += GPS.data.lon; str +=","; str += "\"gps.speed\":"; str += GPS.data.speed; str +=","; str += "\"gps.angle\":"; str += GPS.data.angle; str +=","; str += "\"gps.altitude\":"; str += GPS.data.altitude; str +=","; str += "\"gps.sattelites\":"; str += GPS.data.satellites; } str += ","; str += "\"illuminance\":"; str += illuminance; str +=","; str += "\"temperature\":"; str += (double)BME.data.temperature; str +=","; str += "\"pressure\":"; str += (double)BME.data.pressure; str +=","; str += "\"humidity\":"; str += (double)BME.data.humidity; str +=","; str += "\"degree.x\":"; str += (int)GYRO.data.x; str +=","; str += "\"degree.y\":"; str += (int)GYRO.data.y; str +=","; str += "\"degree.z\":"; str += (int)GYRO.data.z; str += "}"; return str; } uint32_t timer = millis(); // 計測 void loop() { String json; if(GPS.newSentenceReceived()) { if(!GPS.parse(GPS.lastSentence())) return; } if(timer > millis()) timer = millis(); if(millis() - timer > 2000) { timer = millis(); illuminance = analogRead(illumPin); BME.read(); GYRO.read(); json = jsonResult(); Serial.println(json); } }
計測したデータ
{ "gps.hour":10, /* 時 */ "gps.minute":27, /* 分 */ "gps.seconds":10, /* 秒 */ "gps.milliseconds":0, /* ミリ秒 */ "gps.year":16, /* 年 */ "gps.month":3, /* 月 */ "gps.day":11, /* 日 */ "gps.fix":1, /* 測位の可否 */ "gps.quality":1, /* 測位品質 */ "gps.latitude":3521.68N, /* 緯度 */ "gps.longitude":13932.27E, /* 経度 */ "gps.altitude":32.20, /* 海抜高度 */ "gps.sattelites":5, /* 測位利用衛星数 */ "illuminance":50, /* 照度 */ "temperature":16.36, /* 気温 */ "pressure":1018.05, /* 気圧 */ "humidity":56.56, /* 湿度 */ "degree.x":1, /* X軸傾き */ "degree.y":0, /* Y軸傾き */ "degree.z":0 /* Z軸傾き */ }
注意
小さなメモリで動いているマイコンなので、JSON文字列を作るときにバッファオーバーフローのような現象が出ました。キーの名前を短くするなどの対応をして解決しました。
I2C対応のセンサーモジュールはArduinoよりも低電圧で動作するものが多いので、信号の電圧レベル変換が必要らしいです。近々、回路を修正します。
ディスカッション
コメントはまだありません。