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 4.0k 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 :)

    J 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 :)

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

      @Hausner Have you considered sensor failure?

      H 1 Reply Last reply
      0
      • B Offline
        B 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
        • J 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

            Hello! It looks like you're interested in this conversation, but you don't have an account yet.

            Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

            With your input, this post could be even better 💗

            Register Login
            Reply
            • Reply as topic
            Log in to reply
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes


            15

            Online

            12.0k

            Users

            11.2k

            Topics

            113.4k

            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