From ecaf4f851a2cbd6d33d83ab6b2044b98706841a0 Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Sun, 28 Oct 2018 01:59:28 +0200 Subject: [PATCH] Update to latest NodeManager code --- MyBoardNRF5.cpp | 111 ++++++++++++++++++++ MyBoardNRF5.h | 180 ++++++++++++++++++++++++++++++++ NodeManager_PlantWaterLevel.ino | 82 +++++++-------- 3 files changed, 329 insertions(+), 44 deletions(-) create mode 100644 MyBoardNRF5.cpp create mode 100644 MyBoardNRF5.h diff --git a/MyBoardNRF5.cpp b/MyBoardNRF5.cpp new file mode 100644 index 0000000..4156e21 --- /dev/null +++ b/MyBoardNRF5.cpp @@ -0,0 +1,111 @@ +/* + If you don't use an nRF5 board, you can ignore this file. + + This file was part of the "My Sensors nRF5 Boards" board repository + available at https://github.com/mysensors/ArduinoBoards If you have + questions, please refer the documentation at + https://github.com/mysensors/ArduinoHwNRF5 first. + + This file is compatible with ArduinoHwNRF5 >= 0.2.0 + + This file allows you to change the relation between pins referenced in + the Arduino IDE (0..31) and pins of the nRF5 MCU (P0.00..P0.31). + + If you can live with addressing the GPIO pins by using the Arduino pins + 0..31 instead of a custom mapping, don't change this file. If you have + a lot of Arduino code with fixed pin numbers and you need to map these + pins to specific pins of the nRF5 MCU; you need to change this file. + + If you fill the "g_APinDescription" Array with numbers between 0..31, + the Arduino pins 0..31 are assigned to pins P0.00..P0.31 of the MCU. + + As an example, if you need to change the pin mapping for Arduino pin 5 + to P0.12 of the MCU, you have to write the 12 after PORT0 into the sixth + position in the "g_APinDescription" Array. + + The extended attributes only affects the nRF5 variants provided with + official Arduino boards. The arduino-nrf5 variant ignores the extended + attributes. + + The pin mapping effects commands like "pinMode()", "digitalWrite()", + "analogRead()" and "analogWrite()". + + If you change the pin mapping, you have to modify the pins in + "MyBoardNRF5.h". Especially the analog pin mapping must be replaced with + your pin numbers by replacing PIN_AIN0..7 with a number of your mapping + array. You can use the constants PIN_AIN0..7 in the "g_APinDescription" + Array if you want to reference analog ports MCU independent. You cannot + use the pins P0.00 and P0.01 for GPIO, when the 32kHz crystal is connected. + + + ########################################################################### + + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Arduino Srl. All right reserved. + Copyright (c) 2017 Sensnology AB. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + + +#ifdef MYBOARDNRF5 +#include <variant.h> + +/* + * Pins descriptions. Attributes are ignored by arduino-nrf5 variant. + * Definition taken from Arduino Primo Core with ordered ports + */ +const PinDescription g_APinDescription[]= +{ + { NOT_A_PORT, 0, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // LFCLK + { NOT_A_PORT, 1, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // LFCLK + { PORT0, 2, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A0, PWM4, NOT_ON_TIMER}, + { PORT0, 3, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A1, PWM5, NOT_ON_TIMER}, + { PORT0, 4, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A2, PWM6, NOT_ON_TIMER}, + { PORT0, 5, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A3, PWM7, NOT_ON_TIMER}, + { PORT0, 6, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT3 + { PORT0, 7, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT4 + { PORT0, 8, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM10, NOT_ON_TIMER}, //USER_LED + { PORT0, 9, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // NFC1 + { PORT0, 10, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // NFC2 + { PORT0, 11, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TX + { PORT0, 12, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // RX + { PORT0, 13, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SDA + { PORT0, 14, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SCL + { PORT0, 15, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SDA1 + { PORT0, 16, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SCL1 + { PORT0, 17, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TP4 + { PORT0, 18, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TP5 + { PORT0, 19, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT2 + { PORT0, 20, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT1 + { PORT0, 21, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT1 + { PORT0, 22, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM9, NOT_ON_TIMER}, + { PORT0, 23, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM8, NOT_ON_TIMER}, + { PORT0, 24, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT + { PORT0, 25, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //RED_LED + { PORT0, 26, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //GREEN_LED + { PORT0, 27, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //BLUE_LED + { PORT0, 28, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A4, PWM3, NOT_ON_TIMER}, + { PORT0, 29, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A5, PWM2, NOT_ON_TIMER}, + { PORT0, 30, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A6, PWM1, NOT_ON_TIMER}, + { PORT0, 31, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A7, PWM0, NOT_ON_TIMER} +}; + +// Don't remove this line +#include <compat_pin_mapping.h> + +#endif + diff --git a/MyBoardNRF5.h b/MyBoardNRF5.h new file mode 100644 index 0000000..e3e456f --- /dev/null +++ b/MyBoardNRF5.h @@ -0,0 +1,180 @@ +/* + If you don't use an nRF5 board, you can ignore this file. + + This file was part of the "My Sensors nRF5 Boards" board repository + available at https://github.com/mysensors/ArduinoBoards If you have + questions, please refer the documentation at + https://github.com/mysensors/ArduinoHwNRF5 first. + + This file is compatible with ArduinoHwNRF5 >= 0.2.0 + + This file allows you to change the pins of internal hardware, like the + serial port, SPI bus or Wire bus. + + All pins referenced here are mapped via the "g_ADigitalPinMap" Array + defined in "MyBoardNRF5.cpp" to pins of the MCU. + + As an example, if you have at the third position in "g_ADigitalPinMap" the + 12, then all ports referenced in Arduino with 2 are mapped to P0.12. If you + don't change the "g_ADigitalPinMap" Array, the Arduino pins 0..31 are + translated to P0.00..P0..31. + + ########################################################################### + + This file is compatible with ArduinoHwNRF5 > 0.1.0 + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry. All right reserved. + Copyright (c) 2017 Sensnology AB. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _MYBOARDNRF5_H_ +#define _MYBOARDNRF5_H_ + +/* BOARD LAYOUT of the MultiSensor V9 board by NeverDie: + * P0.01 ... LED => LED_BUILTIN + * P0.02 ... Water sensor (1M pullup to VIN, 3 contact sensors in parallel, signal is PULL LOW) + * P0.03 ... INT pin of 5-pin header + * P0.04 ... SDA + * P0.09 ... OUT Signal of Hall sensor + * P0.10 ... SCL + * P0.13 ... Debug TX UART pin (no corresponding RX pin!) + * SWDIO ... SWD data lines + * SWDCLK .. SWD data lines + */ + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +// Number of pins defined in PinDescription array +#define PINS_COUNT (32u) +#define NUM_DIGITAL_PINS (32u) +#define NUM_ANALOG_INPUTS (8u) +#define NUM_ANALOG_OUTPUTS (8u) + +/* + * LEDs + * + * This is optional + * + * With My Sensors, you can use + * hwPinMode() instead of pinMode() + * hwPinMode() allows to use advanced modes like OUTPUT_H0H1 to drive LEDs. + * https://github.com/mysensors/MySensors/blob/development/drivers/NRF5/nrf5_wiring_constants.h + * + */ +#define PIN_LED1 (1) +// #define PIN_LED2 (25) +// #define PIN_LED3 (26) +// #define PIN_LED4 (27) +// #define PIN_LED5 (12) +// #define PIN_LED6 (14) +// #define PIN_LED7 (15) +// #define PIN_LED8 (16) +// #define USER_LED (PIN_LED2) +// #define RED_LED (PIN_LED3) +// #define GREEN_LED (PIN_LED4) +// #define BLUE_LED (PIN_LED1) +// #define BLE_LED BLUE_LED +#define LED_BUILTIN PIN_LED1 + +/* + * Buttons + * + * This is optional + */ +// #define PIN_BUTTON1 (3) +// #define PIN_BUTTON2 (4) +// #define PIN_BUTTON3 (5) +// #define PIN_BUTTON4 (6) +// #define PIN_BUTTON5 (7) +// #define PIN_BUTTON6 (8) +// #define PIN_BUTTON7 (9) +// #define PIN_BUTTON8 (10) + +/* + * Analog ports + * + * If you change g_APinDescription, replace PIN_AIN0 with + * port numbers mapped by the g_APinDescription Array. + * You can add PIN_AIN0 to the g_APinDescription Array if + * you want provide analog ports MCU independed, you can add + * PIN_AIN0..PIN_AIN7 to your custom g_APinDescription Array + * defined in MyBoardNRF5.cpp + */ +static const uint8_t A0 = ADC_A0; +static const uint8_t A1 = ADC_A1; +static const uint8_t A2 = ADC_A2; +static const uint8_t A3 = ADC_A3; +static const uint8_t A4 = ADC_A4; +static const uint8_t A5 = ADC_A5; +static const uint8_t A6 = ADC_A6; +static const uint8_t A7 = ADC_A7; + +/* + * Serial interfaces + * + * RX and TX are required. + * If you have no serial port, use unused pins + * CTS and RTS are optional. + */ +#define PIN_SERIAL_RX (8) +#define PIN_SERIAL_TX (13) +// #define PIN_SERIAL_CTS (4) +// #define PIN_SERIAL_RTS (5) + +/* + * SPI Interfaces + * + * This is optional + * + * If SPI is defined MISO, MOSI, SCK are required + * SS is optional and can be used in your sketch. + */ +#define SPI_INTERFACES_COUNT 1 + +#define PIN_SPI_MISO (22) +#define PIN_SPI_MOSI (23) +#define PIN_SPI_SCK (24) +#define PIN_SPI_SS (21) + +static const uint8_t SS = PIN_SPI_SS; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +/* + * Wire Interfaces + * + * This is optional + */ +#define WIRE_INTERFACES_COUNT 2 + +#define PIN_WIRE_SDA (4u) +#define PIN_WIRE_SCL (10u) + +#define PIN_WIRE_SDA1 (15u) +#define PIN_WIRE_SCL1 (16u) + +static const uint8_t SDA = PIN_WIRE_SDA; +static const uint8_t SCL = PIN_WIRE_SCL; + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/NodeManager_PlantWaterLevel.ino b/NodeManager_PlantWaterLevel.ino index c29b045..b0eb06c 100644 --- a/NodeManager_PlantWaterLevel.ino +++ b/NodeManager_PlantWaterLevel.ino @@ -35,7 +35,8 @@ NodeManager provides built-in implementation of a number of sensors through ad-h #define MY_NODE_ID 53 //#define USE_DISPLAY - +#define USE_BATTERY +#define USE_SIGNAL #define MY_RADIO_NRF5_ESB @@ -47,19 +48,25 @@ NodeManager provides built-in implementation of a number of sensors through ad-h //#define MY_DEBUG_VERBOSE_RF24 // Advanced settings -//#define My_BAUD_RATE 115200 +#define My_BAUD_RATE 57600 #define MY_SMART_SLEEP_WAIT_DURATION_MS 500 #define MY_SPLASH_SCREEN_DISABLED //#define MY_DISABLE_RAM_ROUTING_TABLE_FEATURE //#define MY_SIGNAL_REPORT_ENABLED -// Optimizations when running on 2032 Coin Cell. Also set nodeManager.setSleepBetweenSend(500) and run the board at 1Mhz -#define MY_TRANSPORT_UPLINK_CHECK_DISABLED +// Settings to avoid killing coin cell in case of connection problem #define MY_TRANSPORT_WAIT_READY_MS 10000 #define MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS 5000 -#define MY_PARENT_NODE_ID 0 -#define MY_PARENT_NODE_IS_STATIC +// Optimizations when running on 2032 Coin Cell. Also set nodeManager.setSleepBetweenSend(500) and run the board at 1Mhz +//#define MY_TRANSPORT_UPLINK_CHECK_DISABLED +//#define MY_TRANSPORT_WAIT_READY_MS 10000 +//#define MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS 5000 +//#define MY_PARENT_NODE_ID 0 +//#define MY_PARENT_NODE_IS_STATIC + +//#include <Wire.h> +//#include <MySensors.h> /*********************************** * NodeManager configuration @@ -68,8 +75,8 @@ NodeManager provides built-in implementation of a number of sensors through ad-h #define NODEMANAGER_DEBUG ON #define NODEMANAGER_INTERRUPTS ON #define NODEMANAGER_SLEEP ON -#define NODEMANAGER_RECEIVE ON -#define NODEMANAGER_DEBUG_VERBOSE OFF +#define NODEMANAGER_RECEIVE OFF +#define NODEMANAGER_DEBUG_VERBOSE ON #define NODEMANAGER_POWER_MANAGER OFF #define NODEMANAGER_CONDITIONAL_REPORT OFF #define NODEMANAGER_EEPROM OFF @@ -87,22 +94,21 @@ NodeManager provides built-in implementation of a number of sensors through ad-h * Add your sensors */ -//PowerManager power(5,6); - -#include <sensors/SensorBattery.h> -SensorBattery battery; - -#include <sensors/SensorConfiguration.h> -SensorConfiguration configuration; +#ifdef USE_BATTERY + #include <sensors/SensorBattery.h> + SensorBattery battery; +#endif -#include <sensors/SensorSignal.h> -SensorSignal signal; +#ifdef USE_SIGNAL + #include <sensors/SensorSignal.h> + SensorSignal signal; +#endif #define XSHUT_PIN (03u) -//#include <sensors/SensorVL53L0X.h> -//SensorVL53L0X vl53l0x(XSHUT_PIN); -#include "SensorVL53L0X_WaterLevel.h" -SensorVL53L0X_WaterLevel vl53l0x(XSHUT_PIN, 200, 60); +#include <sensors/SensorVL53L0X.h> +SensorVL53L0X vl53l0x(XSHUT_PIN); +//#include "SensorVL53L0X_WaterLevel.h" +//SensorVL53L0X_WaterLevel vl53l0x(XSHUT_PIN, 200, 60); #ifdef USE_DISPLAY #include <sensors/DisplaySSD1306.h> @@ -112,8 +118,6 @@ SensorVL53L0X_WaterLevel vl53l0x(XSHUT_PIN, 200, 60); #endif - - void blinkLED(uint16_t len = 50, uint16_t pause = 50, uint8_t pin = LED_BUILTIN) { digitalWrite(pin, HIGH); delay(len); @@ -137,7 +141,6 @@ void blinkityBlink(uint8_t repetitions) { // before void before() { - nodeManager.setSleepBetweenSend(500); // sleep 20 sec, report 20 sec @@ -146,12 +149,13 @@ void before() { blinkityBlink(1); blinkityBlink(1); blinkityBlink(1); - // setup the serial port baud rate + #ifdef CHIP_NRF5 // Reassign Serial Pins as given in the board definition - Serial.setPins(PIN_SERIAL_RX, PIN_SERIAL_TX); +// MY_SERIALDEVICE.setPins(PIN_SERIAL_RX, 13); #endif - Serial.begin(MY_BAUD_RATE); + // setup the serial port baud rate +// MY_SERIALDEVICE.begin(MY_BAUD_RATE); /* * Configure your sensors @@ -163,10 +167,6 @@ void before() { #ifdef USE_SIGNAL signal.setReportIntervalSeconds(reportSecs); #endif -#ifdef USE_CONFIGURATION - configuration.setReportIntervalSeconds(reportSecs); -// configuration.children.get(1)->setDescription("Configuration"); -#endif #ifdef USE_BATTERY battery.setReportIntervalSeconds(reportSecs); @@ -195,23 +195,25 @@ void presentation() { // setup void setup() { + hwPinMode(LED_BUILTIN,OUTPUT_D0H1); blinkityBlink(3); //signify power-up and start of operations - NRF_CLOCK->INTENSET = B11; // enable interrupts for EVENTS_HFCLKSTARTED and EVENTS_LFCLKSTARTED - NRF_CLOCK->TASKS_HFCLKSTART = 1; //start the high frequency crystal oscillator clock - while (!(NRF_CLOCK->EVENTS_HFCLKSTARTED)) {} //wait until high frequency crystal oscillator clock is up to speed and working +// NRF_CLOCK->INTENSET = B11; // enable interrupts for EVENTS_HFCLKSTARTED and EVENTS_LFCLKSTARTED +// NRF_CLOCK->TASKS_HFCLKSTART = 1; //start the high frequency crystal oscillator clock +// while (!(NRF_CLOCK->EVENTS_HFCLKSTARTED)) {} //wait until high frequency crystal oscillator clock is up to speed and working #ifdef CHIP_NRF5 // Setup I2C pins (custom pins given in the board definition!) - Wire.setPins(SDA, SCL); +// Wire.setPins(SDA, SCL); +// Wire.begin(); #endif // call NodeManager setup routine nodeManager.setup(); #ifdef USE_DISPLAY -// ssd1306.rotateDisplay(true); + ssd1306.rotateDisplay(true); #endif } @@ -220,17 +222,9 @@ void setup() { void loop() { blinkityBlink(1); - Wire.begin(); - NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos; - NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos; - // call NodeManager loop routine nodeManager.loop(); - Wire.end(); - NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos; - NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos; - } #if NODEMANAGER_RECEIVE == ON -- GitLab