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
D

Didou

@Didou
About
Posts
23
Topics
2
Shares
0
Groups
0
Followers
0
Following
0

Posts

Recent Best Controversial

  • NRF5 Hardware module crash after while
    D Didou

    Re: nRF5 action!

    I have build up a few NRF modules, including main supply power, Relais, Heating control by pilot wire, all to fit within a 2 DIN unit module within power panel.

    They all suffer the same issue, after some time could be few hours or even more than a day they do crash on trying sending something

    I have spent nearly a month reading left and right about this in mysensor but did not find ant thread on such issue. I have also tryed either the lastes stable or the dev release without any change. This is propably something evident I dont figure out and thick you help !:grinning:

    I did attach part of the code and part of the debug output when failing

    /*
     * This example sketch shows how you can manage the nRF5 pin mapping as part of your code.
     * You can use the method for any nRF51822 or nRF52832 board or module.
     * 
     * Most components, like UART, SPI, Wire Bus, of the nRF5 series chips don't
     * have a fixed pin mapping. There are some pins with restrictions like analog
     * inputs, NFC or pins near the radio module. Please refer the latest
     * documentation about pin restrictions at http://infocenter.nordicsemi.com 
     * 
     * To use the custom pin mapping you have to do following steps:
     * 
     * 1. Install "arduino-nrf5" like described at
     *    https://github.com/sandeepmistry/arduino-nRF5/
     * 2. Install the "My Sensors nRF5 Boards" with the board manager like
     *    explained at https://github.com/mysensors/ArduinoBoards
     * 3. Copy the files "MyBoardNRF5.cpp" and "MyBoardNRF5.h" from
     *    "MyBoardNRF5" example into your sketch.
     * 4. Modify pin mappings in "MyBoardNRF5.cpp" and "MyBoardNRF5.h" to fit
     *    your requirements.
     * 5. Select "MyBoardNRF5 nrf52832" or "MyBoardNRF5 nrf52822" as your board.
     *    Choose the correct parameters and programmer in the Tools menu.
     */
    
    /* Module DIN 6xPilotes
     *  LED verte Power
     *  LED Rouge état Pilote (6x)
     *    P0.20 -> LED D4 Pilote 1
     *    P0.25 -> LED D8 Pilote 2
     *    P0.19 -> LED D3 Pilote 3
     *    P0.23 -> LED D6 Pilote 4
     *    P0.18 -> LED D2 Pilote 5
     *    P0.24 -> LED D7 Pilote 6
     *  LED Bleu Communication Radio
     *    P0.22 -> LED D5 Comunication
     */
    
    #define MY_DEBUG
    #define MY_SPECIAL_DEBUG
    #define MY_DEBUG_VERBOSE
    #define MY_DEBUG_VERBOSE_NRF5_ESB
    // #define MY_TRANSPORT_SANITY_CHECK
    
    
    #define MY_RADIO_NRF5_ESB
    #define MY_NODE_ID 121
    //#define MY_PASSIVE_NODE
    
    // Inverses the behavior of leds
    #define MY_WITH_LEDS_BLINKING_INVERSE
    
    // Flash leds on rx/tx/err
    // Uncomment to override default HW configurations
    //#define MY_DEFAULT_ERR_LED_PIN 22  // Error led pin
    #define MY_DEFAULT_RX_LED_PIN  22  // Receive led pin
    #define MY_DEFAULT_TX_LED_PIN  22  // Transmit led pin
    
    #define INTER_MESSAGES_WAIT 50
    
    #include <MySensors.h>
    #include <Wire.h>
    #include "Adafruit_MCP23017.h"
    
    #define LED_ON 0
    #define LED_OFF 1
    
    #define LED_PILOTE_1 20 
    #define LED_PILOTE_2 25 
    #define LED_PILOTE_3 19
    #define LED_PILOTE_4 23
    #define LED_PILOTE_5 18
    #define LED_PILOTE_6 24
    
    #define NB_LED_PILOTE 6
    
    const int LEDS_PILOTE[6] = {
      LED_PILOTE_1,
      LED_PILOTE_2,
      LED_PILOTE_3,
      LED_PILOTE_4,
      LED_PILOTE_5,
      LED_PILOTE_6
    };
    
    typedef struct {
       char mode_code;
       int code_A;
       int code_B;
    } modeFilPilote;
    
    const modeFilPilote modesFilPilote[4] = {
      {'O', 0, 1}, // Mode Off
      {'G', 1, 0}, // Mode hors gel
      {'E', 0, 0}, // Mode éco
      {'C', 1, 1}  // Mode confort
    };
    
    typedef struct {
       int childID;
       char *name;
       char lastOrder;
       int pin_A;
       int pin_B;
       bool newState;
    } FilPilote;
    
    FilPilote ListFilPilote[6] = {
      {0, "Pilote1", 'O', 0, 8, true},
      {1, "Pilote2", 'O', 1, 9, true},
      {2, "Pilote3", 'O', 2, 10, true},
      {3, "Pilote4", 'O', 3, 11, true},
      {4, "Pilote5", 'O', 4, 12, true},
      {5, "Pilote6", 'O', 5, 13, true}
    };
    
    #define NB_PILOTE 6
    
    int LedTimer = 0;
    int BatteryTimer = 0;
    
    MyMessage msg_S_HEATER(14,V_STATUS); 
    
    Adafruit_MCP23017 mcp;
    
    //-------------------------------------
    void nRF_Init() {
      NRF_POWER->DCDCEN = 0; // Not reducing the radio current   
      NRF_PWM0  ->ENABLE = 0;
      NRF_PWM1  ->ENABLE = 0;
      NRF_PWM2  ->ENABLE = 0;
      NRF_TWIM1 ->ENABLE = 0;
      NRF_TWIS1 ->ENABLE = 0;
      //NRF_RADIO->TXPOWER = 8;
    }
    
    void disableNfc() {
      NRF_NFCT->TASKS_DISABLE = 1;
      NRF_NVMC->CONFIG = 1;
      NRF_UICR->NFCPINS = 0;
      NRF_NVMC->CONFIG = 0;
    }
    
    void turnOffAdc() {
      if (NRF_SAADC->ENABLE) {
        NRF_SAADC->TASKS_STOP = 1;
        while (NRF_SAADC->EVENTS_STOPPED) {}
        NRF_SAADC->ENABLE = 0;
        while (NRF_SAADC->ENABLE) {}
      }
    }
    
    //void sleepI2C() {
    //  NRF_TWI1->ENABLE=TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;  // I2C Begin is then required on resume (sensor.begin();)
    //  *(volatile uint32_t *)0x40004FFC = 0;
    //  *(volatile uint32_t *)0x40004FFC;
    //  *(volatile uint32_t *)0x40004FFC = 1;
    //}
    //---------------------------------------
    
    void preHwInit() 
    { 
      // Configure Leds ports 
      pinMode(22, OUTPUT);  
      
      for (int i = 0; i < NB_LED_PILOTE; i++) {
        pinMode(LEDS_PILOTE[i], OUTPUT); 
        digitalWrite(LEDS_PILOTE[i], LED_OFF); 
      }  
    
      // Test Leds
      for(int i=0; i < NB_LED_PILOTE +1; i++)
      {
        if (i-1>=0)digitalWrite(LEDS_PILOTE[i-1], LED_OFF);
        if (i < NB_LED_PILOTE)digitalWrite(LEDS_PILOTE[i], LED_ON);
        wait(250);
      }  
    }
    
    void before()
    {    
      nRF_Init();
      disableNfc();
      turnOffAdc();       
      wait(200);
    }
    
    void setup() 
    {  
      mcp.begin();      // use default address 0  
    
      // Load Pilot saved states
      for (int i = 0; i < NB_PILOTE; i++) {
        ListFilPilote[i].lastOrder = loadState(ListFilPilote[i].childID);    
      }     
    
      // Set MCP ports
      for (int i = 0; i <= 15; i++) {
        mcp.pinMode(i, OUTPUT);
        mcp.digitalWrite(0, HIGH);
      }
    }
    
    void presentation()
    {
      sendSketchInfo("DIN 6xPILOTES Gite 1", "0.8");
      wait(INTER_MESSAGES_WAIT);  
    
      // Present Pilote
      for (int i = 0; i < NB_PILOTE; i++) 
      {
        present(ListFilPilote[i].childID, S_HEATER, ListFilPilote[i].name);  
        wait(INTER_MESSAGES_WAIT); 
      }  
    }
    
    void loop() 
    {
      /*
       * Off: Half upper                 Led: Off
       * Confort: Nothing                Led: On 
       * Eco: Half upper & lower (Full)  Led: Blinking 50/50
       * Frizing Protect: Half lower     Led: Blinking 10/90
       */
       
      for(int i=0; i < NB_LED_PILOTE; i++)
      {
        switch (ListFilPilote[i].lastOrder)
        {      
          case 'G': // horsgel
           if (LedTimer <9) digitalWrite(LEDS_PILOTE[i], LED_OFF); 
           else digitalWrite(LEDS_PILOTE[i], LED_ON);        
           break;
          case 'E': // Eco
           if (LedTimer < 5) digitalWrite(LEDS_PILOTE[i], LED_ON); 
           else digitalWrite(LEDS_PILOTE[i], LED_OFF); 
           break;
          case 'O': // off
           digitalWrite(LEDS_PILOTE[i], LED_OFF); 
           break;
          case 'C': // Confort
           digitalWrite(LEDS_PILOTE[i], LED_ON); 
           break;
        }       
      }
      LedTimer++;
      if (LedTimer > 9) LedTimer = 0;
      BatteryTimer++;
      if (BatteryTimer > 599)
      {
        BatteryTimer = 0;
        #ifdef MY_DEBUG
          Serial.println("Send Battery Level");      
        #endif
        sendBatteryLevel(100);
        //  sendHeartbeat();
      }
      
      wait(100);
    }
    
    void receive(const MyMessage &message)
    {   
     if (message.type == V_HVAC_FLOW_STATE)
      {
        for(int p=0; p < NB_PILOTE; p++) 
        {
          if (message.sensor == ListFilPilote[p].childID)
          {
            #ifdef MY_DEBUG
              Serial.print("--Incoming change for: ");
              Serial.print(ListFilPilote[p].name);
              Serial.print("  --Command: ");
              Serial.print(message.getString()[0]);
              Serial.println();
            #endif
    
            for(int e=0; e < 4; e++)
            {
              if(message.getString()[0] == modesFilPilote[e].mode_code)
              {
                // Set new state
                mcp.digitalWrite(ListFilPilote[p].pin_A, modesFilPilote[e].code_A); 
                mcp.digitalWrite(ListFilPilote[p].pin_B, modesFilPilote[e].code_B);        
                
                // Save state
                ListFilPilote[p].lastOrder = modesFilPilote[e].mode_code;
                saveState(ListFilPilote[p].childID, modesFilPilote[e].mode_code); 
    
                // Send status update
                send(msg_S_HEATER.setSensor(ListFilPilote[p].childID).set((const char *)(modesFilPilote[e].mode_code)));
                return;
              }
            }
            // Unknown Order
            #ifdef MY_DEBUG
              Serial.print("--Unknown Order: ");
              Serial.println(message.getString()[0]);
            #endif
          }
          // Wrong Child_ID
          #ifdef MY_DEBUG
              Serial.print("--Wrong ChildID: ");
              Serial.println(message.sensor);
            #endif
        }
      }
    }
    

    and the logs

    05:08:52.392 -> 72652589 NRF5:SND:TO=0,LEN=8,PID=0,NOACK=0
    05:08:52.392 -> 72652596 NRF5:SND:END=1,ACK=1,RTRY=2,RSSI=-45,WAKE=8
    05:08:52.392 -> 72652601 TSF:MSG:SEND,121-121-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:100
    05:09:52.387 -> Send Battery Level
    05:09:52.387 -> 72712609 NRF5:SND:TO=0,LEN=8,PID=1,NOACK=0
    05:09:52.387 -> 72712616 NRF5:SND:END=1,ACK=1,RTRY=2,RSSI=-45,WAKE=8
    05:09:52.387 -> 72712621 TSF:MSG:SEND,121-121-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:100
    05:10:52.433 -> Send Battery Level
    05:10:52.433 -> 72772629 NRF5:SND:TO=0,LEN=8,PID=2,NOACK=0
    05:10:52.433 -> 72772636 NRF5:SND:END=1,ACK=1,RTRY=2,RSSI=-45,WAKE=8
    05:10:52.433 -> 72772641 TSF:MSG:SEND,121-121-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:100
    05:11:52.429 -> Send Battery Level
    05:11:52.429 -> 72832649 NRF5:SND:TO=0,LEN=8,PID=3,NOACK=0
    05:11:52.429 -> 72832656 NRF5:SND:END=1,ACK=1,RTRY=2,RSSI=-45,WAKE=8
    05:11:52.429 -> 72832661 TSF:MSG:SEND,121-121-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:100
    05:12:52.459 -> Send Battery Level
    05:12:52.459 -> 72892669 NRF5:SND:TO=0,LEN=8,PID=0,NOACK=0
    05:12:52.459 -> 72892676 NRF5:SND:END=1,ACK=1,RTRY=2,RSSI=-45,WAKE=8
    05:12:52.459 -> 72892681 TSF:MSG:SEND,121-121-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:100
    05:13:52.481 -> Send Battery Level
    05:13:52.481 -> 72952689 NRF5:SND:TO=0,LEN=8,PID=1,NOACK=0
    05:13:52.481 -> 72952696 NRF5:SND:END=1,ACK=1,RTRY=2,RSSI=-45,WAKE=8
    05:13:52.481 -> 72952701 TSF:MSG:SEND,121-121-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:100
    05:14:52.511 -> Send Battery Level
    05:14:52.511 -> 73012709 NRF5:SND:TO=0,LEN=8,PID=2,NOACK=0
    05:14:52.511 -> 73012716 NRF5:SND:END=1,ACK=1,RTRY=2,RSSI=-45,WAKE=8
    05:14:52.511 -> 73012721 TSF:MSG:SEND,121-121-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:100
    05:15:52.484 -> Send Battery Level
    05:15:52.484 -> 73072729 NRF5:SND:TO=0,LEN=8,PID=3,NOACK=0
    
    My Project

  • NRF5 Hardware module crash after while
    D Didou

    @Didou After a few days of test of your NRF fix, I can say there is a huge improuvement either for USB, AC supply or battery powered nodes, they just do not failed ! this is great. thanks for your efforts improving the mysensor code

    It's a while since the mysensor master has been updated, any ideas when it's goanna happend, it will also be good for others to benefits

    My Project

  • NRF5 Hardware module crash after while
    D Didou

    @ncollins I'm using NRF52832 Ebyte modules

    My Project
  • Login

  • Don't have an account? Register

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