Interrupts doesn't work on NRF5



  • Hello,
    Sorry for my bad english, I'm from Germany and my school english is about 20 years ago.
    I'm trying to get this board working with Interrupts. https://www.openhardware.io/view/510/Multi-Sensor-TempHumidityPIR-LeakMagnetLightAccel

    I try the sketch from NeverDie https://www.openhardware.io/view/499/10-years-wireless-PIR-Sensor-on-just-one-set-of-3-AAs#tabs-source and modify the pin configuration, but it doen't work. Then I take an example from ReadBearLabs and transfer MySensor routines into it. But this also doesn't work. Only when I use "My_Core_only" then the Interrupts are working pretty well, but when I disable "My_Core_only" the Interrupt doesn't work.

    // 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
    
    
    
    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2017 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - tekka
     *
     * DESCRIPTION
     * Passive node example: This is a passive & independent reporting node
     *
     */
    
    // This demo sketch also draws from the MySensor's example MotionSensor sketch.
    
    #define IS_NRF51  //true iff the target is an nRF51.  If an nRF52, then comment this line out!
    
    #define SHORT_WAIT 50
    
    // Enable debug prints
    //#define MY_DEBUG
    
    #define PIN_LED1                (4) // 4 is sensor LED , 1 is onboard LED
    #define LED_BUILTIN          PIN_LED1
    
    #define PIN_SENSOR1                (10) // 2 is waterleak, 10 is PIR , 3 is Pin5/INT
    #define SENSOR1         PIN_SENSOR1
    
    
    #include <MySensors.h>
    
    //#define CHILD_ID_TEMP 1  //definitions contributed by smilvert (see above credit)
    #define CHILD_ID 2   // Id of the motion sensor child
    #define ID_S_MULTIMETER        28
    
    // Initialize general message
    //MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msg(CHILD_ID, V_TRIPPED);
    MyMessage msg_S_MULTIMETER_V_VOLTAGE(ID_S_MULTIMETER,V_VOLTAGE);
    
    float batteryVoltage=0;  
    
    /*#include "nrf_temp.h"
    
    float read_temp_value(){
    
      float temp=0;
    
      // Starten Sie die Temperaturmessung. 
      NRF_TEMP->TASKS_START = 1; 
    
      // Warten Sie, bis die Temperaturmessung abgeschlossen ist.
      while (NRF_TEMP->EVENTS_DATARDY == 0){
        // Do nothing.}
      }
      NRF_TEMP->EVENTS_DATARDY = 0;
    
      // Lesen Sie den Temperaturwert vom Sensor ab
      // Die Genauigkeit beträgt 0,25 Grad Celsius <=> 1 Einheit = 0,25 Grad Celsius
      // Teile durch 4, um einen C-Wert zu erhalten
      
      temp = ((float)nrf_temp_read() / 4.);
    
      // Hoàn thành quá trình đo. 
      NRF_TEMP->TASKS_STOP = 1; 
    
      return temp;
    }*/
    
    void blinkityBlink(uint8_t repetitions) {
      for (int x=0;x<repetitions;x++) {
        digitalWrite(LED_BUILTIN ,HIGH);
        delay(20);
        digitalWrite(LED_BUILTIN ,LOW);
        delay(100);
        digitalWrite(LED_BUILTIN ,HIGH);
        delay(20);
        digitalWrite(LED_BUILTIN ,LOW);    
        if (x<(repetitions-1)) {  //skip waiting at the end of the final repetition
          delay(500);
        }
      }
    }
    
    void handle_irq3(void) {
      if(HIGH == digitalRead(SENSOR1)){
          digitalWrite(LED_BUILTIN , HIGH);
          send(msg.set("1"));  // motion detected
      }
      else
      {
          digitalWrite(LED_BUILTIN , LOW);
           send(msg.set("0"));  // send all-clear to prepare for future detections
      }
    }
    
    void presentation()
    {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("NRF Motion Sensor", "1.0");
       // wait(SHORT_WAIT);
       // present(CHILD_ID_TEMP, S_TEMP,"Onboard Temperature");
      wait(SHORT_WAIT);
      // Register all sensors to gw (they will be created as child devices)
      present(CHILD_ID, S_MOTION,"Motion Sensor");
    
      wait(SHORT_WAIT);
      
      present(ID_S_MULTIMETER,S_MULTIMETER,"Electric Station");
      wait(SHORT_WAIT);
    }
    
    
    void setup() {
        // put your setup code here, to run once:
        //hwInit();
      //hwPinMode(LED_BUILTIN,OUTPUT_D0H1);
      //hwPinMode(SENSOR1,INPUT);
    
       //nrf_temp_init();
      pinMode(LED_BUILTIN , OUTPUT);
        digitalWrite(LED_BUILTIN , LOW);
      blinkityBlink(5);  //signify power-up and start of operations
    
      // set interrupts, pin default is HIGH
      attachInterrupt(SENSOR1, handle_irq3, CHANGE);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      //send(msgTemp.set(read_temp_value(),2));
      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
      sleep(900000); //sleep 15 min
    }```


  • Nobody can help?


  • Hardware Contributor

    @tiwo85 said in Interrupts doesn't work on NRF5:

    Nobody can help?

    Hello, it seems everyone missed it last time you post it... Maybe the best would be to tag @NeverDie he should have a script working somewhere.

    Have you tried to use interrupts the "normal" way with mysensors sleep function in the new 2.3 version ?
    There's also an hardware problem with nrf51 (not on NRF52) that makes it use a lot of power (around 1mA) in sleep with the "normal" interrupt, so it needs some tricks to either use low power comparator (LPCOMP, search for it you should find a script using it from @NeverDie) or interrupt with PORT mode but that's more complex to implement. I made a script using it in the big NRF5 thread but with only one interrupt to use go for the LPCOMP version.


 

391
Online

7.6k
Users

8.5k
Topics

91.3k
Posts