Giter Site home page Giter Site logo

esp32-nmea2000's Introduction

NMEA2000-Gateway with ESP32

Based on the work of

This project is part of OpenBoatProjects.

Important Hint

Although the term NMEA2000 is used here, the software or device is not a certified NMEA2000 device as it did not pass any approval process. There are chances that the software / device does not follow the NMEA2000 specification at several points. If you connect the device to your NMEA2000 network you do this on your own risk.

Goal

Have a simple ready-to-go ESP32 binary that can be flashed onto a M5 Atom CAN, potentially extended by an Atom Tail485 for NMEA0183 connection and power supply.

But will also run on other ESP32 boards see Hardware.

What is included

  • a NMEA2000 to Wifi (NMEA0183) gateway
  • a NMEA2000 to USB (NMEA0183) gateway
  • a NMEA0183 Multiplexer
    • Wifi to Wifi
    • Wifi to USB
    • Wifi to RS485
    • and reverse
  • a NMEA0183 RS485 to NMEA2000 gateway
  • a Wifi (NMEA0183) to NMEA2000 gateway
  • an USB (NMEA0183) to NMEA2000 gateway
  • a WEB UI to configure the gateway and to show the data that has been received
  • a USB Actisense to NMEA2000 gateway
  • a NMEA2000 to USB Actisense gateway
  • starting with 201311xx some I2C Sensors
  • starting with 20240324 SSI rotary encoders

For the details of the mapped PGNs and NMEA sentences refer to Conversions.

Hardware

The software is prepared to run on different kinds of ESP32 based modules and accessoirs. For some of them prebuild binaries are available that only need to be flashed, others would require to add some definitions of the used PINs and features and to build the binary. For the list of hardware set ups refer to Hardware.

There is a couple of prebuild binaries that you can directly flash to your device. For other combinations of hardware there is an online build service that will allow you to select your hardware and trigger a build.

Installation

In the release section you can find a couple of pre-build binaries.
They are devided into binaries for an initial flash (xxx-all.bin) and binaries for updating an existing device (xxx-update.bin).

For other Hardware refer to the online build service.

Initial Flash


Browser

If you run a system with a modern Chrome or Edge Browser you can directly flash your device from within the browser. Just go to the Flash Page and select the "Initial" flash for your Hardware. This will install the most current software to your device. If you are on Windows you will need to have the correct driver installed before (see below at windows users - only install the driver, not the flashtool).

You can also install an update from the flash page but normally it is easier to do this from the Web Gui of the device (see below).

The Flash Page will also allow you to open a console window to your ESP32.

Tool based

To initially flash a deviceyou can use ESPTool. The flash command must be (example for m5stack-atom):

esptool.py --port XXXX --chip esp32 write_flash 0x1000  m5stack-atom-20211217-all.bin

For the meaning of the board names have a look at Hardware. For details refer to the code in platformio.ini and look for the hardware definitions in GwHardware.h. Additionally there is a small GUI for the esptool included here at tools/flashtool/flashtool.py

linux users
You can typically install the esptool (once you have python 3 installed) with

sudo pip install esptool

To use the flashtool just download flashtool.pyz.

sudo pip install tkinter
sudo pip install pyserial

Afterwards run flashtool.pyz with

python3 flashtool.pyz

windows users
You need to install the driver for the serial port to connect your ESP32 board. For a modern windows the driver at FTDI should be working. After installing the driver check with your device manager for the com port that is assigned to your connected esp device.

For the flashtool you can find a prebuild executable in tools: esptool.exe. Just create an empty directory on your machine, download the esptool to this directory and also download the binary (xxx-all.bin) from releases.

Open a command prompt and change into the directory you downloaded the esptool.exe and the firmware binary. Flash with the command

esptool.exe --port COM3 write_flash 0x1000 xxxxx-xxxx-all.bin

Replace COM3 with the port shown in the device manager and the xxx with the name of the downloaded binary.

If you do not want to use the command line there is a tool with an UI that allows you to flash the initial or update firmware. Just download the exe for your windows system from the ESP32N2K-Flasher Git Repository. There is no installation needed - just start the downloaded exe. Some Anti Virus Software may (accidently) tag this as infected. In this case you can still install the UI in two steps:

  • you first need to install python3 from the download page - use the Windows 64 Bit installer. Install using the default settings.
  • Afterwards download flashtool.pyz and run it with a double click.

Update


To update a device you can use the Web-UI (Update tab). In principle you could also update a device using the initial flash command (and an xxx-all.bin) firmware but this would erase all your configuration. So for normal operation just download a xxx-update.bin from the release page and use the UI to install it.

install.

When you choose a file for the update the UI will check if it is a valid firmware file and will reject invalid ones. To really execute the update click the "Upload" button. You will have a progress indicator and get a notification about the update result. Please reload the page in your browser after the "connected" state is green as the new version could have changes thatv otherwise will not work.

Starting

After flushing a wifi access point is created. Connect to it (name: ESP32NMEA2K, password: esp32nmea2k). Afterwards use a Bonjour Browser, the address ESP32NMEA2k.local or the ip address 192.168.15.1 to connect with your browser. You will get a small UI to watch the status and make settings. If you want to connect to another wifi network, just enter the credentials in the wifi client tab and enable the wifi client. For all the potential inputs and outputs (NMEA2000, USB, TCP, RS485) you can set the configuration including NMEA0183 filtering. To store your changes you will be asked for an admin password. The initial one is esp32admin. You can change this password at the config/system tab (and even completely disable it). Be careful to notice the password - you can only recover from a lost password with a factory reset of the device (long press the led button until it goes blue->red->green). On the data page you will have a small dashboard for the currently received data. On the status page you can check the number of messages flowing in and out. To help you recover lost passwords the Wifi access point passowrd and the admin password will be output at the USB port when the device starts up. So by connecting a terminal program you can retrieve those passwords.

