ESP32-S3-WROOM1とSIM7080GでIOT開発（１日目）

![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473778/2a08ddec-fa28-3f4c-eeed-3de10ccc6cb5.jpeg)

LilyGo-T-SIM7080Gを購入した。

ESP32とSIM7080Gがセットになっている。

これで、Wifiのない環境でもIoTを導入できるはず。

電子工作も組込開発も経験ゼロのど素人だが、

2023年、我々にはGoogleとChatGPTそしてDEEPLがある！

5年前にLoRaでIoTを導入しようとしたが挫折してしまった。

やる気さえあれば知識はいらない時代になったのだ（と思いたい）。



SIM7080GはLTEとGPSが使える。

LilyGo-T-SIM7080Gはソーラーパネルで充電できるようだ。

カメラを差し込む端子もついている。

ドキュメントはGitHubにメーカーが置いてくれている。

https://github.com/Xinyuan-LilyGO/LilyGo-T-SIM7080G

しかも安い！！送料込みで5000円以下！！もちろん、みんな大好き技適マーク付き。

さて手始めに、GPSで座標を取得してみたが、

AT+CGNSINF
AT+CGNSINF

+CGNSINF: 1,,,0.000000,0.000000,-18.000,,,1,,0.1,0.1,0.1,,,,9999000.0,6000.0

OK
AT+CGNSINF
AT+CGNSINF

+CGNSINF: 1,,,0.000000,0.000000,-18.000,,,1,,0.1,0.1,0.1,,,,9999000.0,6000.0

OK

と表示される。

動いてるっぽいけど、屋内だと座標を取得できないらしい。屋外に移動しても、

AT+CGNSINF　のみ表示されるだけ。

一度室内に戻って、リセットしてGPSアンテナを差し直したら動いた。

OK
AT+CGNSINF
AT+CGNSINF

+CGNSINF: 
（数字がいっぱい）

OK

lat:（数字がいっぱい）	lon:（数字がいっぱい）
speed:9.94	altitude:-2835.54
year:2023 montoh:7 day:20 hour:14 minutes:23 second:30

うーん、よくわからん。まずは、座標をGoogleMAPで表示するとかを作らないといけないなぁ。



+CGNSINF:  ってなんですか？

CHATGPTの回答


「`+CGNSINF`は、SIM7080GモジュールからのGPS情報を取得するためのATコマンドです。このコマンドを使用すると、現在の位置情報やその他のGPS関連の情報を取得できます。

具体的には、以下のような情報を含んでいます：

```
+CGNSINF: <gnss run status>,<fix status>,<UTC date & time>,<latitude>,<longitude>,<altitude>,<speed>,<course>,<fix mode>,<HDOP>,<PDOP>,<VDOP>,<GPS satellites in view>,<GNSS satellites used>,<GLONASS satellites used>,<BEIDOU satellites used>,<GNSS satellites in view info>,<GNSS satellites used info>,<GLONASS satellites used info>,<BEIDOU satellites used info>
```

- `<gnss run status>`: GNSSモジュールの実行状態（0: 非動作、1: 動作中）
- `<fix status>`: 位置情報の取得状態（0: 位置情報なし、1: 位置情報あり）
- `<UTC date & time>`: 協定世界時（UTC）での日付と時刻
- `<latitude>`: 緯度
- `<longitude>`: 経度
- `<altitude>`: 高度
- `<speed>`: 速度
- `<course>`: 方位角
- `<fix mode>`: 位置情報の取得モード（0: 2D Fix、1: 3D Fix）
- `<HDOP>`: 水平精度指標 (HDOP: Horizontal Dilution of Precision)
- `<PDOP>`: 位置精度指標 (PDOP: Position Dilution of Precision)
- `<VDOP>`: 垂直精度指標 (VDOP: Vertical Dilution of Precision)
- `<GPS satellites in view>`: 可視衛星数（GPS）
- `<GNSS satellites used>`: 使用衛星数（全GNSS）
- `<GLONASS satellites used>`: 使用衛星数（GLONASS）
- `<BEIDOU satellites used>`: 使用衛星数（BEIDOU）
- `<GNSS satellites in view info>`: 可視衛星情報（全GNSS）
- `<GNSS satellites used info>`: 使用衛星情報（全GNSS）
- `<GLONASS satellites used info>`: 使用衛星情報（GLONASS）
- `<BEIDOU satellites used info>`: 使用衛星情報（BEIDOU）

