Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions variants/modular_mesh_maker/MMMBoard.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#include <Arduino.h>
#include <Wire.h>

#include "MMMBoard.h"

void MMMBoard::begin() {
NRF52Board::begin();
btn_prev_state = HIGH;

pinMode(PIN_VBAT_READ, INPUT);

#ifdef BUTTON_PIN
pinMode(BUTTON_PIN, INPUT_PULLUP);
#endif

#if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL)
Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL);
#endif

Wire.begin();

pinMode(P_LORA_POWER_EN, OUTPUT);
digitalWrite(P_LORA_POWER_EN, HIGH);
delay(10);
}
62 changes: 62 additions & 0 deletions variants/modular_mesh_maker/MMMBoard.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#pragma once

#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>

#define PIN_VBAT_READ 17
#define ADC_MULTIPLIER (1.815f) // dependent on voltage divider resistors. TODO: more accurate battery tracking

class MMMBoard : public NRF52BoardDCDC {
protected:
uint8_t btn_prev_state;
float adc_mult = ADC_MULTIPLIER;

public:
MMMBoard() : NRF52Board("MMM_OTA") {}
void begin();

#define BATTERY_SAMPLES 8

uint16_t getBattMilliVolts() override {
analogReadResolution(12);

uint32_t raw = 0;
for (int i = 0; i < BATTERY_SAMPLES; i++) {
raw += analogRead(PIN_VBAT_READ);
}
raw = raw / BATTERY_SAMPLES;
return (adc_mult * raw);
}

bool setAdcMultiplier(float multiplier) override {
if (multiplier == 0.0f) {
adc_mult = ADC_MULTIPLIER;}
else {
adc_mult = multiplier;
}
return true;
}
float getAdcMultiplier() const override {
if (adc_mult == 0.0f) {
return ADC_MULTIPLIER;
} else {
return adc_mult;
}
}

const char* getManufacturerName() const override {
return MANUFACTURER_STRING;
}

int buttonStateChanged() {
#ifdef BUTTON_PIN
uint8_t v = digitalRead(BUTTON_PIN);
if (v != btn_prev_state) {
btn_prev_state = v;
return (v == LOW) ? 1 : -1;
}
#endif
return 0;
}
};
197 changes: 197 additions & 0 deletions variants/modular_mesh_maker/platformio.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
[modular_mesh_maker]
build_flags = ${nrf52_base.build_flags}
-I variants/modular_mesh_maker
-D MANUFACTURER_STRING='"Modular Mesh Maker"'
-D ENV_INCLUDE_AHTX0=1
-D ENV_INCLUDE_BME280=1
-D ENV_INCLUDE_BMP280=1
-D ENV_INCLUDE_INA3221=1
-D ENV_INCLUDE_INA219=1
build_src_filter = ${nrf52_base.build_src_filter}
+<helpers/sensors>
+<../variants/modular_mesh_maker>
lib_deps= ${nrf52_base.lib_deps}
adafruit/Adafruit SSD1306 @ ^2.5.13
adafruit/Adafruit INA3221 Library @ ^1.0.1
adafruit/Adafruit INA219 @ ^1.2.3
adafruit/Adafruit AHTX0 @ ^2.0.5
adafruit/Adafruit BME280 Library @ ^2.3.0
adafruit/Adafruit BMP280 Library@^2.6.8

[mmm_promicro]
extends = nrf52_base
board = promicro_nrf52840
build_src_filter = ${modular_mesh_maker.build_src_filter}
build_flags = ${modular_mesh_maker.build_flags}
-D PROMICRO
-D P_LORA_POWER_EN=2
-D P_LORA_DIO_1=11
-D P_LORA_NSS=13
-D P_LORA_SCLK=12
-D P_LORA_MOSI=14
-D P_LORA_MISO=15
-D P_LORA_RESET=10
-D P_LORA_BUSY=16
-D PIN_BOARD_SCL=7
-D PIN_BOARD_SDA=8
-D PIN_OLED_RESET=-1
-D PIN_USER_BTN=6
; GPS RX and TX are defined backwards by Meshcore
; PIN_GPS_RX is output to GPS uart
; PIN_GPS_TX is input from GPS uart
-D PIN_GPS_RX=4
-D PIN_GPS_TX=3
-D PIN_GPS_EN=5
-D GPS_BAUD_RATE=115200
-D ENV_INCLUDE_GPS=1
lib_deps = ${modular_mesh_maker.lib_deps}
stevemarple/MicroNMEA @ ^2.0.6

