LoginSignup
1
2

More than 3 years have passed since last update.

InfluxDBにGPSログを記録する

Last updated at Posted at 2020-04-15

概要

NMEAを吐くGPSモジュールとM5AtomがUARTで通信して、GPS座標、高度、CPU?のシリアル番号をinfluxDBに記録する。

IMG_1303.png

材料

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

    }
  }

}

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2