Servo-Motion Multisensor - Release 2.0



  • Hello everybody,
    I try to bring a multi sensor with 2.0 release to run. Containing a servo and a motion sensor.
    The sketch is compiled without errors
    But unfortunately only the motion sensor works.
    The servo motor does not react. I have tried a lot but without success
    Could someone help me please?
    Many thanks for any help

    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    #include <SPI.h>
    #include <MySensors.h>
    #include <Servo.h> 
    
    #define SERVO_DIGITAL_OUT_PIN 3
    #define SERVO_MIN 0 // Fine tune your servos min. 0-180
    #define SERVO_MAX 180  // Fine tune your servos max. 0-180
    #define DETACH_DELAY 900 // Tune this to let your movement finish before detaching the servo
    #define CHILD_SERVO 1   // Id of the sensor child
    #define CHILD_MOTION 2
    
    unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds)
    #define DIGITAL_INPUT_SENSOR 2   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
    
    MyMessage msgMOTION(CHILD_MOTION, V_TRIPPED);
    MyMessage msgSERVO(CHILD_SERVO, V_DIMMER);
    
    Servo myservo;  // create servo object to control a servo 
                    // a maximum of eight servo objects can be created Sensor gw(9,10);
    unsigned long timeOfLastChange = 0;
    bool attachedServo = false;
    
    void setup() 
    { 
      // Request last servo state at startup
      request(CHILD_SERVO, V_DIMMER);
      
      pinMode(DIGITAL_INPUT_SENSOR, INPUT);
    } 
    
    void presentation()  {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Servo_Motion", "1.0");
    
      // Register all sensors to gw (they will be created as child devices)
      present(CHILD_SERVO, S_COVER);
      present(CHILD_MOTION, S_MOTION);
    }
    
    void loop() 
    { 
      
        if (attachedServo && millis() - timeOfLastChange > DETACH_DELAY) {
         myservo.detach();
         attachedServo = false;
       
      }
    
        // Read digital motion value
         bool tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH;
    
         Serial.println(tripped);
         send(msgMOTION.set(tripped?"1":"0"));  // Send tripped value to gw 
    
          // Sleep until interrupt comes in on motion sensor. Send update every two minute.
         sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME);
     
    } 
    
    void receive(const MyMessage &message) {
      myservo.attach(SERVO_DIGITAL_OUT_PIN);   
      attachedServo = true;
      if (message.type==V_DIMMER) { // This could be M_ACK_VARIABLE or M_SET_VARIABLE
         int val = message.getInt();
         myservo.write(SERVO_MAX + (SERVO_MIN-SERVO_MAX)/100 * val); // sets the servo position 0-180
         
         // Write some debug info
         Serial.print("Servo changed. new state: ");
         Serial.println(val);
       } else if (message.type==V_UP) {
         Serial.println("Servo UP command");
         myservo.write(SERVO_MIN);
         send(msgSERVO.set(100));
       } else if (message.type==V_DOWN) {
         Serial.println("Servo DOWN command");
         myservo.write(SERVO_MAX); 
         send(msgSERVO.set(0));
       } else if (message.type==V_STOP) {
         Serial.println("Servo STOP command");
         myservo.detach();
         attachedServo = false;
    
       }
       timeOfLastChange = millis();
    }
    

Log in to reply
 

Suggested Topics

0
Online

11.2k
Users

11.1k
Topics

112.5k
Posts