[mmm_xiaonrf52]
extends = nrf52_base
board = seeed-xiao-afruitnrf52-nrf52840
board_build.ldscript = boards/nrf52840_s140_v7.ld
build_src_filter = ${modular_mesh_maker.build_src_filter}
build_flags = ${modular_mesh_maker.build_flags}
-D NRF52_PLATFORM
-D XIAO_NRF52
-I lib/nrf52/s140_nrf52_7.3.0_API/include
-I lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52
-I src/helpers/nrf52
-D P_LORA_TX_LED=D11
-D DISPLAY_CLASS=SSD1306Display
-D DISPLAY_ROTATION=2
-D P_LORA_DIO_1=1
-D P_LORA_RESET=2
-D P_LORA_BUSY=3
-D P_LORA_NSS=4
-D P_LORA_POWER_EN=5
-D PIN_USER_BTN=0
-D PIN_WIRE_SCL=7
-D PIN_WIRE_SDA=6
-UENV_INCLUDE_GPS
lib_deps = ${modular_mesh_maker.lib_deps}

[mmm_lr2021]
extends = modular_mesh_maker
build_src_filter = ${modular_mesh_maker}
build_flags =
-D USE_LR2021
-D RADIO_CLASS=CustomLR2021
-D WRAPPER_CLASS=CustomLR2021Wrapper
-D LR2021_IRQ_DIO=9
-D LR2021_TCXO_VOLTAGE=3.3f
-D RF_SWITCH_TABLE
-D LORA_TX_POWER=22

[mmm_e22p]
extends = modular_mesh_maker
build_src_filter = ${modular_mesh_maker}
build_flags =
-D USE_SX1262
-D RADIO_CLASS=CustomSX1262
-D WRAPPER_CLASS=CustomSX1262Wrapper
-D SX126X_POWER_EN=D5
-D SX126X_TXEN=RADIOLIB_NC
-D SX126X_DIO2_AS_RF_SWITCH=1
-D SX126X_DIO3_TCXO_VOLTAGE=1.8
-D SX126X_CURRENT_LIMIT=140
-D SX126X_RX_BOOSTED_GAIN=1
-D LORA_TX_POWER=18

[env:mmm_promicro_e22p_repeater]
extends = mmm_promicro
build_src_filter = ${modular_mesh_maker.build_src_filter}
${mmm_promicro.build_src_filter}
${mmm_e22p.build_src_filter}
+<../examples/simple_repeater>
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
build_flags =
${modular_mesh_maker.build_flags}
${mmm_promicro.build_flags}
${mmm_e22p.build_flags}
-D ADVERT_NAME='"Modular Mesh Maker Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D DISPLAY_CLASS=SSD1306Display
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
lib_deps = ${modular_mesh_maker.lib_deps}
${mmm_promicro.lib_deps}
adafruit/RTClib @ ^2.1.3


[env:mmm_promicro_lr2021_repeater]
extends = mmm_promicro
build_src_filter = ${modular_mesh_maker.build_src_filter}
${mmm_promicro.build_src_filter}
${mmm_lr2021.build_src_filter}
+<../examples/simple_repeater>
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
build_flags =
${modular_mesh_maker.build_flags}
${mmm_promicro.build_flags}
${mmm_lr2021.build_flags}
-D ADVERT_NAME='"Modular Mesh Maker Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D DISPLAY_CLASS=SSD1306Display
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
lib_deps = ${modular_mesh_maker.lib_deps}
${mmm_promicro.lib_deps}
adafruit/RTClib @ ^2.1.3

[env:mmm_xiaonrf52_e22p_repeater]
extends = mmm_xiaonrf52
build_src_filter = ${modular_mesh_maker.build_src_filter}
${mmm_xiaonrf52.build_src_filter}
${mmm_e22p.build_src_filter}
+<../examples/simple_repeater>
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
build_flags =
${modular_mesh_maker.build_flags}
${mmm_xiaonrf52.build_flags}
${mmm_e22p.build_flags}
-D ADVERT_NAME='"Modular Mesh Maker Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D DISPLAY_CLASS=SSD1306Display
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
lib_deps = ${modular_mesh_maker.lib_deps}
${mmm_xiaonrf52.lib_deps}
adafruit/RTClib @ ^2.1.3

