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. Troubleshooting
  3. Motion/actuator sensor

Motion/actuator sensor

Scheduled Pinned Locked Moved Troubleshooting
5 Posts 3 Posters 1.9k Views 1 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.
  • H Offline
    H Offline
    Hausner
    wrote on last edited by
    #1

    Hi

    I need some help now. I have been staring at the below code for quiet some time now, but I just can find the error.

    The code should be sending a tripped signal to the controller, and the controller should return an ON/OFF to 1 of the 2 actuators. I can control the actuators just fine ON/OFF from the controller, but the motion sensor then start to flip HIGH/LOW at the interval assigned from the sensitivity potmeter.

    Here is the code

      #include <MySensor.h>
      #include <SPI.h>
    
     #define RELAY_1 6  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
     #define NUMBER_OF_RELAYS 2 // Total number of attached relays
     #define RELAY_ON 1  // GPIO value to write to turn on attached relay
     #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
    
      // Motion sensor defs
      unsigned long SLEEP_TIME = 10000; // Sleep time between reports (in milliseconds)
     #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
     #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
    #define CHILD_ID 3   // Id of the sensor child
    volatile int state = LOW;
    boolean lockLow = true;
    boolean lastTripped = 0;
    
    MySensor gw;
    MyMessage msgMotion(CHILD_ID, V_TRIPPED);
    //MyMessage msgRelay(CHILD_ID, V_LIGHT);
    MyMessage msg(CHILD_ID, V_LIGHT);
    
    void setup()  
    {   
    // Initialize library and add callback for incoming messages
      gw.begin(incomingMessage, AUTO, true);
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Relay/Motion Sensor", "1.0");
    
      // Fetch relay status
      for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
    // Register all sensors to gw (they will be created as child devices)
    gw.present(sensor, S_LIGHT);
    // Then set relay pins in output mode
    pinMode(pin, OUTPUT);   
    // Set relay to last known state (using eeprom storage) 
    digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
     }
    
      pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
     // Register all sensors to gw (they will be created as child devices)
    gw.present(CHILD_ID, S_MOTION);
    // attachInterrupt(DIGITAL_INPUT_SENSOR, ON, CHANGE);
    delay(30000);
    }
    
    
    void loop() 
    {
    // Alway process incoming messages whenever possible
    gw.process();
    
    boolean tripped = (digitalRead(DIGITAL_INPUT_SENSOR) == HIGH);
    if (lastTripped != tripped ) {
    gw.send(msgMotion.set(tripped?"1":"0")); // Send new state
    lastTripped=tripped;
     }
    }
    
    
    void incomingMessage(const MyMessage &message) {
    // We only expect one type of message from controller. But we better check anyway.
     if (message.type==V_LIGHT) {
     // Change relay state
     digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
     // Store state in eeprom
     gw.saveState(message.sensor, message.getBool());
     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
     }
    }
    

    With the above code I get this on the sensor serial:

    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
    send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1

    every ~4 second.. PLS help :)

    jendrushJ 1 Reply Last reply
    0
    • H Hausner

      Hi

      I need some help now. I have been staring at the below code for quiet some time now, but I just can find the error.

      The code should be sending a tripped signal to the controller, and the controller should return an ON/OFF to 1 of the 2 actuators. I can control the actuators just fine ON/OFF from the controller, but the motion sensor then start to flip HIGH/LOW at the interval assigned from the sensitivity potmeter.

      Here is the code

        #include <MySensor.h>
        #include <SPI.h>
      
       #define RELAY_1 6  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
       #define NUMBER_OF_RELAYS 2 // Total number of attached relays
       #define RELAY_ON 1  // GPIO value to write to turn on attached relay
       #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
      
        // Motion sensor defs
        unsigned long SLEEP_TIME = 10000; // Sleep time between reports (in milliseconds)
       #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
       #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
      #define CHILD_ID 3   // Id of the sensor child
      volatile int state = LOW;
      boolean lockLow = true;
      boolean lastTripped = 0;
      
      MySensor gw;
      MyMessage msgMotion(CHILD_ID, V_TRIPPED);
      //MyMessage msgRelay(CHILD_ID, V_LIGHT);
      MyMessage msg(CHILD_ID, V_LIGHT);
      
      void setup()  
      {   
      // Initialize library and add callback for incoming messages
        gw.begin(incomingMessage, AUTO, true);
        // Send the sketch version information to the gateway and Controller
        gw.sendSketchInfo("Relay/Motion Sensor", "1.0");
      
        // Fetch relay status
        for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
      // Register all sensors to gw (they will be created as child devices)
      gw.present(sensor, S_LIGHT);
      // Then set relay pins in output mode
      pinMode(pin, OUTPUT);   
      // Set relay to last known state (using eeprom storage) 
      digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
       }
      
        pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
       // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID, S_MOTION);
      // attachInterrupt(DIGITAL_INPUT_SENSOR, ON, CHANGE);
      delay(30000);
      }
      
      
      void loop() 
      {
      // Alway process incoming messages whenever possible
      gw.process();
      
      boolean tripped = (digitalRead(DIGITAL_INPUT_SENSOR) == HIGH);
      if (lastTripped != tripped ) {
      gw.send(msgMotion.set(tripped?"1":"0")); // Send new state
      lastTripped=tripped;
       }
      }
      
      
      void incomingMessage(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
       if (message.type==V_LIGHT) {
       // Change relay state
       digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
       // Store state in eeprom
       gw.saveState(message.sensor, message.getBool());
       // Write some debug info
       Serial.print("Incoming change for sensor:");
       Serial.print(message.sensor);
       Serial.print(", New status: ");
       Serial.println(message.getBool());
       }
      }
      

      With the above code I get this on the sensor serial:

      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
      send: 30-30-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:1

      every ~4 second.. PLS help :)

      jendrushJ Offline
      jendrushJ Offline
      jendrush
      wrote on last edited by
      #2

      @Hausner Have you considered sensor failure?

      H 1 Reply Last reply
      0
      • BulldogLowellB Offline
        BulldogLowellB Offline
        BulldogLowell
        Contest Winner
        wrote on last edited by
        #3

        @Hausner said:

        but the motion sensor then start to flip HIGH/LOW at the interval assigned from the sensitivity potmeter.

        so you want to trigger on only one side of the motion sensor's output?

        1 Reply Last reply
        0
        • jendrushJ jendrush

          @Hausner Have you considered sensor failure?

          H Offline
          H Offline
          Hausner
          wrote on last edited by
          #4

          @jendrush said:

          @Hausner Have you considered sensor failure?

          Yes, but I've tried to load the default actuator and motion sensor sketches from the library, and both works fine, so I don't think I have faulty sensors.

          1 Reply Last reply
          0
          • H Offline
            H Offline
            Hausner
            wrote on last edited by
            #5

            Turned out that the Nano was faulty.

            I rebuilded the setup with a new Nano, and it's now working as designed :)

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


            30

            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