概要
NMEAを吐くGPSモジュールとM5AtomがUARTで通信して、GPS座標、高度、CPU?のシリアル番号をinfluxDBに記録する。
材料
・M5 ATOM Lite
・NMEAを出すGPSモジュール
・UDP通信可能なInfluxDBが動いているサーバ
前提条件
・GPSモジュールとの通信
GPSモジュールとの通信速度は115200bpsです。違う場合は該当箇所を変更してください。
また、UART通信をGROVEコネクタを流用して使っています。具体的には以下のように宣言しています。GROVEを他の目的で使う場合は該当箇所を変更してください。
Serial2.begin(115200,SERIAL_8N1,26,32);
・influxDBの前準備
udpを有効にして、データベースを作成しておいてください。
あと、どうにかしてinfluxDBに繋がるIPアドレスも必要です。
参考資料
https://www.influxdata.com/blog/how-to-send-sensor-data-to-influxdb-from-an-arduino-uno/
使ったライブラリ
・ESP32とM5Stackのライブラリ
・Tiny GPS++ http://arduiniana.org/libraries/tinygpsplus/
ソース ATOM
ソース
# include <TinyGPS++.h>
# include <WiFi.h>
# include <WiFiUDP.h>
# include "WiFiMulti.h"
WiFiMulti wifimulti;
# include "M5StickC.h"
const char* ssid1 = "wifi-1";
const char* password1 = "pass1";
const char* ssid2 = "wifi-2";
const char* password2 = "pass2";
// the IP address of your InfluxDB host
byte udphost[] = {192, 168, 1, 1};
int port = 8089;
WiFiUDP udp;
// The TinyGPS++ object
TinyGPSPlus gps;
void setup()
{
Serial2.begin(115200,SERIAL_8N1,26,32);
Serial.begin(115200);
delay(10);
wifimulti.addAP(ssid1,password1);
wifimulti.addAP(ssid2,password2);
if(wifimulti.run() == WL_CONNECTED){
delay(1000);
Serial.print(".");
}
Serial.println(WiFi.SSID());
}
void loop()
{
uint8_t chipid[6];
esp_efuse_read_mac(chipid);
while (Serial2.available() > 0) {
char c = Serial2.read();
gps.encode(c);
if (gps.location.isUpdated()) {
String latnum=String(gps.location.lat(),9);
String lngnum=String(gps.location.lng(),9);
String high=String(gps.altitude.meters());
String id=String(chipid[0],HEX)+String(chipid[1],HEX)+String(chipid[2],HEX)+String(chipid[3],HEX)+String(chipid[4],HEX)+String(chipid[5],HEX);
String line;
line="gps,device="+id+" lat="+latnum+",lng="+lngnum+",high="+high;
Serial.println(line);
Serial.println("Sending UDP packet...");
udp.beginPacket(udphost, port);
udp.print(line);
udp.endPacket();
delay(10000);
}
}
}
ソース M5Stack+M5Stack用GPSモジュール V2
ソース
# include <TinyGPS++.h>
# include <WiFi.h>
# include <WiFiUDP.h>
# include "WiFiMulti.h"
WiFiMulti wifimulti;
# include "M5Stack.h"
//#include "M5StickC.h"
//#include "M5Atom.h"
# include <Wire.h>
const char* ssid1 = "WiFi1";
const char* password1 = "pass1";
const char* ssid2 = "WiFi2";
const char* password2 = "pass2";
// the IP address of your InfluxDB host
byte udphost[] = {192, 168, 1, 60};
int port = 8089;
WiFiUDP udp;
// The TinyGPS++ object
TinyGPSPlus gps;
void setup()
{
M5.begin();
M5.lcd.setBrightness(20);
M5.Lcd.fillScreen(BLUE); // 背景を青にする
M5.Lcd.setTextSize(2);
Serial2.begin(9600);
Serial.begin(115200);
delay(10);
wifimulti.addAP(ssid1,password1);
wifimulti.addAP(ssid2,password2);
if(wifimulti.run() == WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println(WiFi.SSID());
}
void loop()
{
uint8_t chipid[6];
esp_efuse_read_mac(chipid);
while (Serial2.available() > 0) {
char c = Serial2.read();
gps.encode(c);
if (gps.location.isUpdated()) {
String latnum=String(gps.location.lat(),9);
String lngnum=String(gps.location.lng(),9);
String high=String(gps.altitude.meters());
String id=String(chipid[0],HEX)+String(chipid[1],HEX)+String(chipid[2],HEX)+String(chipid[3],HEX)+String(chipid[4],HEX)+String(chipid[5],HEX);
String line;
line="gps,device="+id+" lat="+latnum+",lng="+lngnum+",high="+high;
Serial.println(line);
M5.Lcd.setCursor(0, 0, 1);
M5.Lcd.println(line);
udp.beginPacket(udphost, port);
udp.print(line);
udp.endPacket();
delay(1000);
}
}
}