commit
185c402544
2
.gitignore
vendored
2
.gitignore
vendored
@ -12,3 +12,5 @@
|
|||||||
.gcc-flags.json
|
.gcc-flags.json
|
||||||
src/loraconf.h
|
src/loraconf.h
|
||||||
src/ota.conf
|
src/ota.conf
|
||||||
|
platformio.ini
|
||||||
|
src/paxcounter.conf
|
||||||
|
24
README.md
24
README.md
@ -85,11 +85,11 @@ By default bluetooth sniffing not installed (#define *BLECOUNTER* 0 in paxcounte
|
|||||||
|
|
||||||
Compile time configuration is spread across several files. Before compiling the code, edit or create the following files:
|
Compile time configuration is spread across several files. Before compiling the code, edit or create the following files:
|
||||||
|
|
||||||
## platformio.ini
|
## platformio_orig.ini
|
||||||
Edit `platformio.ini` and select desired hardware target in section boards. To add a new board, create an appropriate hardware abstraction layer file in hal subdirectory, and add a pointer to this file in sections boards.
|
Edit `platformio_orig.ini` and select desired hardware target in section boards. To add a new board, create an appropriate hardware abstraction layer file in hal subdirectory, and add a pointer to this file in sections board. Copy or rename to `platformio.ini`.
|
||||||
|
|
||||||
## src/paxcounter.conf
|
## src/paxcounter_orig.conf
|
||||||
Edit `src/paxcounter.conf` and tailor settings in this file according to your needs and use case. Please take care of the duty cycle regulations of the LoRaWAN network you're going to use.
|
Edit `src/paxcounter_orig.conf` and tailor settings in this file according to your needs and use case. Please take care of the duty cycle regulations of the LoRaWAN network you're going to use. Copy or rename to `src/paxcounter.conf`.
|
||||||
|
|
||||||
If your device has a **real time clock** it can be updated bei either LoRaWAN network or GPS time, according to settings *TIME_SYNC_INTERVAL* and *TIME_SYNC_LORAWAN* in `paxcounter.conf`.
|
If your device has a **real time clock** it can be updated bei either LoRaWAN network or GPS time, according to settings *TIME_SYNC_INTERVAL* and *TIME_SYNC_LORAWAN* in `paxcounter.conf`.
|
||||||
|
|
||||||
@ -97,11 +97,10 @@ If your device has a **real time clock** it can be updated bei either LoRaWAN ne
|
|||||||
Edit `src/lmic_config.h` and tailor settings in this file according to your country and device hardware. Please take care of national regulations when selecting the frequency band for LoRaWAN.
|
Edit `src/lmic_config.h` and tailor settings in this file according to your country and device hardware. Please take care of national regulations when selecting the frequency band for LoRaWAN.
|
||||||
|
|
||||||
## src/loraconf.h
|
## src/loraconf.h
|
||||||
Create file `src/loraconf.h` using the template [src/loraconf.sample.h](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/src/loraconf.sample.h) and modify it, to use your personal values.
|
Create file `src/loraconf.h` using the template [src/loraconf_sample.h](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/src/loraconf_sample.h) and adjust settings to use your personal values. To join the network and activate your paxcounter, you must configure either OTAA or ABP join method. You should use OTAA, whenever possible. To understand the differences of the two methods, [this article](https://www.thethingsnetwork.org/docs/devices/registration.html) may be useful.
|
||||||
To join the network and activate your paxcounter, you have to configure either the preferred OTAA method or the ABP method. You should use OTAA, whenever possible. To understand the differences of the two methods, [this article](https://www.thethingsnetwork.org/docs/devices/registration.html) may be useful.
|
|
||||||
|
|
||||||
To configure OTAA, leave `#define LORA_ABP` deactivated (commented). To use ABP, activate (uncomment) `#define LORA_ABP` in the file `src/loraconf.h`.
|
To configure OTAA, leave `#define LORA_ABP` deactivated (commented). To use ABP, activate (uncomment) `#define LORA_ABP` in the file `src/loraconf.h`.
|
||||||
The file `src/loraconf.h.sample` contains more information about the values to provide.
|
The file `src/loraconf_sample.h` contains more information about the values to provide.
|
||||||
|
|
||||||
## src/ota.conf
|
## src/ota.conf
|
||||||
Create file `src/ota.conf` using the template [src/ota.sample.conf](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/src/ota.sample.conf) and enter your WIFI network&key. These settings are used for downloading updates. If you want to push own OTA updates you need a <A HREF="https://bintray.com/JFrog">Bintray account</A>. Enter your Bintray user account data in ota.conf. If you don't need wireless firmware updates just rename ota.sample.conf to ota.conf.
|
Create file `src/ota.conf` using the template [src/ota.sample.conf](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/src/ota.sample.conf) and enter your WIFI network&key. These settings are used for downloading updates. If you want to push own OTA updates you need a <A HREF="https://bintray.com/JFrog">Bintray account</A>. Enter your Bintray user account data in ota.conf. If you don't need wireless firmware updates just rename ota.sample.conf to ota.conf.
|
||||||
@ -480,7 +479,16 @@ Send for example `8386` as Downlink on Port 2 to get battery status and time/dat
|
|||||||
|
|
||||||
0x14 set payload mask
|
0x14 set payload mask
|
||||||
|
|
||||||
byte 1 = sensor data payload mask (0..255, meaning of bits see above)
|
byte 1 = sensor data payload mask (0..255, meaning of bits see below)
|
||||||
|
0x01 = GPS_DATA
|
||||||
|
0x02 = ALARM_DATA
|
||||||
|
0x04 = MEMS_DATA
|
||||||
|
0x08 = COUNT_DATA (default)
|
||||||
|
0x10 = SENSOR_1_DATA (ENS-COUNTS)
|
||||||
|
0x20 = SENSOR_2_DATA
|
||||||
|
0x40 = SENSOR_3_DATA
|
||||||
|
0x80 = BATT_DATA
|
||||||
|
bytes can be combined eg COUNT_DATA ;SENSOR_1_DATA ;BATT_DATA: `0x08 | 0x10 |0x80 = 0x98`
|
||||||
|
|
||||||
0x15 set BME data on/off
|
0x15 set BME data on/off
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ description = Paxcounter is a device for metering passenger flows in realtime. I
|
|||||||
|
|
||||||
[common]
|
[common]
|
||||||
; for release_version use max. 10 chars total, use any decimal format like "a.b.c"
|
; for release_version use max. 10 chars total, use any decimal format like "a.b.c"
|
||||||
release_version = 2.0.12
|
release_version = 2.0.15
|
||||||
; DEBUG LEVEL: For production run set to 0, otherwise device will leak RAM while running!
|
; DEBUG LEVEL: For production run set to 0, otherwise device will leak RAM while running!
|
||||||
; 0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose
|
; 0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose
|
||||||
debug_level = 3
|
debug_level = 3
|
@ -6,8 +6,11 @@
|
|||||||
// Local logging tag
|
// Local logging tag
|
||||||
static const char TAG[] = __FILE__;
|
static const char TAG[] = __FILE__;
|
||||||
|
|
||||||
// we use NMEA $GPZDA sentence field 1 for time synchronization
|
// we use NMEA ZDA sentence field 1 for time synchronization
|
||||||
// $GPZDA gives time for preceding pps pulse, but does not has a constant offset
|
// ZDA gives time for preceding pps pulse
|
||||||
|
// downsight is that it does not have a constant offset
|
||||||
|
// thus precision is only +/- 1 second
|
||||||
|
|
||||||
TinyGPSPlus gps;
|
TinyGPSPlus gps;
|
||||||
TinyGPSCustom gpstime(gps, "GPZDA", 1); // field 1 = UTC time
|
TinyGPSCustom gpstime(gps, "GPZDA", 1); // field 1 = UTC time
|
||||||
static const String ZDA_Request = "$EIGPQ,ZDA*39\r\n";
|
static const String ZDA_Request = "$EIGPQ,ZDA*39\r\n";
|
||||||
@ -95,7 +98,7 @@ time_t get_gpstime(uint16_t *msec) {
|
|||||||
|
|
||||||
time_t time_sec = 0;
|
time_t time_sec = 0;
|
||||||
|
|
||||||
// poll NMEA $GPZDA sentence
|
// poll NMEA ZDA sentence
|
||||||
#ifdef GPS_SERIAL
|
#ifdef GPS_SERIAL
|
||||||
GPS_Serial.print(ZDA_Request);
|
GPS_Serial.print(ZDA_Request);
|
||||||
// wait for gps NMEA answer
|
// wait for gps NMEA answer
|
||||||
@ -159,6 +162,13 @@ void gps_loop(void *pvParameters) {
|
|||||||
delay(2); // 2ms delay according L76 datasheet
|
delay(2); // 2ms delay according L76 datasheet
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// if time hasn't been synchronised yet, and we have a valid GPS time,
|
||||||
|
// update time from GPS.
|
||||||
|
if (timeSource == _unsynced && gpstime.isUpdated() && gpstime.isValid()) {
|
||||||
|
calibrateTime();
|
||||||
|
}
|
||||||
|
|
||||||
} // if
|
} // if
|
||||||
|
|
||||||
// show NMEA data in verbose mode, useful for debugging GPS, bu tvery noisy
|
// show NMEA data in verbose mode, useful for debugging GPS, bu tvery noisy
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
* displayed in TTN console, so you can cut & paste from there. This is different
|
* displayed in TTN console, so you can cut & paste from there. This is different
|
||||||
* from standard LMIC-Arduino which expects DEVEUI and APPEUI in LSB format.
|
* from standard LMIC-Arduino which expects DEVEUI and APPEUI in LSB format.
|
||||||
* For TTN, APPEUI in MSB format always starts with 0x70, 0xB3, 0xD5.
|
* For TTN, APPEUI in MSB format always starts with 0x70, 0xB3, 0xD5.
|
||||||
|
|
||||||
* Set your DEVEUI here, if your device has have a fixed one.
|
* Set your DEVEUI here, if your device has have a fixed one.
|
||||||
* If you leave this untouched, then the DEVEUI will be derived from device's
|
* If you leave this untouched, then the DEVEUI will be derived from device's
|
||||||
* MAC adress during startup and will be displayed on device's screen as well as
|
* MAC adress during startup and will be displayed on device's screen as well as
|
@ -488,11 +488,6 @@ void setup() {
|
|||||||
#warning you did not specify a time source, time will not be synched
|
#warning you did not specify a time source, time will not be synched
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// initialize gps time
|
|
||||||
#if (HAS_GPS)
|
|
||||||
get_gpstime();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (defined HAS_IF482 || defined HAS_DCF77)
|
#if (defined HAS_IF482 || defined HAS_DCF77)
|
||||||
ESP_LOGI(TAG, "Starting Clock Controller...");
|
ESP_LOGI(TAG, "Starting Clock Controller...");
|
||||||
clock_init();
|
clock_init();
|
||||||
|
@ -89,7 +89,7 @@
|
|||||||
#define TIME_SYNC_INTERVAL_RETRY 10 // retry time sync after lost sync each .. minutes [default = 10], 0 means off
|
#define TIME_SYNC_INTERVAL_RETRY 10 // retry time sync after lost sync each .. minutes [default = 10], 0 means off
|
||||||
#define TIME_SYNC_SAMPLES 1 // number of time requests for averaging, max. 255
|
#define TIME_SYNC_SAMPLES 1 // number of time requests for averaging, max. 255
|
||||||
#define TIME_SYNC_CYCLE 60 // delay between two time samples [seconds]
|
#define TIME_SYNC_CYCLE 60 // delay between two time samples [seconds]
|
||||||
#define TIME_SYNC_TIMEOUT 300 // timeout waiting for timeserver answer [seconds]
|
#define TIME_SYNC_TIMEOUT 400 // timeout waiting for timeserver answer [seconds]
|
||||||
#define TIME_SYNC_COMPILEDATE 0 // set to 1 to use compile date to initialize RTC after power outage [default = 0]
|
#define TIME_SYNC_COMPILEDATE 0 // set to 1 to use compile date to initialize RTC after power outage [default = 0]
|
||||||
|
|
||||||
// time zone, see https://github.com/JChristensen/Timezone/blob/master/examples/WorldClock/WorldClock.ino
|
// time zone, see https://github.com/JChristensen/Timezone/blob/master/examples/WorldClock/WorldClock.ino
|
@ -26,12 +26,13 @@ Ticker timesyncer;
|
|||||||
void timeSync() { xTaskNotify(irqHandlerTask, TIMESYNC_IRQ, eSetBits); }
|
void timeSync() { xTaskNotify(irqHandlerTask, TIMESYNC_IRQ, eSetBits); }
|
||||||
|
|
||||||
void calibrateTime(void) {
|
void calibrateTime(void) {
|
||||||
|
ESP_LOGD(TAG, "[%0.3f] calibrateTime, timeSource == %d", millis() / 1000.0,
|
||||||
|
timeSource);
|
||||||
time_t t = 0;
|
time_t t = 0;
|
||||||
uint16_t t_msec = 0;
|
uint16_t t_msec = 0;
|
||||||
|
|
||||||
// kick off asychronous lora timesync if we have
|
// kick off asychronous lora timesync if we have
|
||||||
#if (HAS_LORA) && (TIME_SYNC_LORASERVER) || (TIME_SYNC_LORAWAN)
|
#if (HAS_LORA) && ((TIME_SYNC_LORASERVER) || (TIME_SYNC_LORAWAN))
|
||||||
timesync_request();
|
timesync_request();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -43,17 +44,17 @@ void calibrateTime(void) {
|
|||||||
// has RTC -> fallback to RTC time
|
// has RTC -> fallback to RTC time
|
||||||
#ifdef HAS_RTC
|
#ifdef HAS_RTC
|
||||||
t = get_rtctime();
|
t = get_rtctime();
|
||||||
timeSource = _rtc;
|
// set time from RTC - method will check if time is valid
|
||||||
|
setMyTime((uint32_t)t, t_msec, _rtc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// no RTC -> fallback to GPS time
|
// no RTC -> fallback to GPS time
|
||||||
#if (HAS_GPS)
|
#if (HAS_GPS)
|
||||||
t = get_gpstime(&t_msec);
|
t = get_gpstime(&t_msec);
|
||||||
timeSource = _gps;
|
// set time from GPS - method will check if time is valid
|
||||||
|
setMyTime((uint32_t)t, t_msec, _gps);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
setMyTime((uint32_t)t, t_msec, timeSource); // set time
|
|
||||||
|
|
||||||
} // fallback
|
} // fallback
|
||||||
|
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user