[env:mmm_xiaonrf52_lr2021_repeater]
extends = mmm_xiaonrf52
build_src_filter = ${modular_mesh_maker.build_src_filter}
${mmm_xiaonrf52.build_src_filter}
${mmm_lr2021.build_src_filter}
+<../examples/simple_repeater>
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
build_flags =
${modular_mesh_maker.build_flags}
${mmm_xiaonrf52.build_flags}
${mmm_lr2021.build_flags}
-D ADVERT_NAME='"Modular Mesh Maker Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D DISPLAY_CLASS=SSD1306Display
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
lib_deps = ${modular_mesh_maker.lib_deps}
${mmm_xiaonrf52.lib_deps}
adafruit/RTClib @ ^2.1.3
64 changes: 64 additions & 0 deletions variants/modular_mesh_maker/target.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include <Arduino.h>
#include "target.h"
#include <helpers/ArduinoHelpers.h>

MMMBoard board;

RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI);

WRAPPER_CLASS radio_driver(radio, board);

VolatileRTCClock fallback_clock;
AutoDiscoverRTCClock rtc_clock(fallback_clock);
#if ENV_INCLUDE_GPS
#include <helpers/sensors/MicroNMEALocationProvider.h>
MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1, &rtc_clock);
EnvironmentSensorManager sensors = EnvironmentSensorManager(nmea);
#else
EnvironmentSensorManager sensors;
#endif

#ifdef DISPLAY_CLASS
DISPLAY_CLASS display;
MomentaryButton user_btn(PIN_USER_BTN, 1000, true, true);
#endif

#ifdef RF_SWITCH_TABLE

const uint32_t rfswitch_dios[] = {
RADIOLIB_LR2021_DIO5,
RADIOLIB_LR2021_DIO6,
RADIOLIB_LR2021_DIO7,
RADIOLIB_LR2021_DIO8,
RADIOLIB_NC
};

static const Module::RfSwitchMode_t rfswitch_table[] = {
// mode DIO5 DIO6 DIO7 DIO8
{ LR2021::MODE_STBY, {LOW, LOW, LOW, LOW }},
{ LR2021::MODE_RX, {LOW, LOW, LOW, LOW }}, // sub-GHz RX is passive on the F33
{ LR2021::MODE_TX, {LOW, HIGH, LOW, LOW }}, // DIO6 = sub-GHz TXEN (PA key)
{ LR2021::MODE_RX_HF, {HIGH, LOW, LOW, LOW}}, // 2.4G TX (never selected at 915MHz)
{ LR2021::MODE_TX_HF, {LOW, LOW, HIGH, HIGH}}, // 2.4G TX (never selected at 915MHz)
END_OF_MODE_TABLE,
};

#endif

bool radio_init() {
rtc_clock.begin(Wire);

int err = radio.std_init(&SPI);
if (err != 1) return err;

#ifdef RF_SWITCH_TABLE
radio.setRfSwitchTable(rfswitch_dios, rfswitch_table);
#endif

return true;
}

mesh::LocalIdentity radio_new_identity() {
RadioNoiseListener rng(radio);
return mesh::LocalIdentity(&rng); // create new random identity
}
33 changes: 33 additions & 0 deletions variants/modular_mesh_maker/target.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#pragma once

#define RADIOLIB_STATIC_ONLY 1
#include <RadioLib.h>
#include <helpers/radiolib/RadioLibWrappers.h>
#include <MMMBoard.h>

#if defined(USE_LR2021)
#include <helpers/radiolib/CustomLR2021Wrapper.h>
#elif defined(USE_SX1262)
#include <helpers/radiolib/CustomSX1262Wrapper.h>
#endif

#include <helpers/AutoDiscoverRTCClock.h>
#ifdef DISPLAY_CLASS
#include <helpers/ui/SSD1306Display.h>
#include <helpers/ui/MomentaryButton.h>
#endif

#include <helpers/sensors/EnvironmentSensorManager.h>

extern MMMBoard board;
extern WRAPPER_CLASS radio_driver;
extern AutoDiscoverRTCClock rtc_clock;
extern EnvironmentSensorManager sensors;

#ifdef DISPLAY_CLASS
extern DISPLAY_CLASS display;
extern MomentaryButton user_btn;
#endif

bool radio_init();
mesh::LocalIdentity radio_new_identity();
Loading