InfluxDBにGPSログを記録する


概要

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);

    }
  }

}