したがって、`+CGNSINF`コマンドの応答を解析することで、現在の位置情報やその他のGPS関連の情報を取得することができます。」


なるほど、、、

実際に測った場所から3.5kmくらい誤差がある。

そして、俺は今、altitude:-2835.54

-2835mの地下世界におるんやな。


追記）

やっぱ屋外の開けたところじゃないとGPS信号を取得しないみたい。開けたところならちゃんと取得できた。かなり正確。

逆にiPhoneとか屋内でも位置座標でるからすごいよな。

GPSにも種類があるみたいで、ChatGPT曰く

『上記のコードのコメントセクションでは、GNSSの動作モードを設定するためのATコマンドが説明されています。GNSSの各システム（GPS、GLONASS、BEIDOU、GALILEO、QZSS）のNMEAデータの出力を制御するために使用されます。

各モードの設定は次のようになります：

- `gps mode`: GPSの動作モードを設定します。1を指定するとGPSのNMEAデータの出力が開始されます。

- `glo mode`: GLONASSの動作モードを設定します。0を指定するとGLONASSのNMEAデータの出力が停止されます。

- `bd mode`: BEIDOUの動作モードを設定します。0を指定するとBEIDOUのNMEAデータの出力が停止されます。

- `gal mode`: GALILEOの動作モードを設定します。0を指定するとGALILEOのNMEAデータの出力が停止されます。

- `qzss mode`: QZSSの動作モードを設定します。0を指定するとQZSSのNMEAデータの出力が停止されます。

上記のコードでは、GNSSの動作モードを設定するためのATコマンドがコメントアウトされているため、GNSSモードの設定が行われません。必要に応じて、GNSSシステム（例えば、GPS、BEIDOU、QZSS）のNMEAデータ出力を開始するために、適切なATコマンドを使用して設定を行ってください。』だそうだ。

つまり、日本仕様だと

// GNSS Work Mode Set GPS+QZSS
modem.sendAT("+CGNSMOD=1,0,0,0,1");
modem.waitResponse();

/*
GNSS Command,For more parameters, see <SIM7070_SIM7080_SIM7090 Series_AT Command Manual> 212 page.
<minInterval> range: 1000-60000 ms
 minInterval is the minimum time interval in milliseconds that must elapse between position reports. default value is 1000.
<minDistance> range: 0-1000
 Minimum distance in meters that must be traversed between position reports. Setting this interval to 0 will be a pure time-based tracking/batching.
<accuracy>:
    0  Accuracy is not specified, use default.
    1  Low Accuracy for location is acceptable.
    2 Medium Accuracy for location is acceptable.
    3 Only High Accuracy for location is acceptable.
*/
// minInterval = 1000, minDistance = 0, accuracy = 0
modem.sendAT("+SGNSCMD=2,1000,0,0");
modem.waitResponse();


が良いらしい。ただし、

『上記のコードでは、GNSSの動作モードをGPSとQZSSに設定しています。また、最小インターバルを1000ミリ秒（1秒）に設定し、最小距離を0メートルに設定しています。これにより、位置情報のレポート間の最小時間間隔と最小距離が設定されます。

これらの設定を適用すると、日本の地域で正確なGPS情報を取得できるようになります。ただし、環境によってはGPS信号の受信が妨げられる場合があります（例：建物の内部や深い谷間など）。屋外の開けた場所でテストすることをおすすめします。』

ま、とにかく開けたところでね〜ってことだ。