Security Hints

You should only connect the Wifi of the device to trusted networks. There is only some very limited protection against network sniffing of denial of service attacks. Never connect the device directly to the internet without a firewall in between (like e.g. your Wifi or LTE router). Especially be careful when connecting to open port networks. When making changes you will be asked for the admin password - and this one is always send somehow encrypted. But when you change the Wifi access point password or the Wifi client password it will be sent in clear text. When you enable the "remember me" for the admin password it will be stored in clear text in your browser (use ForgetPassword to remove it from there).

Conversion from and to NMEA0183 XDR

The gateway can convert a lot of NMEA 2000 PGNs that have no direct NMEA0183 equivalent to NMEA0183 XDR records. For details refer to XdrMappings

Development Environment

PlatformIO.

Extending the Software

To give room for adding own software and still being able to keep in sync with this master part there is a concept of user tasks that will allow you to add your own hardware definitions and to add code that should be executed without the need to change parts of the existing software. For details refer to the example description.

Changelog

20240428


  • fix build error with M5 gps kit 20240324

  • add SSI rotary encoders
  • add some options to the converter (RMC rate, RSA parameters)
  • support for the M5 Atomic PortABC - more grove ports #58
  • some restructuring in the hardware definitions
  • add SSID to status page #37
  • allow to attach i2c sensors to the grove ports in the build service
  • add calset and calval config types
    This requires to write current values of a sensor at the api with setCalibrationValue. The user can then bring up a calibration dialog and can set the current value as the config value.
  • change log flushing to USB port that prevented ESP32 S3 based boards to start if no USB connection was available
  • prevent the Web UI from appearing frozen if there was a large amount of invalid NMEA data received #60

20231228


  • lock AsyncTCP-esphome to 2.0.1 to avoid compile errors
  • own main loop to avoid deadlocks with serial send in user tasks

