Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Hardware
  3. Just found a pair of "old" NRF51822-04 ... any good?

Just found a pair of "old" NRF51822-04 ... any good?

Scheduled Pinned Locked Moved Hardware
17 Posts 7 Posters 541 Views 7 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • monteM Offline
    monteM Offline
    monte
    wrote on last edited by
    #3

    Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.

    1 Reply Last reply
    0
    • petewillP Offline
      petewillP Offline
      petewill
      Admin
      wrote on last edited by
      #4

      @ghiglie Check out these links if you haven't used NRF5 before. They should help you get started.
      https://forum.mysensors.org/topic/9266/guide-nrf5-nrf51-nrf52-for-beginners
      https://www.openhardware.io/view/376/MySensors-NRF5-Platform

      I found the ST-LINK programmer to be easier to work with (using Windows) that the J-LINK

      My "How To" home automation video channel: https://www.youtube.com/channel/UCq_Evyh5PQALx4m4CQuxqkA

      1 Reply Last reply
      0
      • Nca78N Nca78

        Hello, @ghiglie yes you can use them with MySensors but they are not great for battery-powered sensors due to a hardware bug. If you use them as main-powered sensors they are fine, and range is decent with those.

        G Offline
        G Offline
        ghiglie
        wrote on last edited by
        #5

        Hi all,
        sorry for being so late, again... :D

        @nca78 said in Just found a pair of "old" NRF51822-04 ... any good?:

        Hello, @ghiglie yes you can use them with MySensors but they are not great for battery-powered sensors due to a hardware bug. If you use them as main-powered sensors they are fine, and range is decent with those.
        @monte said in Just found a pair of "old" NRF51822-04 ... any good?:
        Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.

        Oh, ok, I'll keep it in mind. I'm a good copy'n'paste-r , so as soon as I get to work on a chip, I'll look for the sleep code. Thanks for pointing that!
        I'm really look for battery powered sensors, as for mains powered ones I use "easier" chips as ESPs, mainly on bigger dev modules (such as NodeMCU) since I have more space.

        @petewill said in Just found a pair of "old" NRF51822-04 ... any good?:

        @ghiglie Check out these links if you haven't used NRF5 before. They should help you get started.
        https://forum.mysensors.org/topic/9266/guide-nrf5-nrf51-nrf52-for-beginners
        https://www.openhardware.io/view/376/MySensors-NRF5-Platform

        I found the ST-LINK programmer to be easier to work with (using Windows) that the J-LINK

        I have a ST-LINK I bought since I saw this chips mentioned in @NeverDie 's threads , but then I tried some STM32 blue pills and finally got a working Black Magic Probe.
        Now I just have to deal with the soldering, but I saw something like an adapter with pushpins...

        I'll keep you updated!

        atmega328p serial killer
        HomeAssistant / gateway: ESP8266 & NRF24L01+ gateway

        1 Reply Last reply
        0
        • G Offline
          G Offline
          ghiglie
          wrote on last edited by
          #6

          Well, I'm sorry I'm sooo late, but I had to stop all my testing.
          I'll definitely be back after ordering some new tools during Chinese New Yes sales...!

          atmega328p serial killer
          HomeAssistant / gateway: ESP8266 & NRF24L01+ gateway

          1 Reply Last reply
          0
          • H Offline
            H Offline
            Holosteric
            wrote on last edited by
            #7

            Let us know if NRF51822-04 is any good.

            1 Reply Last reply
            0
            • G Offline
              G Offline
              ghiglie
              wrote on last edited by ghiglie
              #8

              Well, for now, no updates! Working with pro-minis is still much more fun with my humble skills. I'm a good soldering-pad destroyer when it comes to SMD.

              In the while, I can't find a sort of adapter for SMD versione of NRF5 boards, like the flasher for ESP8266. Is there something like that out there?

              atmega328p serial killer
              HomeAssistant / gateway: ESP8266 & NRF24L01+ gateway

              1 Reply Last reply
              0
              • Puneit ThukralP Offline
                Puneit ThukralP Offline
                Puneit Thukral
                wrote on last edited by
                #9

                @Holosteric & @ghiglie I am actively working on the NRF51822. I am testing @NeverDie 's PIR and Temp/Humidity sketches. The example sketches of Mysensors didn't work well for me.
                I will report the results.
                Main sketch

                // SUMMARY: This demo sketch runs on the AM612 PIR v607 PCBto transmit battery voltage (heartbeat) and motion detections to a MySensors gateway using MySensors protocols.
                
                // Note: because this is a passive node, node ID must be set manually to a unique sensor node ID:
                #define MY_NODE_ID 143  // Passive mode requires static node ID
                
                //#define MY_CORE_ONLY
                
                #define MY_PASSIVE_NODE
                
                #define MY_RADIO_NRF5_ESB
                
                #define IS_NRF51  //true iff the target is an nRF51.  If an nRF52, then comment this line out!
                
                
                #define PIR_DETECTION_PIN 2 
                #define SHORT_WAIT 50
                
                #include <MySensors.h>
                //#include <Wire.h>
                #include <Adafruit_BME280.h>
                
                // Enable debug prints
                //#define MY_DEBUG
                
                
                volatile bool motion_change=false;
                
                Adafruit_BME280 bme; // use I2C interface
                Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
                Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
                Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
                
                void disableNfc() {  //only applied to nRF52
                
                #ifndef IS_NRF51
                  //Make pins 9 and 10 usable as GPIO pins.
                  NRF_NFCT->TASKS_DISABLE=1;  //disable NFC
                  NRF_NVMC->CONFIG=1;  // Write enable the UICR
                  NRF_UICR->NFCPINS=0; //Make pins 9 and 10 usable as GPIO pins.
                  NRF_NVMC->CONFIG=0;  // Put the UICR back into read-only mode.
                #endif
                }
                
                
                void turnOffRadio() {
                  NRF_RADIO->TASKS_DISABLE=1;
                  while (!(NRF_RADIO->EVENTS_DISABLED)) {}  //until radio is confirmed disabled
                }
                
                void turnOffUarte0() {
                #ifndef IS_NRF51  
                  NRF_UARTE0->TASKS_STOPRX = 1;
                  NRF_UARTE0->TASKS_STOPTX = 1;
                  NRF_UARTE0->TASKS_SUSPEND = 1;
                  NRF_UARTE0->ENABLE=0;  //disable UART0
                  while (NRF_UARTE0->ENABLE!=0) {};  //wait until UART0 is confirmed disabled.
                #endif
                
                #ifdef IS_NRF51
                  NRF_UART0->TASKS_STOPRX = 1;
                  NRF_UART0->TASKS_STOPTX = 1;
                  NRF_UART0->TASKS_SUSPEND = 1;
                  NRF_UART0->ENABLE=0;  //disable UART0
                  while (NRF_UART0->ENABLE!=0) {};  //wait until UART0 is confirmed disabled.
                #endif
                }
                
                void turnOffAdc() {
                #ifndef IS_NRF51
                  if (NRF_SAADC->ENABLE) { //if enabled, then disable the SAADC
                    NRF_SAADC->TASKS_STOP=1;
                    while (NRF_SAADC->EVENTS_STOPPED) {} //wait until stopping of SAADC is confirmed
                    NRF_SAADC->ENABLE=0;  //disable the SAADC
                    while (NRF_SAADC->ENABLE) {} //wait until the disable is confirmed
                  }
                #endif
                }
                
                
                void turnOffHighFrequencyClock() {
                    NRF_CLOCK->TASKS_HFCLKSTOP = 1;
                    while ((NRF_CLOCK->HFCLKSTAT) & 0x0100) {}  //wait as long as HF clock is still running.
                }
                
                
                void mySleepPrepare() {  //turn-off energy drains prior to sleep
                  turnOffHighFrequencyClock();
                  turnOffRadio();
                  turnOffUarte0();
                }
                 
                
                void activateLpComp() {
                  NRF_LPCOMP->PSEL=3; // monitor AIN0 (i.e. pin P0.02 on nRF52832 PIR Motion Sensor v607).
                  while (!(NRF_LPCOMP->PSEL==3)) {} //wait until confirmed
                  NRF_LPCOMP->REFSEL=3;  // choose 1/2 VDD as the reference voltage
                  while (!(NRF_LPCOMP->REFSEL==3)) {} //wait until confirmed
                  NRF_LPCOMP->ANADETECT=0;  //detect CROSS events on PIR detection pin
                  while (NRF_LPCOMP->ANADETECT!=0) {} //wait until confirmed
                  NRF_LPCOMP->INTENSET=B1000;  //Enable interrupt for CROSS event
                  while (!(((NRF_LPCOMP->INTENSET)&B1000)==B1000)) {} //wait until confirmed
                  NRF_LPCOMP->ENABLE=1;  //Enable LPCOMP
                  while (!(NRF_LPCOMP->ENABLE==1)) {} //wait until confirmed
                  NRF_LPCOMP->TASKS_START=1;  //start the LPCOMP
                  while (!(NRF_LPCOMP->EVENTS_READY)) {}  //wait until ready
                  
                  NVIC_SetPriority(LPCOMP_IRQn, 15);
                  NVIC_ClearPendingIRQ(LPCOMP_IRQn);
                  NVIC_EnableIRQ(LPCOMP_IRQn);
                }
                
                void suspendLpComp() { //suspend getting more interrupts from LPCOMP before the first interrupt can be handled
                  if ((NRF_LPCOMP->ENABLE) && (NRF_LPCOMP->EVENTS_READY)) {  //if LPCOMP is enabled
                    NRF_LPCOMP->INTENCLR=B0100;  //disable interrupt from LPCOMP
                    while (((NRF_LPCOMP->INTENCLR)&B0100)==B0100) {} //wait until confirmed
                  }
                }
                
                void resumeLpComp() { //suspend getting interrupts from LPCOMP
                  NRF_LPCOMP->INTENSET=B0100;  //Enable interrupt for UP event
                  while (((NRF_LPCOMP->INTENSET)&B1000)!=B0100) {} //wait until confirmed
                }
                
                
                #define CHILD_ID 1   // Id of the motion sensor child
                #define ID_S_MULTIMETER        28
                #define CHILD_ID_TEMP 2
                #define CHILD_ID_HUMID 3
                #define CHILD_ID_BARO 4
                // Initialize motion message
                
                MyMessage msg(CHILD_ID, V_TRIPPED);
                MyMessage msg_S_MULTIMETER_V_VOLTAGE(ID_S_MULTIMETER,V_VOLTAGE);
                MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                MyMessage msgHumid(CHILD_ID_HUMID, V_HUM);
                MyMessage msgPressure(CHILD_ID_BARO, V_PRESSURE);
                
                float batteryVoltage=0;  
                float temperature=0;
                int humidity=0;
                float pressure=0;
                
                
                
                void presentation()
                {
                  // Send the sketch version information to the gateway and Controller
                  sendSketchInfo("PIR BME Sensor", "1.0");
                
                  // Register all sensors to gw (they will be created as child devices)
                  present(CHILD_ID, S_MOTION);
                
                  wait(SHORT_WAIT);
                  
                  present(ID_S_MULTIMETER,S_MULTIMETER,"Electric Station");
                  wait(SHORT_WAIT);
                  present(CHILD_ID_TEMP, S_TEMP, "PIR TEST Temperature", true);
                  wait(SHORT_WAIT);
                  present(CHILD_ID_HUMID, S_HUM, "PIR TEST Humidity", true);
                  wait(SHORT_WAIT);
                  present(CHILD_ID_BARO, S_BARO, "PIR TEST Pressure", true);
                  wait(SHORT_WAIT);
                }
                
                
                void setup()
                {
                  hwInit();
                
                  hwPinMode(PIR_DETECTION_PIN,INPUT);
                   if (!bme.begin(0x76))
                  {
                    while (1) delay(100);
                
                  }
                  disableNfc();  //remove unnecessary energy drains
                  turnOffAdc();  //remove unnecessary energy drains
                  activateLpComp();
                  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
                
                  motion_change=false;
                }
                
                
                
                void mySleep(uint32_t ms) {
                   mySleepPrepare();  //Take steps to reduce drains on battery current prior to sleeping
                   sleep(ms);
                }
                
                
                bool motionDetected=false;
                void loop() {
                //    sensors_event_t temp_event, pressure_event, humidity_event;
                //    bme_temp->getEvent(&temp_event);
                //    bme_pressure->getEvent(&pressure_event);
                //    bme_humidity->getEvent(&humidity_event);
                //    temperature=bme.readTemperature();
                //    humidity=bme.readHumidity();
                //    pressure=bme.readPressure()/100.0F;
                  mySleep(300000);  //sleep for 5 minutes
                
                  if (motion_change) {
                    motionDetected=!motionDetected;
                    if (motionDetected) {
                //      digitalWrite(LED_BUILTIN,HIGH);  //turn-on LED to signify motion detected
                      send(msg.set("1"));  // motion detected
                    }
                    else {
                //      digitalWrite(LED_BUILTIN,LOW);  //turn-off LED to signify motion no longer detected
                      send(msg.set("0"));  // send all-clear to prepare for future detections
                    }    
                    
                    NRF_LPCOMP->EVENTS_CROSS=0;
                    motion_change=false;
                  }
                  else { //must be a scheduled wake-up.  Time to report voltage as a heartbeat.
                    
                
                    sensors_event_t temp_event, pressure_event, humidity_event;
                    bme_temp->getEvent(&temp_event);
                    bme_pressure->getEvent(&pressure_event);
                    bme_humidity->getEvent(&humidity_event);
                    temperature=bme.readTemperature();
                    humidity=bme.readHumidity();
                    pressure=bme.readPressure()/100.0F;
                    wait(100);
                    send(msgTemp.set(temperature,2));
                    wait(100);
                    send(msgHumid.set(humidity,2));
                    wait(100);
                    send(msgPressure.set(pressure,2));
                    wait(100);
                
                  batteryVoltage=((float)hwCPUVoltage())/1000.0;  //take voltage measurement after transmission to hopefully measure lowest voltage that occurs. 
                    send(msg_S_MULTIMETER_V_VOLTAGE.set(batteryVoltage,3));  //send battery voltage with 3 decimal places
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                    
                  }
                }
                
                
                // * Reset events and read back on nRF52
                //* http://infocenter.nordicsemi.com/pdf/nRF52_Series_Migration_v1.0.pdf
                 
                #if __CORTEX_M == 0x04
                #define NRF5_RESET_EVENT(event)                                                 \
                        event = 0;                                                                   \
                        (void)event
                #else
                #define NRF5_RESET_EVENT(event) event = 0
                #endif
                
                
                // This must be in one line
                extern "C" { void LPCOMP_IRQHandler(void) {motion_change=true; NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_CROSS); NRF_LPCOMP->EVENTS_CROSS=0; MY_HW_RTC->CC[0]=(MY_HW_RTC->COUNTER+2);}}
                

                MyBoardNRF5.cpp

                /*
                  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},
                #if defined(NRF52840)
                  { PORT0, 31, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A7, PWM0, NOT_ON_TIMER},
                  { PORT1, 32, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 33, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 34, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 35, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 36, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 37, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 38, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 39, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 40, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 41, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 42, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 43, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 44, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 45, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 46, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 47, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER},
                  { PORT1, 48, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}
                #else
                  { PORT0, 31, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A7, PWM0, NOT_ON_TIMER}
                #endif
                };
                
                // Don't remove this line
                #include <compat_pin_mapping.h>
                
                #endif
                

                MyBoardNRF5.h

                /*
                  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_
                
                #ifdef __cplusplus
                extern "C"
                {
                #endif // __cplusplus
                
                // Number of pins defined in PinDescription array
                #if defined(NRF52840)
                #define GPIO_COUNT 2
                #define PINS_COUNT           (48u)
                #define NUM_DIGITAL_PINS     (48u)
                #define NUM_ANALOG_INPUTS    (8u)
                #define NUM_ANALOG_OUTPUTS   (8u)
                #else
                #define GPIO_COUNT 2
                #define PINS_COUNT           (32u)
                #define NUM_DIGITAL_PINS     (32u)
                #define NUM_ANALOG_INPUTS    (8u)
                #define NUM_ANALOG_OUTPUTS   (8u)
                #endif
                
                /* 
                 *  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                (13)
                //#define PIN_LED2                (24)
                //#define PIN_LED3                (5)
                // #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_LED1)
                //#define GREEN_LED            	 (PIN_LED2)
                //#define BLUE_LED			         (PIN_LED3)
                // #define BLE_LED                 BLUE_LED
                //#define LED_BUILTIN          PIN_LED1
                
                /* 
                 *  Buttons
                 *  
                 *  This is optional
                 */
                //#define PIN_BUTTON            (2)
                // #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)
                
                //#define AXEL_INT             (29)
                //#define MAGNET_INT             (28)
                //#define GERKON_INT             (3)
                
                /* 
                 * 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       (9)
                #define PIN_SERIAL_TX       (10)
                // #define PIN_SERIAL_CTS      (13)
                // #define PIN_SERIAL_RTS      (14)
                
                /*
                 * 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         (15)
                #define PIN_SPI_MOSI         (17)
                #define PIN_SPI_SCK          (20)
                #define PIN_SPI_SS           (22)
                
                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         (15u)
                #define PIN_WIRE_SCL         (16u)
                
                //#define PIN_WIRE_SDA1        (30u)
                //#define PIN_WIRE_SCL1        (31u)
                
                static const uint8_t SDA = PIN_WIRE_SDA;
                static const uint8_t SCL = PIN_WIRE_SCL;
                
                #ifdef __cplusplus
                }
                #endif
                
                #endif```
                1 Reply Last reply
                0
                • JokgiJ Offline
                  JokgiJ Offline
                  Jokgi
                  wrote on last edited by
                  #10

                  The nRF51822 has been used successfully in many coin cell applications including beacons, wearable, etc. There were three versions of this device. Only REV 3 silicon is being shipped by Nordic. Any older parts should be avoided. If you are wondering what rev you have there is a chart in the compatibility section on the Nordic Semiconductor website. I would add that If supported by the sensors and such I would suggest looking as some of the newer parts in the nRF52 family. Some have a low membory variant that may work for you too. Using the DC/DC converter you can achieve about 6mA of receive and transmit current and sleep currents in the uA range and nA in power down.

                  Puneit ThukralP 1 Reply Last reply
                  1
                  • JokgiJ Jokgi

                    The nRF51822 has been used successfully in many coin cell applications including beacons, wearable, etc. There were three versions of this device. Only REV 3 silicon is being shipped by Nordic. Any older parts should be avoided. If you are wondering what rev you have there is a chart in the compatibility section on the Nordic Semiconductor website. I would add that If supported by the sensors and such I would suggest looking as some of the newer parts in the nRF52 family. Some have a low membory variant that may work for you too. Using the DC/DC converter you can achieve about 6mA of receive and transmit current and sleep currents in the uA range and nA in power down.

                    Puneit ThukralP Offline
                    Puneit ThukralP Offline
                    Puneit Thukral
                    wrote on last edited by
                    #11

                    @Jokgi for sure , next purchase for me would be the nrf52 series. As with @ghiglie , I too had bought the nrf51822 many years back and they were sitting in the drawer. This lockdown allowed me to discover them and hence I decided to use them.

                    1 Reply Last reply
                    0
                    • G Offline
                      G Offline
                      ghiglie
                      wrote on last edited by
                      #12

                      Yes, I'm with @Puneit-Thukral . As soon I get more comfortable I'll buy some new parts: for now, I'm too much n00b ! I still reverse polarities, short circuit solder pads... :laughing:

                      atmega328p serial killer
                      HomeAssistant / gateway: ESP8266 & NRF24L01+ gateway

                      1 Reply Last reply
                      0
                      • G Offline
                        G Offline
                        ghiglie
                        wrote on last edited by ghiglie
                        #13

                        Resuming my old thread. After killing some 328p (but I still spare one!), I got a fully working "multisensor" . Now it's nRF51 turn:

                        I'm using a Black Magic Probe, made from a Blue Pill - it has May2020 code, "git pull" shows quite a lots of updates, but I'll keep like that. { Just a note: compile it with "make && make PROBE_HOST=swlink" so you'll be able to use the header! } . I have STLinkV2 clone for backup.

                        My "setup": imgur.com/a/acT6iOZ

                        @monte said in Just found a pair of "old" NRF51822-04 ... any good?:

                        Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.

                        Sorry @monte, I'm totally n00b . Any link about this?

                        atmega328p serial killer
                        HomeAssistant / gateway: ESP8266 & NRF24L01+ gateway

                        monteM 1 Reply Last reply
                        0
                        • G ghiglie

                          Resuming my old thread. After killing some 328p (but I still spare one!), I got a fully working "multisensor" . Now it's nRF51 turn:

                          I'm using a Black Magic Probe, made from a Blue Pill - it has May2020 code, "git pull" shows quite a lots of updates, but I'll keep like that. { Just a note: compile it with "make && make PROBE_HOST=swlink" so you'll be able to use the header! } . I have STLinkV2 clone for backup.

                          My "setup": imgur.com/a/acT6iOZ

                          @monte said in Just found a pair of "old" NRF51822-04 ... any good?:

                          Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.

                          Sorry @monte, I'm totally n00b . Any link about this?

                          monteM Offline
                          monteM Offline
                          monte
                          wrote on last edited by
                          #14

                          @ghiglie you can try this from my old post: https://forum.mysensors.org/post/92044
                          I will need to write a firmware for 51822 in few weeks, so maybe I'll have something more polished. The most usefull information you can find on Nordic's forum, you can use snippets of code with arduino and it should work, because NRF5 port contains Nordic's SDK, and thus all functions and macroses, that are mentioned on that forum.

                          G 1 Reply Last reply
                          0
                          • monteM monte

                            @ghiglie you can try this from my old post: https://forum.mysensors.org/post/92044
                            I will need to write a firmware for 51822 in few weeks, so maybe I'll have something more polished. The most usefull information you can find on Nordic's forum, you can use snippets of code with arduino and it should work, because NRF5 port contains Nordic's SDK, and thus all functions and macroses, that are mentioned on that forum.

                            G Offline
                            G Offline
                            ghiglie
                            wrote on last edited by
                            #15

                            @monte said in Just found a pair of "old" NRF51822-04 ... any good?:

                            @ghiglie you can try this from my old post: https://forum.mysensors.org/post/92044
                            I will need to write a firmware for 51822 in few weeks, so maybe I'll have something more polished. The most usefull information you can find on Nordic's forum, you can use snippets of code with arduino and it should work, because NRF5 port contains Nordic's SDK, and thus all functions and macroses, that are mentioned on that forum.

                            Thanks @monte! Very intesting. This nRF5 journey is getting quite difficult, programming for Nordic's chips is way harder than what I'm used to. Maybe I'll wait for your sketch! :laughing:

                            atmega328p serial killer
                            HomeAssistant / gateway: ESP8266 & NRF24L01+ gateway

                            monteM 1 Reply Last reply
                            0
                            • G ghiglie

                              @monte said in Just found a pair of "old" NRF51822-04 ... any good?:

                              @ghiglie you can try this from my old post: https://forum.mysensors.org/post/92044
                              I will need to write a firmware for 51822 in few weeks, so maybe I'll have something more polished. The most usefull information you can find on Nordic's forum, you can use snippets of code with arduino and it should work, because NRF5 port contains Nordic's SDK, and thus all functions and macroses, that are mentioned on that forum.

                              Thanks @monte! Very intesting. This nRF5 journey is getting quite difficult, programming for Nordic's chips is way harder than what I'm used to. Maybe I'll wait for your sketch! :laughing:

                              monteM Offline
                              monteM Offline
                              monte
                              wrote on last edited by
                              #16

                              @ghiglie look at this from the point that the more difficult the task the more you will learn by accomplishing it ;)

                              G 1 Reply Last reply
                              2
                              • monteM monte

                                @ghiglie look at this from the point that the more difficult the task the more you will learn by accomplishing it ;)

                                G Offline
                                G Offline
                                ghiglie
                                wrote on last edited by
                                #17

                                @monte said in Just found a pair of "old" NRF51822-04 ... any good?:

                                Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.

                                Sorry @monte, I'm totally n00b . Any link about this?

                                @monte said in Just found a pair of "old" NRF51822-04 ... any good?:

                                Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.

                                Oh, I know! But I lack time to tinker that much. :/ I've just started on learning on Black Magic Probe and STLink differences and use cases... Maybe I just started the hard way, with a DK it would be, at least, less "pioneeristic".

                                atmega328p serial killer
                                HomeAssistant / gateway: ESP8266 & NRF24L01+ gateway

                                1 Reply Last reply
                                0
                                Reply
                                • Reply as topic
                                Log in to reply
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes


                                21

                                Online

                                11.7k

                                Users

                                11.2k

                                Topics

                                113.1k

                                Posts


                                Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                • Login

                                • Don't have an account? Register

                                • Login or register to search.
                                • First post
                                  Last post
                                0
                                • MySensors
                                • OpenHardware.io
                                • Categories
                                • Recent
                                • Tags
                                • Popular