diff --git a/README.md b/README.md
index c6d9c99fb..b56caabde 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,7 @@ Currently supported IoT boards:
- TTGOv2
- Pycom LoPy
- Pycom LoPy4
+- LoLin32 with [LoraNode32 shield](https://github.com/hallard/LoLin32-Lora)
Target platform must be selected in [platformio.ini](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/platformio.ini).
Hardware dependent settings (pinout etc.) are stored in board files in /hal directory.
@@ -37,6 +38,7 @@ Hardware dependent settings (pinout etc.) are stored in board files in /hal dire
- TTGOv2 ~670mW
- LoPy with expansion board: ~530mW
- LoPy pure, without expansion board: ~460mW
+- LoLin32 with [LoraNode32 shield](https://github.com/hallard/LoLin32-Lora): TBD
These results where metered with software version 1.2.0 during active wifi scan, no LoRa TX’ing, OLED display off, 5V USB powered.
diff --git a/platformio.ini b/platformio.ini
index 5be224b53..75a8b2185 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -10,11 +10,12 @@
; ---> SELECT TARGET PLATFORM HERE! <---
[platformio]
-env_default = heltec_wifi_lora_32
+;env_default = heltec_wifi_lora_32
;env_default = ttgov1
;env_default = ttgov2
;env_default = lopy
;env_default = lopy4
+env_default = lolin32_lora
[env:heltec_wifi_lora_32]
platform = espressif32
@@ -123,4 +124,28 @@ build_flags =
-include "src/main.h"
-include "src/hal/lopy4.h"
;FreeRTOS single core operation, switches off core 1 (see arduino-esp32/cores/esp32/main.cpp)
-; -DCONFIG_FREERTOS_UNICORE
\ No newline at end of file
+; -DCONFIG_FREERTOS_UNICORE
+
+[env:lolin32_lora]
+platform = espressif32
+board = lolin32
+framework = arduino
+monitor_baud = 115200
+upload_speed = 921600
+lib_deps =
+ U8g2
+ ESP32 BLE Arduino@>=0.4.9
+build_flags =
+;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework
+ -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE
+; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
+;needed for ESP32 BLE Ardunio v0.4.9
+ -fexceptions
+ -std=c++11
+;override lora settings from LMiC library in lmic/config.h and use main.h instead
+ -D_lmic_config_h_
+ -include "src/main.h"
+ -include "src/hal/lolin32_lora.h"
+;FreeRTOS single core operation, switches off core 1 (see arduino-esp32/cores/esp32/main.cpp)
+; -DCONFIG_FREERTOS_UNICORE
+
diff --git a/src/blecount.cpp b/src/blecount.cpp
index b2cd6c92b..3872d3607 100644
--- a/src/blecount.cpp
+++ b/src/blecount.cpp
@@ -19,7 +19,7 @@ class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void BLECount() {
u8x8.clearLine(3);
u8x8.drawString(0,3,"BLE Scan...");
- BLEDevice::init("PaxCnt");
+ BLEDevice::init(PROGNAME);
BLEScan* pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
diff --git a/src/hal/lolin32_lora.h b/src/hal/lolin32_lora.h
new file mode 100644
index 000000000..632c5ddad
--- /dev/null
+++ b/src/hal/lolin32_lora.h
@@ -0,0 +1,32 @@
+// Hardware related definitions for lolin32 loraNode32 shield
+// See https://github.com/hallard/LoLin32-Lora
+
+// disable brownout detection (avoid unexpected reset on some boards)
+#define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
+
+#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C // OLED-Display on board
+#define HAS_LED NOT_A_PIN // Led os on same pin than Lora SS pin, to avoid pb, we don't use it
+ // Anyway shield is on over the LoLin32 board, so we won't be able to see this LED
+#define HAS_RGB_LED 13 // ESP32 GPIO13 (pin13) On Board Shield WS2812B RGB LED
+#define HAS_BUTTON 15 // ESP32 GPIO15 (pin15) Button is on the LoraNode32 shield
+#define BUTTON_PULLUP 1 // Button need pullup instead of default pulldown
+
+#define CFG_sx1276_radio 1 // RFM95 module
+
+// re-define pin definitions of pins_arduino.h
+#define PIN_SPI_SS 5 // ESP32 GPIO5 (Pin5) -- SX1276 NSS (Pin19) SPI Chip Select Input
+#define PIN_SPI_MOSI 23 // ESP32 GPIO23 (Pin23) -- SX1276 MOSI (Pin18) SPI Data Input
+#define PIN_SPI_MISO 19 // ESP32 GPIO19 (Pin19) -- SX1276 MISO (Pin17) SPI Data Output
+#define PIN_SPI_SCK 18 // ESP32 GPIO18 (Pin18 -- SX1276 SCK (Pin16) SPI Clock Input
+
+// non arduino pin definitions
+#define RST 25 // ESP32 GPIO25 (Pin25) -- SX1276 NRESET (Pin7) Reset Trigger Input
+#define DIO0 27 // ESP32 GPIO27 (Pin27) -- SX1276 DIO0 (Pin8) used by LMIC for detecting LoRa RX_Done & TX_Done
+#define DIO1 26 // ESP32 GPIO26 (Pin26) -- SX1276 DIO1 (Pin9) used by LMIC for detecting LoRa RX_Timeout
+#define DIO2 4 // ESP32 GPIO4 (Pin4) -- SX1276 DIO2 (Pin10) not used by LMIC for LoRa (Timeout for FSK only)
+
+// Hardware pin definitions for LoRaNode32 Board with OLED I2C Display
+#define OLED_RST U8X8_PIN_NONE // Not reset pin
+#define OLED_SDA 21 // ESP32 GPIO21 (Pin21) -- OLED SDA
+#define OLED_SCL 22 // ESP32 GPIO22 (Pin22) -- OLED SCL
+
diff --git a/src/hal/ttgov2.h b/src/hal/ttgov2.h
index ec0ec5de4..beae5675d 100644
--- a/src/hal/ttgov2.h
+++ b/src/hal/ttgov2.h
@@ -3,6 +3,10 @@
#define CFG_sx1276_radio 1 // HPD13A LoRa SoC
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C
+//#define HAS_LED NOT_A_PIN // on-board LED is wired to SCL (used by display) therefore totally useless
+
+// disable brownout detection (needed on TTGOv2 for battery powered operation)
+#define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
// re-define pin definitions of pins_arduino.h
#define PIN_SPI_SS 18 // ESP32 GPIO18 (Pin18) -- HPD13A NSS/SEL (Pin4) SPI Chip Select Input
diff --git a/src/main.cpp b/src/main.cpp
index 33f6cd7bc..c1db254a6 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -323,6 +323,12 @@ void init_display(const char *Productname, const char *Version) {
void setup() {
+ // disable brownout detection
+#ifdef DISABLE_BROWNOUT
+ // Register with brownout is at address DR_REG_RTCCNTL_BASE + 0xd4
+ (*((volatile uint32_t *)ETS_UNCACHED_ADDR((DR_REG_RTCCNTL_BASE+0xd4)))) = 0;
+#endif
+
// setup debug output or silence device
#ifdef VERBOSE
Serial.begin(115200);
@@ -361,10 +367,16 @@ void setup() {
digitalWrite(HAS_LED, LOW);
#endif
- // install button interrupt
#ifdef HAS_BUTTON
- pinMode(HAS_BUTTON, INPUT_PULLDOWN);
- attachInterrupt(digitalPinToInterrupt(HAS_BUTTON), isr_button_pressed, FALLING);
+ #ifdef BUTTON_PULLUP
+ // install button interrupt (pullup mode)
+ pinMode(HAS_BUTTON, INPUT_PULLUP);
+ attachInterrupt(digitalPinToInterrupt(HAS_BUTTON), isr_button_pressed, RISING);
+ #else
+ // install button interrupt (pulldown mode)
+ pinMode(HAS_BUTTON, INPUT_PULLDOWN);
+ attachInterrupt(digitalPinToInterrupt(HAS_BUTTON), isr_button_pressed, FALLING);
+ #endif
#endif
// initialize wifi antenna
diff --git a/src/main.h b/src/main.h
index 36541f8dc..a32c075b1 100644
--- a/src/main.h
+++ b/src/main.h
@@ -1,5 +1,5 @@
// program version
-#define PROGVERSION "1.2.41" // use max 10 chars here!
+#define PROGVERSION "1.2.5" // use max 10 chars here!
#define PROGNAME "PAXCNT"
// Verbose enables serial output
diff --git a/src/rcommand.cpp b/src/rcommand.cpp
index 97b647a61..46fe8022f 100644
--- a/src/rcommand.cpp
+++ b/src/rcommand.cpp
@@ -13,23 +13,23 @@
// Local logging tag
static const char *TAG = "rcommand";
+// table of remote commands and assigned functions
+typedef struct {
+ const int nam;
+ void (*func)(int);
+ const bool store;
+} cmd_t;
+
// functions defined in configmanager.cpp
void eraseConfig(void);
void saveConfig(void);
-// defined in antenna.cpp
+// function defined in antenna.cpp
#ifdef HAS_ANTENNA_SWITCH
void antenna_select(const int8_t _ant);
#endif
-// table of remote commands and assigned functions
-typedef struct {
- const int nam;
- void (*func)(int);
- const bool store;
-} cmd_t;
-
-// help function to assign LoRa datarates to spreadfactor values
+// help function to assign LoRa datarates to numeric spreadfactor values
void switch_lora (int sf, int tx) {
if ( tx > 20 ) return;
cfg.txpower = tx;