20231105


  • support for ESP32-S3
  • own TWAI based driver for the NMEA2000 bus
  • add NMEA2000 node address and status to the status tab
  • ability to change the AP ip address
  • online build service to select the components you need
  • restructuring of the lib_deps handling (much shorter compile time
    Hint: if this introduces problems for your build, revert back the lib_ldf_mode to chain+
  • integration of a couple of I2C sensors (e.g. M5 ENVIII, BME280)
  • More functionality for user tasks (counter, interface between tasks, dynamic registration, adding fixed XDR mappings) - refer to the example description

20230317


  • correctly convert bar to Pascal in XDR records

20230309


  • use underscores in settings file names #40
  • pin platform and lib versions
  • add rs232 and rs485 atom boards
  • use less memory when saving new config
  • correct factor for ROT #44
  • better handling of VHW - send STW (128259) even if no heading, additionally send 127250 (magnetic/true) if included in VHW #49
  • parse MTW and convert to 130310 #49

20220403


  • add support for PGN 127257 pitch/roll/yaw
  • only convert RMC and GGA if valid status #38
  • only send 129539 if GSA fix mode is 2 or 3 #39

20220320


  • accept lowercase characters in NMEA0183 checksum #33
  • only show apPassword in UI if change is allowed #34
  • optimize memory usage for set config values
  • add a source field to GwApi::BoatValue
  • make NMEA0183 messages robust against to much fields
  • reset the can bus driver if the queue remains full for 2s (avoid problems if initially no other device is at the bus)

20220308


  • correctly handle select fields when importing the config
  • better names for config save #26
  • remove -e in ci build #30

20220302


  • add export and import of config data.
    HINT: passwords are not included
  • add a HELP tab that points to this description
    The url can be changed using the HELP_URL capability

20220301


20220124


  • make the serial input and output working again 20220114

  • incorporate some changes from Homberger to improve AIS compatibility with Raymarine displays
  • introduce a global switch to prevent sending out converted NMEA2000 data
  • extension API improvements (hide config values, set config values)

20220112


  • correctly send out seasmart if NMEA out is not configured
  • enable TCP keepalive on connections to reconnect on failures 20220109

  • allow to set the log level in config

20220107


  • add a TCP client - you can connect to any source of NMEA data using IP address (or MDNS host name) and port
    This way you can e.g. "chain" multiple gateways
  • add receiving of Seasmart messages.
    Using this feature you can forward the data from the NMEA2000 bus via TCP to another device.
  • add some Status Info to the extension API
  • correct the display of wind direction on the data page

20211218


  • 1st real release
  • use the initial flash if you had the pre-release installed
  • most of the N2K <-> 0183 conversions working, see Conversions
  • display of received data
  • xdr record mapping (see XdrMappings)
  • OTA update included in the UI
  • description updated
  • extension API

20211113


  • Pre-release
  • basic functions are working

esp32-nmea2000's People

Contributors

free-x avatar oxbown avatar wellenvogel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

esp32-nmea2000's Issues

Info box for save config data

We need a info box for save config data to advise the user that we need a Save&Restart to activate the config data.

LED function to indicate the WiFi client status

For a better understanding of WiFi connection use the LED color for connection status

white - boot
green - WiFi on and AP on
blue - WiFi on and AP off
red - WiFi off and AP off
green flashing or blue flashing - transmit data over TCP/UDP

Multiple Capabilities per UserTask

Hi @wellenvogel ,

i'm trying to declare multiple capabilities in one task. Without success

DECLARE_CAPABILITY(canunitbmp280,true);
DECLARE_CAPABILITY(oncemore,true);

lib/usercode/GwUserCode.cpp:36:70: error: redefinition of 'GwUserCapability __CAPname__'
 #define DECLARE_CAPABILITY(name,value) GwUserCapability __CAP##name__(#name,#value); 
                                                                      ^
lib/bmp280task/GwBMP280Task.h:16:1: note: in expansion of macro 'DECLARE_CAPABILITY'
 DECLARE_CAPABILITY(oncemore,true);
 ^
lib/usercode/GwUserCode.cpp:36:57: note: 'GwUserCapability __CAPname__' previously declared here
 #define DECLARE_CAPABILITY(name,value) GwUserCapability __CAP##name__(#name,#value); 
                                                         ^
lib/bmp280task/GwBMP280Task.h:15:1: note: in expansion of macro 'DECLARE_CAPABILITY'
 DECLARE_CAPABILITY(canunitbmp280,true);
 ^

greetings
free-x

Include device name in web page

Include device name in web page depends on configuration. That is easy to show the correct hardware.

M5Stack Atom
M5Stack Bais
M5Stick

XDR Mappings PGN-127506 (DC Detailed Status)

I´m using an esp8266 to send the battery information over TCP to the esp32-nmea2K. Messages are in nmea0183 format with XDR sentences
For example:
$JCXDR,U,12.0,V,I,2.5,A,C,25.0,C,BAT1*hh

I can read voltage, amperage, and battery temperature on esp32 using XDR mappings with that sentence.

But I have more information about the battery, in particular, 2 more values that are interesting
State of Charge (SoC) - The remaining percentage of charge (%)
Time Till Zero Charge (TTZ) - Time to discharge the battery (seconds)

These two values can be included in the XDR sentence:
$JCXDR,U,12.0,V,I,2.5,A,C,25.0,C,SOC,50.0,,TTZ,3520,,BAT1*hh

The n2k PNG that has that information is 127506. That sentence is not present in the project, but fortunately, the nmea2000 library supports it!
https://github.com/ttlappalainen/NMEA2000/blob/5e4fb0a49f4832f134878054da1ce8e4d700ee55/src/N2kMessages.h#L1981

The question is. Can be integrated? is there any challenge?

SeaTalk 1 connection

Implementation of SeaTalk 1 for M5Stack Atom with a special driver circuit for SeaTalk with a ATOMIC DIY Proto Kit.

my20220307: occasional time leaps on display and boatData

This issue was first seen on OBP60 display: see norbert-walter#18
Occasional time leaps (-1 hour) can be observed also on DATA tab, like this (taken within 30 seconds):
image
Examples extracted from api/boatDataString (previous to the screenshots) reveal a pattern:

GPST,formatTime,1,1938634,3,57726.02\n
2022-03-08 16:02:07        57727

GPSD,formatDate,1,1939659,3,19059\n
GPST,formatTime,1,1939705,3,57727.02\n
2022-03-08 16:02:09        57729

GPSD,formatDate,1,1941868,3,19059\n
GPST,formatTime,1,1941868,3,**54129**\n   **<--- time lapse !!!**
2022-03-08 16:02:10        57730

GPSD,formatDate,1,1942267,3,19059\n
GPST,formatTime,1,1942296,3,57730.02\n
2022-03-08 16:02:11        57731

GPSD,formatDate,1,1943274,3,19059\n
GPST,formatTime,1,1943297,3,57731.02\n
2022-03-08 16:02:12        57732

Whenever the value holds decimal places (always .02 !!), correct local time is displayed.
There is no pattern for decimal places missing, however, whenever they are absent UTC time is transmitted (and displayed).

Incoming GGA sentences look fine to me. See attached inputdata from OP, boatDataString capture and configuration.
errors at 16:00:55, 16:01:40, 16:01:51, 16:02:10, 16:02:33, ... and many more

[telnet 10.10.10.1] (2022-03-08_160016) raw OP out.log
[email protected]
config20220208.txt

I2c sensors ERRORs

Hello!
I´m working in a PortABC version #58 of the esp32-nmea2000 code. I´m using pin 39 for SCL and pin 38 for SDA on a M5ATOMS3.
I´m traying to use a ENV III sensor using the "-D GWSHT3X11" and "-D GWQMP698811" flags on "platformio.ini".
Compilation is OK and upload to board is OK, but if i plug the sensor in the i2c port the board start to reboot endlessly.

This is the serial log:

ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0xc (RTC_SW_CPU_RST),boot:0x2b (SPI_FAST_FLASH_BOOT)
Saved PC:0x40377870
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x44c
load:0x403c9700,len:0xbe4
load:0x403cc700,len:0x2a38
entry 0x403c98d4
E (228) esp_core_dump_flash: No core dump partition found!
E (228) esp_core_dump_flash: No core dump partition found!
[   245][E][Preferences.cpp:483] getString(): nvs_get_str len fail: systemName NOT_FOUND
[   246][E][Preferences.cpp:483] getString(): nvs_get_str len fail: talkerId NOT_FOUND
[   250][E][Preferences.cpp:483] getString(): nvs_get_str len fail: stopApTime NOT_FOUND
[   258][E][Preferences.cpp:483] getString(): nvs_get_str len fail: apPassword NOT_FOUND
[   265][E][Preferences.cpp:483] getString(): nvs_get_str len fail: apIp NOT_FOUND
[   273][E][Preferences.cpp:483] getString(): nvs_get_str len fail: apMask NOT_FOUND
[   280][E][Preferences.cpp:483] getString(): nvs_get_str len fail: useAdminPass NOT_FOUND
[   288][E][Preferences.cpp:483] getString(): nvs_get_str len fail: adminPassword NOT_FOUND
[   296][E][Preferences.cpp:483] getString(): nvs_get_str len fail: showInvalidData NOT_FOUND
[   305][E][Preferences.cpp:483] getString(): nvs_get_str len fail: minXdrInterval NOT_FOUND
[   313][E][Preferences.cpp:483] getString(): nvs_get_str len fail: min2KInterval NOT_FOUND
[   321][E][Preferences.cpp:483] getString(): nvs_get_str len fail: sendN2k NOT_FOUND
[   328][E][Preferences.cpp:483] getString(): nvs_get_str len fail: usbActisense NOT_FOUND
[   336][E][Preferences.cpp:483] getString(): nvs_get_str len fail: usbBaud NOT_FOUND
[   344][E][Preferences.cpp:483] getString(): nvs_get_str len fail: sendUsb NOT_FOUND
[   351][E][Preferences.cpp:483] getString(): nvs_get_str len fail: receiveUsb NOT_FOUND
[   359][E][Preferences.cpp:483] getString(): nvs_get_str len fail: usbToN2k NOT_FOUND
[   367][E][Preferences.cpp:483] getString(): nvs_get_str len fail: usbReadFilter NOT_FOUND
[   375][E][Preferences.cpp:483] getString(): nvs_get_str len fail: usbWriteFilter NOT_FOUND
[   383][E][Preferences.cpp:483] getString(): nvs_get_str len fail: usbActSend NOT_FOUND
[   391][E][Preferences.cpp:483] getString(): nvs_get_str len fail: serialDirection NOT_FOUND
[   400][E][Preferences.cpp:483] getString(): nvs_get_str len fail: sendSerial NOT_FOUND
[   407][E][Preferences.cpp:483] getString(): nvs_get_str len fail: receiveSerial NOT_FOUND
[   415][E][Preferences.cpp:483] getString(): nvs_get_str len fail: serialToN2k NOT_FOUND
[   423][E][Preferences.cpp:483] getString(): nvs_get_str len fail: serialReadF NOT_FOUND
[   431][E][Preferences.cpp:483] getString(): nvs_get_str len fail: serialWriteF NOT_FOUND
[   439][E][Preferences.cpp:483] getString(): nvs_get_str len fail: serial2Dir NOT_FOUND
[   447][E][Preferences.cpp:483] getString(): nvs_get_str len fail: sendSerial2 NOT_FOUND
[   454][E][Preferences.cpp:483] getString(): nvs_get_str len fail: receiveSerial2 NOT_FOUND
[   463][E][Preferences.cpp:483] getString(): nvs_get_str len fail: serial2ToN2k NOT_FOUND
[   471][E][Preferences.cpp:483] getString(): nvs_get_str len fail: serial2ReadF NOT_FOUND
[   479][E][Preferences.cpp:483] getString(): nvs_get_str len fail: serial2WriteF NOT_FOUND
[   487][E][Preferences.cpp:483] getString(): nvs_get_str len fail: serverPort NOT_FOUND
[   494][E][Preferences.cpp:483] getString(): nvs_get_str len fail: maxClients NOT_FOUND
[   502][E][Preferences.cpp:483] getString(): nvs_get_str len fail: sendTCP NOT_FOUND
[   510][E][Preferences.cpp:483] getString(): nvs_get_str len fail: readTCP NOT_FOUND
[   517][E][Preferences.cpp:483] getString(): nvs_get_str len fail: tcpToN2k NOT_FOUND
[   525][E][Preferences.cpp:483] getString(): nvs_get_str len fail: tcpReadFilter NOT_FOUND
[   533][E][Preferences.cpp:483] getString(): nvs_get_str len fail: tcpWriteFilter NOT_FOUND
[   541][E][Preferences.cpp:483] getString(): nvs_get_str len fail: sendSeasmart NOT_FOUND
[   549][E][Preferences.cpp:483] getString(): nvs_get_str len fail: tclEnabled NOT_FOUND
[   557][E][Preferences.cpp:483] getString(): nvs_get_str len fail: remotePort NOT_FOUND
[   565][E][Preferences.cpp:483] getString(): nvs_get_str len fail: remoteAddress NOT_FOUND
[   573][E][Preferences.cpp:483] getString(): nvs_get_str len fail: sendTCL NOT_FOUND
[   581][E][Preferences.cpp:483] getString(): nvs_get_str len fail: readTCL NOT_FOUND
[   588][E][Preferences.cpp:483] getString(): nvs_get_str len fail: tclToN2k NOT_FOUND
[   596][E][Preferences.cpp:483] getString(): nvs_get_str len fail: tclReadFilter NOT_FOUND
[   604][E][Preferences.cpp:483] getString(): nvs_get_str len fail: tclWriteFilter NOT_FOUND
[   612][E][Preferences.cpp:483] getString(): nvs_get_str len fail: tclSeasmart NOT_FOUND
[   620][E][Preferences.cpp:483] getString(): nvs_get_str len fail: wifiClient NOT_FOUND
[   628][E][Preferences.cpp:483] getString(): nvs_get_str len fail: wifiSSID NOT_FOUND
[   635][E][Preferences.cpp:483] getString(): nvs_get_str len fail: wifiPass NOT_FOUND
[   643][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR1 NOT_FOUND
[   650][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR2 NOT_FOUND
[   657][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR3 NOT_FOUND
[   665][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR4 NOT_FOUND
[   672][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR5 NOT_FOUND
[   679][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR6 NOT_FOUND
[   687][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR7 NOT_FOUND
[   694][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR8 NOT_FOUND
[   701][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR9 NOT_FOUND
[   709][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR10 NOT_FOUND
[   716][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR11 NOT_FOUND
[   723][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR12 NOT_FOUND
[   731][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR13 NOT_FOUND
[   738][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR14 NOT_FOUND
[   745][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR15 NOT_FOUND
[   753][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR16 NOT_FOUND
[   760][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR17 NOT_FOUND
[   768][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR18 NOT_FOUND
[   775][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR19 NOT_FOUND
[   782][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR20 NOT_FOUND
[   790][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR21 NOT_FOUND
[   797][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR22 NOT_FOUND
[   804][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR23 NOT_FOUND
[   812][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR24 NOT_FOUND
[   819][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR25 NOT_FOUND
[   827][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR26 NOT_FOUND
[   834][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR27 NOT_FOUND
[   841][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR28 NOT_FOUND
[   849][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR29 NOT_FOUND
[   856][E][Preferences.cpp:483] getString(): nvs_get_str len fail: XDR30 NOT_FOUND
[   863][E][Preferences.cpp:483] getString(): nvs_get_str len fail: exampleConfig NOT_FOUND
[   872][E][Preferences.cpp:483] getString(): nvs_get_str len fail: exampleBDSel NOT_FOUND
[   880][E][Preferences.cpp:483] getString(): nvs_get_str len fail: exTransducer NOT_FOUND
[   888][E][Preferences.cpp:483] getString(): nvs_get_str len fail: exInstanceId NOT_FOUND
[   895][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X11tmAct NOT_FOUND
[   903][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X11tmSrc NOT_FOUND
[   911][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X11huAct NOT_FOUND
[   919][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X11huSrc NOT_FOUND
[   927][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X11iid NOT_FOUND
[   935][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X11intv NOT_FOUND
[   943][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X11tmNam NOT_FOUND
[   951][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X11huNam NOT_FOUND
[   959][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X12tmAct NOT_FOUND
[   967][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X12tmSrc NOT_FOUND
[   975][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X12huAct NOT_FOUND
[   983][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X12huSrc NOT_FOUND
[   991][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X12iid NOT_FOUND
[   999][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X12intv NOT_FOUND
[  1007][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X12tmNam NOT_FOUND
[  1015][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X12huNam NOT_FOUND
[  1023][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X21tmAct NOT_FOUND
[  1031][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X21tmSrc NOT_FOUND
[  1039][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X21huAct NOT_FOUND
[  1047][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X21huSrc NOT_FOUND
[  1055][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X21iid NOT_FOUND
[  1062][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X21intv NOT_FOUND
[  1070][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X21tmNam NOT_FOUND
[  1078][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X21huNam NOT_FOUND
[  1086][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X22tmAct NOT_FOUND
[  1094][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X22tmSrc NOT_FOUND
[  1102][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X22huAct NOT_FOUND
[  1110][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X22huSrc NOT_FOUND
[  1118][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X22iid NOT_FOUND
[  1126][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X22intv NOT_FOUND
[  1134][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X22tmNam NOT_FOUND
[  1142][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SHT3X22huNam NOT_FOUND
[  1150][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698811prAct NOT_FOUND
[  1158][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698811iid NOT_FOUND
[  1166][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698811intv NOT_FOUND
[  1174][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698811prNam NOT_FOUND
[  1182][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698811prOff NOT_FOUND
[  1191][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698812prAct NOT_FOUND
[  1199][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698812iid NOT_FOUND
[  1207][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698812intv NOT_FOUND
[  1215][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698812prNam NOT_FOUND
[  1223][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698812prOff NOT_FOUND
[  1231][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698821prAct NOT_FOUND
[  1239][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698821iid NOT_FOUND
[  1247][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698821intv NOT_FOUND
[  1255][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698821prNam NOT_FOUND
[  1263][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698821prOff NOT_FOUND
[  1272][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698822prAct NOT_FOUND
[  1280][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698822iid NOT_FOUND
[  1288][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698822intv NOT_FOUND
[  1296][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698822prNam NOT_FOUND
[  1304][E][Preferences.cpp:483] getString(): nvs_get_str len fail: QMP698822prOff NOT_FOUND
[  1312][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011tmAct NOT_FOUND
[  1320][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011tmSrc NOT_FOUND
[  1328][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011tmOff NOT_FOUND
[  1336][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011huAct NOT_FOUND
[  1344][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011huSrc NOT_FOUND
[  1352][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011prAct NOT_FOUND
[  1361][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011prOff NOT_FOUND
[  1369][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011iid NOT_FOUND
[  1377][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011intv NOT_FOUND
[  1385][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011tmNam NOT_FOUND
[  1393][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011huNam NOT_FOUND
[  1401][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28011prNam NOT_FOUND
[  1409][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012tmAct NOT_FOUND
[  1417][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012tmSrc NOT_FOUND
[  1425][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012tmOff NOT_FOUND
[  1433][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012huAct NOT_FOUND
[  1441][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012huSrc NOT_FOUND
[  1449][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012prAct NOT_FOUND
[  1457][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012prOff NOT_FOUND
[  1465][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012iid NOT_FOUND
[  1473][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012intv NOT_FOUND
[  1481][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012tmNam NOT_FOUND
[  1489][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012huNam NOT_FOUND
[  1497][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28012prNam NOT_FOUND
[  1505][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021tmAct NOT_FOUND
[  1513][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021tmSrc NOT_FOUND
[  1521][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021tmOff NOT_FOUND
[  1530][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021huAct NOT_FOUND
[  1538][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021huSrc NOT_FOUND
[  1546][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021prAct NOT_FOUND
[  1554][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021prOff NOT_FOUND
[  1562][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021iid NOT_FOUND
[  1570][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021intv NOT_FOUND
[  1578][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021tmNam NOT_FOUND
[  1586][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021huNam NOT_FOUND
[  1594][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28021prNam NOT_FOUND
[  1602][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022tmAct NOT_FOUND
[  1610][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022tmSrc NOT_FOUND
[  1618][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022tmOff NOT_FOUND
[  1626][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022huAct NOT_FOUND
[  1634][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022huSrc NOT_FOUND
[  1642][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022prAct NOT_FOUND
[  1650][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022prOff NOT_FOUND
[  1658][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022iid NOT_FOUND
[  1666][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022intv NOT_FOUND
[  1674][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022tmNam NOT_FOUND
[  1682][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022huNam NOT_FOUND
[  1690][E][Preferences.cpp:483] getString(): nvs_get_str len fail: BME28022prNam NOT_FOUND
LOG:1850:GWWIFI: AP auto shutdown disabled (0s)
GWSERIAL:1950:wifi AP pass: esp32nmea2k
GWSERIAL:1950:admin pass: esp32admin
GWSERIAL:1950:initialized IIC 1 at sda=38,scl=39
Guru Meditation Error: Core  0 panic'ed (Unhandled debug exception). 
Debug exception reason: Stack canary watchpoint triggered (iicTask) 
Core  0 register dump:
PC      : 0x40380ce7  PS      : 0x00060836  A0      : 0x80383944  A1      : 0x3fcc45a0  
A2      : 0x3fce9f40  A3      : 0xb33fffff  A4      : 0x0000abab  A5      : 0x00060823  
A6      : 0x00060820  A7      : 0x0000cdcd  A8      : 0xb33fffff  A9      : 0xffffffff  
A10     : 0x3fcc49a0  A11     : 0x00000000  A12     : 0x624dd2f2  A13     : 0x404e1810  
A14     : 0x02ce9f40  A15     : 0x00ffffff  SAR     : 0x0000000a  EXCCAUSE: 0x00000001  
EXCVADDR: 0x00000000  LBEG    : 0x400556d5  LEND    : 0x400556e5  LCOUNT  : 0xffffffff  


Backtrace: 0x40380ce4:0x3fcc45a0 0x40383941:0x3fcc45e0 0x40383bad:0x3fcc4600 0x403780a9:0x3fcc4620 0x403780bd:0x3fcc4650 0x403780ea:0x3fcc4670 0x40383f91:0x3fcc4690 0x420b8c5e:0x3fcc46b0 0x420b2d5a:0x3fcc4750 0x420b043d:0x3fcc4a60 0x42026f06:0x3fcc4b20 0x4202fceb:0x3fcc4b90 0x4202d292:0x3fcc4c20 0x4200662e:0x3fcc4c70 0x4200681e:0x3fcc4cd0 0x42023d6e:0x3fcc4cf0 0x420a858b:0x3fcc4d20 0x420a87ed:0x3fcc4e80 0x420c50f9:0x3fcc4ed0 0x420a74c5:0x3fcc4ef0 0x420c2d39:0x3fcc4fa0




ELF file SHA256: afac89f3bba3464c

E (3513) esp_core_dump_flash: Core dump flash config is corrupted! CRC=0x7bd5c66f instead of 0x0
Rebooting...

GPS/AIS to 2k (SNR way to high)

Hello, are you shure the Values are correct. Here SNR is way to high. Data in serial from AIS/GPS. Results in SignalK.

{
"count": 17,
"satellites": [
{
"id": 10,
"elevation": 0.4712,
"azimuth": 0.1745,
"SNR": 162
},
{
"id": 44,
"elevation": 0.5585,
"azimuth": 0.7156,
"SNR": 65
},
{
"id": 48,
"elevation": 0.2967,
"azimuth": 0.2618,
"SNR": 319
},
{
"id": 42,
"elevation": 0.1745,
"azimuth": 0.2618,
"SNR": 59
},
{
"id": 45,
"elevation": 0.1396,
"azimuth": 0.6632,
"SNR": 181
},
{
"id": 46,
"elevation": 0.2967,
"azimuth": 0.2618,
"SNR": 319
},
{
"id": 34,
"elevation": 0.2967,
"azimuth": 0.2269,
"SNR": 319
},
{
"id": 33,
"elevation": 0.2967,
"azimuth": 0.2269,
"SNR": 319
},
{
"id": 41,
"elevation": 0.0175,
"azimuth": 1.0647,
"SNR": 303
},
{
"id": 40,
"elevation": 0.0175,
"azimuth": 1.0821,
"SNR": 304
},
{
"id": 36,
"elevation": 0.2967,
"azimuth": 0.2269,
"SNR": 319
},
{
"id": 51,
"elevation": 0.1745,
"azimuth": 0.2443,
"SNR": 60
},
{
"id": 39,
"elevation": 0.0175,
"azimuth": 1.0821,
"SNR": 304
},
{
"id": 47,
"elevation": 0.2443,
"azimuth": 0.2793,
"SNR": 288
},
{
"id": 43,
"elevation": 0.5585,
"azimuth": 0.7156,
"SNR": 65
},
{
"id": 50,
"elevation": 0.1745,
"azimuth": 0.2443,
"SNR": 60
},
{
"id": 0,
"elevation": 0,
"azimuth": 0,
"SNR": 0
}
]
}

this is normal GPS Data from an Moitessier HAT/serial:

{
"count": 8,
"satellites": [
{
"id": 85,
"elevation": 1.1519173065792743,
"azimuth": 5.759586532896371,
"SNR": 35
},
{
"id": 70,
"elevation": 1.012290966387847,
"azimuth": 3.4732052122617514,
"SNR": 0
},
{
"id": 84,
"elevation": 0.7853981635767779,
"azimuth": 2.146754980443193,
"SNR": 0
},
{
"id": 86,
"elevation": 0.349065850478568,
"azimuth": 5.497787145037446,
"SNR": 29
},
{
"id": 71,
"elevation": 0.15707963271535558,
"azimuth": 3.6302848449771066,
"SNR": 0
},
{
"id": 77,
"elevation": 0.15707963271535558,
"azimuth": 6.091199090851011,
"SNR": 0
},
{
"id": 76,
"elevation": 0.10471975514357039,
"azimuth": 5.305800927274233,
"SNR": 20
},
{
"id": 68,
"elevation": 0.0698131700957136,
"azimuth": 0.5759586532896371,
"SNR": 0
}
]
}

M5atom with CAN sees only other m5atom CAN NMEA 2000 based devices on NMEA 2000 bus but doesn't see another nmea 2000 device

M5atom with CAN sees only other m5atom CAN NMEA 2000 based devices on NMEA 2000 bus but doesn't see another NMEA 2000 device.

And vice versa:

Others (non m5atom based) NMEA devices
do not see data from m5atom based CAN devices, but see data from another device (CX5003)

SH-ESP32-nmea2000-gateway
(see https://github.com/hatlabs/SH-ESP32-hardware)
which is esp2 based too with similar code sees NMEA 2000 sensor module CX5003

but no data from m5atom based NMEA 2000 sensors.

Larger check boxes on Web page

The size of check boxes on the Web page is for larger fingers not practicable. A bigger size of check boxes are helpfully.

NMEA0183 serial input problem: 20231105

If I introduce a serial data stream via NMEA0183 into an M5Stack Atom via an RS485 unit, problems arise when the data stream is interrupted (cable unplugged, reset on the transmitting device). After the data transfer is interrupted and continued, the telegram counter for the serial port freezes. However, telegrams forwarded via USB are still displayed. The website also no longer builds properly when you refresh the page.

The same problem also occurs when incomplete, garbled or unknown telegrams are transmitted. Then the M5Stack Atom freezes completely. To do this, I intentionally short-circuited the transmission lines. The new GPS receiver sends, for example, the following telegrams immediately after it has been started:

$GPTXT,01,01,02,HW=ATGM336H,00030107486321C
$GPTXT,01,01,02,IC=AT6558-5N-31-0C510800,BMLLCKJ-D2-037416
5A
$GPTXT,01,01,02,SW=URANUS5,V5.3.0.01D
$GPTXT,01,01,02,TB=2020-04-28,13:43:10
40
$GPTXT,01,01,02,MO=GB77
$GPTXT,01,01,02,BS=SOC_BootLoader,V6.2.0.2
34
$GPTXT,01,01,02,FI=00856014*71

grafik

Speed through water

Hi Andreas,
I'm not sure about my understand of NMEA0183 and NMEA2000 but I have a VHW from my log but the device do not create the PNG128259 for speed and so I can not get the value at my Raymarine ST70 multi. Is there something missing to get speed data from my log to the NMEA2000 or have I do configure something for this?
For me it looks okay ->
VHW
and I can see the speed through water at the data side ->
stw

(-: Chrischan

v20220417dev: 'tcp client connection closed on x.x.x.x' displays misleading IP adress

test setup:
ATOM (10.10.10.144), as client, listening to TCP server (OP) at 10.10.10.1:10110
PC (10.10.10.81) as client, listening to TCP server (ATOM) at 10.10.10.144:10110

When PC stops listening, (sometimes*) an error message is output on ATOM USB: 'tcp client connection closed on 10.10.10.1'
The connection ATOM-OP however is not interrupted - the message should read 'tcp client connection closed on 10.10.10.81'

Not a biggie, but might be misleading when hunting for errors

*sometimes means in about 2-3 cases out of 10, otherwise there is no message when client disconnects

NMEA2000-Gateway-MultiHUB

Hi!
I've got an idea to expand the possibilities of NMEA2000-Gateway. M5Stack has a product to expand ATOM ports "ATOMIC PortABC Extension Base"
With that module, we could connect several devices to the atom or atoms3 (compatible with both boards). CAN bus, RS485, Serial TTL, and i2C could be connected at the same time.
This is an example of the idea:
image

NMEA0183 XDR

Hi,
I use the ATOM CANBus Kit with RP4 and AvNav headless and I miss the data on N2K side for Roll and Pitch. In the version discription 20220403 there I can find XDR but at the [Data] side I can't find a cell for this data and on the N2K bus I get no pitch/roll data. Is this a missunderstand of XDR myself or is there missing a part of implementation? In SK I can log following -> @signalk/signalk-to-nmea0183 $IIXDR,A,-0.3,D,PTCH,A,-3.4,D,ROLL*58

(-: Chrischan

Unit conversion problems in NMEA013 library

I discovered some unit conversion problems in ttlappalainen/NMEA0183#37 .

Whileas it would be simple to fix this in

void convertROT(const SNMEA0183Msg &msg){

and
void HandleROT(const tN2kMsg &msg){

I hope that @ttlappalainen will update his library upstream.

This issue can be seen in the line with #43 where it seems to be favorable to have some means of control over filtering/conversion of the data being passed around, as I suspect there are devices in the wild which send rad/s, deg/s, rad/min, deg/min, ... without caring for units. Another possibility would be to calculate values from existing data (e.g. calculate ROT from heading change over time).

This project is so great and so much effort seems to have flown into all this complex code. It would be great to see this evolve from silver to gold.

Provide an AWA correction angle

I use this firmware to connect my Nasamarine masthead unit to nmea2000 without using an actual NASA wind display.
The wind angle the unit provides is 0-359° relative to some reference forward direction that may or may not correspond with the actual forward direction of the boat, depending on masthead mounting and other factors.
I have patched in a fixed correction angle but it would be great to provide a settable correction through the UI.
It might even be possible to implement an auto calibration mode that watches a number of tacks and configures the wind correction angle to half the average tack angle.

AP password not settable

Whatever I try, I cannot change the AP passwort (I have been trying on OBP60).
Modifying Admin Pass + enabling/disabling seem to work.

Attached Screenshot and debug-log was produced after factory reset. Changes to config as shown (testpass, testadmin)
image

Debug log:
2022-03-10_111325 COM8 ESP32 wroom.zip

After restart, the network name was changed. Logging in however does not work with the new password. It had remained the default.
Subsequent changes have no effect either.

Shorter names for BoatValues by using XDR

Shorter names for BoatValues by using XDR. The BoatValue name begin with xdrTransducerName. The nme is to long for value selection in OBP pages. Better is xTransducerName.

Rename some boat data titems

To be usable on small displays some boat data items should be renamed:
GWBOATDATA(double,COG,4000,formatCourse)
GWBOATDATA(double,TWD,4000,formatCourse)
GWBOATDATA(double,AWD,4000,formatCourse)
GWBOATDATA(double,SOG,4000,formatKnots)
GWBOATDATA(double,STW,4000,formatKnots)
GWBOATDATA(double,TWS,4000,formatKnots)
GWBOATDATA(double,AWS,4000,formatKnots)
GWBOATDATA(double,MaxTWS,0,formatKnots)
GWBOATDATA(double,MaxAWS,0,formatKnots)
GWBOATDATA(double,AWA,4000,formatWind)
GWBOATDATA(double,HDG,4000,formatCourse) //true
GWBOATDATA(double,MHDG,4000,formatCourse)
GWBOATDATA(double,ROT,4000,formatRot)
GWBOATDATA(double,VAR,4000,formatCourse)
GWBOATDATA(double,DEV,4000,formatCourse)
GWBOATDATA(double,HDOP,4000,formatDop)
GWBOATDATA(double,PDOP,4000,formatDop)
GWBOATDATA(double,VDOP,4000,formatDop)
GWBOATDATA(double,RPOS,4000,formatCourse)
GWBOATDATA(double,LAT,4000,formatLatitude)
GWBOATDATA(double,LON,4000,formatLongitude)
GWBOATDATA(double,ALT,4000,formatFixed0)
GWBOATDATA(double,DBS,4000,formatDepth) // Depth Below Surface
GWBOATDATA(double,DBT,4000,formatDepth) // Depth Below Transducer
GWBOATDATA(double,GPST,4000,formatTime) // GPS Time
GWBOATDATA(double,WTemp,4000,kelvinToC) // Water Temperature
GWBOATDATA(double,XTE,4000,formatXte)
GWBOATDATA(double,DTW,4000,mtr2nm)
GWBOATDATA(double,BTW,4000,formatCourse)
GWBOATDATA(double,WPLat,4000,formatLatitude)
GWBOATDATA(double,WPLon,4000,formatLongitude)
GWBOATDATA(uint32_t,Log,16000,mtr2nm)
GWBOATDATA(uint32_t,TripLog,16000,mtr2nm)
GWBOATDATA(uint32_t,GPSD,4000,formatDate) // GPS Date
GWBOATDATA(int16_t,TZ,8000,formatFixed0) // Time Zone
GWSPECBOATDATA(GwBoatDataSatList,SatInfo,GwSatInfoList::lifeTime,formatFixed0);

Wifi authentication failed

After flashing my new m5 atom CAN. I can see the network available to connect. However, it fails to connect with the default password of esp32nema2k

I have flashed the most recent firmware from release directory

Valid GPS data by invalid NMEA0183 GPS sentences

Data shows valid GPS data by invalid NMEA0183 GPS sentences.

grafik

$GPRMC,000000.00,A,0.000,N,0.000,E,0.0,0.0,050505,0.0,E6D
$GPXDR,U,12.340,V,Voltage
02
$GPRMC,000000.00,A,0.000,N,0.000,E,0.0,0.0,050505,0.0,E6D
$GPRMC,,V,,,,,,,,,,N
53
$GPVTG,,,,,,,,,N30
$GPGGA,,,,,,0,00,99.99,,,,,,48
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99
30
$GPGSV,2,1,06,05,,,11,07,,,19,08,,,22,09,,,23
76
$GPGSV,2,2,06,15,,,24,21,,,217D
$GPGLL,,,,,,V,N
64
$GPRMC,000000.00,A,0.000,N,0.000,E,0.0,0.0,050505,0.0,E6D
$GPXDR,U,12.330,V,Voltage
05
$GPRMC,000000.00,A,0.000,N,0.000,E,0.0,0.0,050505,0.0,E6D
$GPRMC,,V,,,,,,,,,,N
53
$GPVTG,,,,,,,,,N30
$GPGGA,,,,,,0,00,99.99,,,,,,48
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99
30
$GPGSV,3,1,12,01,,,23,02,,,21,04,,,24,05,,,12
7D
$GPGSV,3,2,12,06,,,24,08,,,21,09,,,27,10,,,2679
$GPGSV,3,3,12,11,,,25,14,,,24,15,,,21,21,,,21
79
$GPGLL,,,,,,V,N64
$GPRMC,000000.00,A,0.000,N,0.000,E,0.0,0.0,050505,0.0,E
6D
$GPXDR,U,12.210,V,Voltage06
$GPRMC,,V,,,,,,,,,,N
53
$GPVTG,,,,,,,,,N30
$GPGGA,,,,,,0,00,99.99,,,,,,48
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99
30
$GPRMC,000000.00,A,0.000,N,0.000,E,0.0,0.0,050505,0.0,E
6D
$GPGSV,3,1,10,01,,,22,04,,,23,05,,,26,06,,,21*7A

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.