Skip to content
  • 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. OpenHardware.io
  3. ๐Ÿ’ฌ Gesture controlled MySensors, Floor lamp
  • Getting Started
  • Controller
  • Build
  • Hardware
  • Download/API
  • Forum
  • Store

๐Ÿ’ฌ Gesture controlled MySensors, Floor lamp

Scheduled Pinned Locked Moved OpenHardware.io
mysensorsfloor lampgesture controlledcontest2016
39 Posts 10 Posters 6.1k Views 11 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.
  • peteoritoP Offline
    peteoritoP Offline
    peteorito
    wrote on last edited by
    #2

    Very intresting project! I didnยดt know the Gesture sensor! Very cool!

    TheoLT 1 Reply Last reply
    0
    • peteoritoP peteorito

      Very intresting project! I didnยดt know the Gesture sensor! Very cool!

      TheoLT Offline
      TheoLT Offline
      TheoL
      Contest Winner
      wrote on last edited by
      #3

      @peteorito I'm glad you like it. The gesture sensors are indeed fun to play with. And they have good use cases. The APDS-9960 is really expensive in comparison to de APDS-9930. I haven't looked what the difference between the two is. I'll look into that in a bit.

      1 Reply Last reply
      0
      • M Offline
        M Offline
        Mike Cayouette
        wrote on last edited by Mike Cayouette
        #4

        Very nice. I did almost the identical thing about a year ago but I used an HS-SR04 distance sensor. I have LEDs under my kitchen cabinets and I placed the SR04 cabinet also and waving your hand by the sensor will turn the LEDs fully on or off. Dimming is done manually via OpenHAB. I will have to try the gesture sensor.

        Mike

        TheoLT 1 Reply Last reply
        0
        • M Mike Cayouette

          Very nice. I did almost the identical thing about a year ago but I used an HS-SR04 distance sensor. I have LEDs under my kitchen cabinets and I placed the SR04 cabinet also and waving your hand by the sensor will turn the LEDs fully on or off. Dimming is done manually via OpenHAB. I will have to try the gesture sensor.

          Mike

          TheoLT Offline
          TheoLT Offline
          TheoL
          Contest Winner
          wrote on last edited by
          #5

          @Mike-Cayouette I did some experimenting with US sensors a year a go works great but you need at least 4 for up/down and right/left gesture detection. The gesture sensor is in that aspect much earier. Good luck with the gesture sensor. And I'd love to see some pictures from the final result.

          1 Reply Last reply
          0
          • Jens GrivollaJ Offline
            Jens GrivollaJ Offline
            Jens Grivolla
            wrote on last edited by
            #6

            I'm not an expert, but your voltage regulation seems strange to me.

            Apparently you are using two linear regulators to first drop from 12V to 8V (originally 5V), and then from there to 3.3V. This means that you are burning almost 75% of your power in those regulator, which ends up as heat you need to dissipate. Just use a switched regulator instead and you get rid of all those problems.

            This might also explain why your electronics use so much energy. The power used by your Arduino and sensors should be absolutely negligible compared to the LEDs, so you really shouldn't need to account for that when choosing the power supply. If you do, then your power supply is far too weak to drive the LEDs reliably anyway.

            TheoLT 1 Reply Last reply
            0
            • Jens GrivollaJ Jens Grivolla

              I'm not an expert, but your voltage regulation seems strange to me.

              Apparently you are using two linear regulators to first drop from 12V to 8V (originally 5V), and then from there to 3.3V. This means that you are burning almost 75% of your power in those regulator, which ends up as heat you need to dissipate. Just use a switched regulator instead and you get rid of all those problems.

              This might also explain why your electronics use so much energy. The power used by your Arduino and sensors should be absolutely negligible compared to the LEDs, so you really shouldn't need to account for that when choosing the power supply. If you do, then your power supply is far too weak to drive the LEDs reliably anyway.

              TheoLT Offline
              TheoLT Offline
              TheoL
              Contest Winner
              wrote on last edited by
              #7

              @Jens-Grivolla Is mentioned in my design I'm no electronics expert as well. So I was hoping that someone like you could help me with this. Do you happen to know a good alternative foor my voltage regulater circuit?

              AWIA 1 Reply Last reply
              0
              • TheoLT TheoL

                @Jens-Grivolla Is mentioned in my design I'm no electronics expert as well. So I was hoping that someone like you could help me with this. Do you happen to know a good alternative foor my voltage regulater circuit?

                AWIA Offline
                AWIA Offline
                AWI
                Hero Member
                wrote on last edited by
                #8

                @TheoL A simple answer... The Ld33 should have more than enough reserve to power the pro-mini, sensor and drive the FET's. The estimated consumption should not exceed 30mA. With a voltage drop over the regulator of around 8 Volt the dissipation is 240mW. Even without cooling the regulator will should not get warm. Unless you are powering more (led's etc.) from the 3.3V line.

                TheoLT 1 Reply Last reply
                0
                • AWIA AWI

                  @TheoL A simple answer... The Ld33 should have more than enough reserve to power the pro-mini, sensor and drive the FET's. The estimated consumption should not exceed 30mA. With a voltage drop over the regulator of around 8 Volt the dissipation is 240mW. Even without cooling the regulator will should not get warm. Unless you are powering more (led's etc.) from the 3.3V line.

                  TheoLT Offline
                  TheoLT Offline
                  TheoL
                  Contest Winner
                  wrote on last edited by
                  #9

                  @AWI I have connected everything as you said. So I'm powering the mosfet, the sensors, the radio and the ProMoni from the LD33V. When I didn't put in the 7808, the LD33V became really hot even with a heat sink. Which with my lack of electrnoic knowledge suggest that the LD is losing too much heat on power transformation.

                  After I added the 7808 both regulators get warm, but still can be touched.

                  So would a switching regulator be a better solution? If so I'll look for a circuit and order the parts tonight.

                  1 Reply Last reply
                  0
                  • Jens GrivollaJ Offline
                    Jens GrivollaJ Offline
                    Jens Grivolla
                    wrote on last edited by
                    #10

                    The LM2575T-3.3 seems to fit and costs around 50 cents on AliExpress. According to the datasheet (http://www.mouser.com/ds/2/308/LM2575-D-88310.pdf) you can have input voltages up to 45V. Efficiency might not be the best, but definitely better than a linear regulator.

                    This is just what I came up with when looking for switching 3.3v regulators, I don't have any actual experience with it.

                    And as @AWI said, your circuit really should be using very little power. From your description, you are burning 500mA@12V = 6W which is absolutely huge. That's a lot of heat to dissipate. Normal consumption for an Arduino when active (without doing anything to lower it, such as using sleep states) is around 25mA@5V = 0.125W and likely quite a bit less for a 3.3V Pro Mini. Even counting some consumption for your sensors you are at around 50 to 100 times the normal consumption (which you all have to dissipate through your heat sinks).

                    TheoLT 1 Reply Last reply
                    0
                    • Jens GrivollaJ Jens Grivolla

                      The LM2575T-3.3 seems to fit and costs around 50 cents on AliExpress. According to the datasheet (http://www.mouser.com/ds/2/308/LM2575-D-88310.pdf) you can have input voltages up to 45V. Efficiency might not be the best, but definitely better than a linear regulator.

                      This is just what I came up with when looking for switching 3.3v regulators, I don't have any actual experience with it.

                      And as @AWI said, your circuit really should be using very little power. From your description, you are burning 500mA@12V = 6W which is absolutely huge. That's a lot of heat to dissipate. Normal consumption for an Arduino when active (without doing anything to lower it, such as using sleep states) is around 25mA@5V = 0.125W and likely quite a bit less for a 3.3V Pro Mini. Even counting some consumption for your sensors you are at around 50 to 100 times the normal consumption (which you all have to dissipate through your heat sinks).

                      TheoLT Offline
                      TheoLT Offline
                      TheoL
                      Contest Winner
                      wrote on last edited by
                      #11

                      @Jens-Grivolla @AWI I'm going for the lazy road, since my time is a bit spare at the moment. Would this be a good switching regulator? It's a bit high priced, but for a first try I don't mind. I can always lookup schematics and build one for future projects.

                      https://translate.google.com/translate?hl=en&sl=nl&tl=en&u=http%3A%2F%2Fwww.vanallesenmeer.nl%2F3.3V%2C-2.5A-Step-Down-Voltage-Regulator-D24V25F3-Pololu-2849

                      Thanx in advance!

                      AWIA Jens GrivollaJ 2 Replies Last reply
                      0
                      • TheoLT TheoL

                        @Jens-Grivolla @AWI I'm going for the lazy road, since my time is a bit spare at the moment. Would this be a good switching regulator? It's a bit high priced, but for a first try I don't mind. I can always lookup schematics and build one for future projects.

                        https://translate.google.com/translate?hl=en&sl=nl&tl=en&u=http%3A%2F%2Fwww.vanallesenmeer.nl%2F3.3V%2C-2.5A-Step-Down-Voltage-Regulator-D24V25F3-Pololu-2849

                        Thanx in advance!

                        AWIA Offline
                        AWIA Offline
                        AWI
                        Hero Member
                        wrote on last edited by
                        #12

                        @TheoL I have a bunch of these laying around doing nothing... drop me your address in a PM (chat) and I will send you one (faster and cheaper).. still curious what is dissipating that much in your circuit..

                        TheoLT 1 Reply Last reply
                        0
                        • TheoLT TheoL

                          @Jens-Grivolla @AWI I'm going for the lazy road, since my time is a bit spare at the moment. Would this be a good switching regulator? It's a bit high priced, but for a first try I don't mind. I can always lookup schematics and build one for future projects.

                          https://translate.google.com/translate?hl=en&sl=nl&tl=en&u=http%3A%2F%2Fwww.vanallesenmeer.nl%2F3.3V%2C-2.5A-Step-Down-Voltage-Regulator-D24V25F3-Pololu-2849

                          Thanx in advance!

                          Jens GrivollaJ Offline
                          Jens GrivollaJ Offline
                          Jens Grivolla
                          wrote on last edited by
                          #13

                          @TheoL I'm far from being an expert, so you may want to get someone else's opinion on it, but to me it looks good. Supports sufficiently high input voltages, good efficiency, and it seems to already have all the capacitors and everything, so you can get rid of all of that in your circuit.

                          Still, even if it was 500mA at 3V (1.5W) instead of 500mA at 12V (6W) (getting rid of all the voltage regulation losses), that would still be around 10 times what I would expect. So something strange is going on.

                          1 Reply Last reply
                          0
                          • AWIA AWI

                            @TheoL I have a bunch of these laying around doing nothing... drop me your address in a PM (chat) and I will send you one (faster and cheaper).. still curious what is dissipating that much in your circuit..

                            TheoLT Offline
                            TheoLT Offline
                            TheoL
                            Contest Winner
                            wrote on last edited by
                            #14

                            @AWI I'll send you a DM in a minute. Thanx in advance. If I'm not mistaken, the gesture sensure is drawing a lot. And I also noticed a big spike while the node's is sending a message to the gateway.

                            AWIA 1 Reply Last reply
                            0
                            • TheoLT TheoL

                              @AWI I'll send you a DM in a minute. Thanx in advance. If I'm not mistaken, the gesture sensure is drawing a lot. And I also noticed a big spike while the node's is sending a message to the gateway.

                              AWIA Offline
                              AWIA Offline
                              AWI
                              Hero Member
                              wrote on last edited by
                              #15

                              @TheoL The APDS should take less than 1 mA according to the datasheet. The "spike" you get during send should also not be more than 30mA...
                              0_1462197967615_upload-66bff58d-c4f4-4d20-b823-c2797c1449b4

                              1 Reply Last reply
                              0
                              • mfalkviddM Offline
                                mfalkviddM Offline
                                mfalkvidd
                                Mod
                                wrote on last edited by
                                #16

                                Got my gesture sensor from China today. Took a while to figure out that I had to solder the bridge for the ir led. Thanks a lot for the notes about setting gesture gain, I wasn't able to get gestures working until I found that note. The sensor works great now!

                                A 2 Replies Last reply
                                0
                                • L Offline
                                  L Offline
                                  Lars65
                                  wrote on last edited by
                                  #17

                                  Is it anybody who have converted it to mysensors 2.0?

                                  1 Reply Last reply
                                  0
                                  • P Offline
                                    P Offline
                                    pjjarzembowski
                                    wrote on last edited by pjjarzembowski
                                    #18

                                    Hi, I'am new with this but I am going to build a kitchen lamp with this scetch. Unfortunately it doesn't work with Mysensors 2.0 library :( Befor I bought a devices for the lamp I was trying to remake the program for mysensors 2.0 I have to wait for my devices from aliexpress for almost two another months so I am going to post my correctet program and I would like to ask someone who has this lamp build with old library if he could test it. Thenk you very much in advance.

                                    And this is the code. It compiles well in compiler program.

                                    /****************************************************************
                                      Title: MySensors enabled, gesture controlled lamp.
                                      
                                      V1.1 March 2016 by Theo
                                      
                                      This lamp can be turned on/off, and dimmed by gestures. And it can be controlled by any Home Automation
                                      system, that can talk with MySensors.
                                      
                                      Supported gesture:
                                      1. Left to right stroke: turns lamp on
                                      2. Right to left stroke: turns lamp off
                                      3. Down to up stroke: increases brightness (When brightness is already at max, the lamp will blink - duration and blink count can be changed in the sketch)
                                      4. Up to down stroke: decreases brgihtness (When brightness level is at 0 the lamp is off)
                                      
                                      The gesture sensor ues in this Sketch is an APDS-9960 RGB and Gesture Sensor, sold by SparkFun. They can be found on eBay and Aliexpress as well.
                                      See Sparkfuns hookup guide for pin lay-out ( https://learn.sparkfun.com/tutorials/apds-9960-rgb-and-gesture-sensor-hookup-guide ) 
                                      IMPORTANT: The APDS-9960 can only accept 3.3V! Use bi direction level converter when using another Arduino than a Pro Mini 3.3V
                                    
                                      This Sketch is based upon the GestureTest exampl developped by,
                                      Shawn Hymel @ SparkFun Electronics on May 30, 2014. See https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
                                    
                                      The lamp itself is a white LED strip, controlled by an N channel MOSFET.
                                      
                                      Fore more details on the used hardware and libraries (see https://www.openhardware.io/view/50/Gesture-controlled-MySensors-Floor-lamp )
                                      
                                      Developed and test with MySensors release 1.5.4
                                      
                                      Revision history:
                                      3-07-2017 Changed for tests on Mysensors 2.0 
                                      - The change was not made by the original author of the program
                                    
                                      
                                    
                                      
                                      20-03-2016 Version 1.1:
                                          - set the brightness level to defined BRIGHTNESS_INCREMENT, when lamp is being turned on be a gesture and the current brightness level is 0.
                                            This was a little bug in previous version. It sometimes seemed that the APDS didn't work, but in some cases I had to increase brightness after
                                            I turned the lamp on.
                                          - cleaned up the code a bit
                                      19-03-2016 Version 1.0
                                    ****************************************************************/
                                    // Import libraries used by the Sketch.
                                    // added some of my radio definitions (must be before #includes)
                                    #define MY_DEBUG
                                    #define MY_RADIO_NRF24
                                    #define MY_RF24_PA_LEVEL RF24_PA_MAX
                                    #define MY_NODE_ID 10
                                    
                                    
                                    #include <SPI.h>
                                    #include <MySensors.h>  
                                    #include <Wire.h>
                                    #include <SparkFun_APDS9960.h>
                                    
                                    
                                    
                                    // Constants declaration(s)
                                    #define APDS9960_INT                      2   // Needs to be an interrupt pin. We should be able to use the Arduino's pin 3 as well.
                                    #define LED_PIN                           3   // The led PWM pin, that drives the LED strip. This is the pin thats attached to the mosfet.
                                    #define MAXDIMLEVELS                     100  // The maximum number of dim levels. Domoticz supports 0-100 (we'll transalate thim in an array)
                                    #define BRIGHTNESS_INCREMENT             15   // Dimmer increment for gesture(s). Play with this value yourself. The amount of gesture controlled
                                                                                  // dim levels is MAXDIMLEVELS / BRIGHTNESS_INCREMENT having 8 to 5 levels feels more natural to me.
                                    #define MAX_LEVEL_REACHED_DELAY          150  // Short blinking delay when increasing the dimmer while the dimmer is already at max
                                                                                  // Had some troubles in the past with tha acurateness of the gw.wait on pro mini's. But that'll probably
                                                                                  // not be noticeable with this short delay. Delay is in milliseconds
                                    #define MAX_LEVEL_REACHED_SIGNAL_COUNT   2    // The amount of blinks, when the max dim level already has been reached. It's just a way to let the user know
                                                                                  // that the lamp can not be more brighter than the current brightness
                                    #define CHILD_ID_LIGHT                   1    // The child id of the Node. Only one Node on this sensor though. See MySensors documentation
                                    #define LIGHT_OFF                        0    // Constant indicating the lamp on state
                                    #define LIGHT_ON                         1    // Constant indicationg light off state
                                    //#define SN "Gesture controlled lamp"          // Description of this sketch. 
                                    //#define SV                               "1.1" // The version of the Sketch
                                    
                                    // Global Variables
                                    SparkFun_APDS9960 apds = SparkFun_APDS9960(); // Initialize a SparkFun_APDS9960 object. This does all the magic incl. i2c communication with the sensor.
                                    int isr_flag = 0;                             // interrupt flag, triggered when a gesture has been dectected. Used to detect gesture detection in the interrupt handler
                                                                                  // the actual handling is done in the main loop. This allows is the keep the interrupt handler is lightweight is possible
                                                                                  // which is a good practice. Otherwise you'll get some behaviour you don't expect.
                                    int LastLightState=LIGHT_OFF;                 // The current lamp state. Wel'll turn it off for first time useage. The Sketch will query your Home Automation System for
                                                                                  // the last value when it's being reboot.
                                    int LastDimValue=MAXDIMLEVELS;                // last known dim value (Only initial value. Value is retrieved from your HA system)
                                    
                                    /**
                                     * Values could be calculated. But the sketch is small and storing in an Array is just faster. Otherwise we have to do calculations that incl Floats.
                                     * Floats take up a lot of your arduino memory
                                     */
                                    int dimlevels[ MAXDIMLEVELS ] =  // PWM values used for translating home automation dimmer levels. This gives smoother transations
                                      {   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,
                                         10,  11,  12,  13,  14,  15,  16,  17,  18,  19,
                                         20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
                                         30,  31,  32,  35,  39,  42,  46,  49,  52,  56,
                                         59,  62,  66,  69,  73,  76,  79,  83,  86,  89,
                                         93,  96, 100, 103, 106, 110, 113, 116, 120, 123,
                                        126, 130, 133, 137, 140, 144, 147, 150, 154, 157,
                                        160, 164, 167, 171, 174, 177, 181, 184, 187, 191,
                                        194, 197, 201, 204, 208, 211, 215, 218, 221, 225,
                                        228, 231, 235, 238, 242, 245, 246, 250, 251, 255 };
                                    
                                    /**
                                     * Variables needed for setting up and communication with MySensors. These variables will handle all of the MySensors magic for you.
                                     */
                                    //MySensor gw;
                                    MyMessage lightMsg(CHILD_ID_LIGHT, V_LIGHT);
                                    MyMessage dimmerMsg(CHILD_ID_LIGHT, V_DIMMER);
                                    
                                    /**
                                     * Initializing code. Basicly we'll setup MySensors communication and test if we can communicate with the gesture sensor. See comment in setup method for more details
                                     */
                                     // interrupt handler. Is being triggered by the gesture sensor whenever a gesture has been detected. We've setup this up in the setup.
                                    void interruptRoutine() {
                                      isr_flag = 1;
                                    }
                                    
                                    void setup() {
                                      // Initialize NFR24L01+ radio for enabling MySensors );
                                      //gw.begin(incomingMessage, AUTO, false);
                                    
                                      // Send the Sketch Version Information to the Gateway. Domoticz seems to ignore this. Don't know about the other HA systems. 
                                     // gw.sendSketchInfo(SN, SV);
                                    sendSketchInfo("Led Kuchnia Lampa", "2.0");
                                      // Present the dimmable lamp is a child node to the HA system. We'll enable ACK communication.
                                     // gw.present(CHILD_ID_LIGHT, S_DIMMER, "floor lamp", true );
                                      present(CHILD_ID_LIGHT, S_DIMMER);
                                      // declare output pin for PWM control of the MOSFET
                                      pinMode( LED_PIN, OUTPUT );
                                    
                                      // APDS Initialization code
                                      pinMode(APDS9960_INT, INPUT);   // Set interrupt pin as input. @@Note: this should be handled my the library. But it isn't
                                      attachInterrupt(0, interruptRoutine, FALLING);   // Initialize interrupt service routine. Basicly it'll call our interrupt routine
                                    
                                      if ( apds.init() ) { // Initialize APDS-9960 (configure I2C and initial values)
                                        // @@NOTE: original value is two. But it looks like the modern gesture sensor or more sensitive. 1 does it for me
                                        apds.setGestureGain( 1 );
                                      }
                                      
                                      if ( apds.enableGestureSensor(true) ) { // Start running the APDS-9960 gesture sensor engine. Sensor support more functions than gesture detection only.
                                        analogWrite( LED_PIN, 0 ); // Turn the lamp off.
                                        //gw.request( CHILD_ID_LIGHT, V_PERCENTAGE ); // Request current dimvalue from HA. The current value is being handled in the incomming method.
                                       request( CHILD_ID_LIGHT, V_PERCENTAGE ); // Request current dimvalue from HA. The current value is being handled in the incomming method.
                                        //gw.request( CHILD_ID_LIGHT, V_STATUS ); // Request current lamp state from HA. The current value is being handled in the incomming method.
                                      request( CHILD_ID_LIGHT, V_STATUS ); // Request current lamp state from HA. The current value is being handled in the incomming method.
                                      }
                                      }
                                    // }
                                    
                                    // Main loop. Does twoe things. Handle gestures if detected by the interrupt routine. And give the MySensors lib the oppurtunity to handle incomming messages.
                                    void loop() {
                                      if( isr_flag == 1 ) {
                                        detachInterrupt(0);
                                        handleGesture();
                                        isr_flag = 0;
                                        attachInterrupt(0, interruptRoutine, FALLING);
                                      }
                                      //gw.process();
                                    }
                                    
                                    
                                    
                                    
                                    //here originaly was
                                    // interrupt handler. Is being triggered by the gesture sensor whenever a gesture has been detected. We've setup this up in the setup.
                                    //void interruptRoutine() {
                                    //  isr_flag = 1;
                                    //}
                                    
                                    
                                    // Determine gesture and handle accordingly.We'll ignore FAR and NEAR gestures. Do didn't feel natural to me anyway.
                                    void handleGesture() {
                                      if ( apds.isGestureAvailable() ) { // Check if there's a gesture available. Which should be, because the interrupt handler told us so.
                                        switch ( apds.readGesture() ) { // Get the gesture type.
                                          case DIR_UP: // Handle up stroke (Brightness increasing)
                                            if ( LastDimValue + BRIGHTNESS_INCREMENT > ( MAXDIMLEVELS - 1 ) ) {
                                              for ( int i = 0; i < MAX_LEVEL_REACHED_SIGNAL_COUNT; i++ ) {
                                                analogWrite( LED_PIN, dimlevels[ 0 ] );
                                                //gw.wait( MAX_LEVEL_REACHED_DELAY );
                                                wait( MAX_LEVEL_REACHED_DELAY );
                                                analogWrite( LED_PIN, dimlevels[ MAXDIMLEVELS - 1 ] );
                                                //gw.wait(MAX_LEVEL_REACHED_DELAY );
                                                wait(MAX_LEVEL_REACHED_DELAY );
                                              }
                                              LastDimValue = ( MAXDIMLEVELS - 1 );
                                            }
                                            else {
                                               LastDimValue += BRIGHTNESS_INCREMENT;
                                            }
                                            LastLightState = LIGHT_ON;
                                            SetCurrentState2Hardware();
                                            break;
                                          case DIR_DOWN: // Handle down stroke (Brightness decreasing)
                                            if ( LastDimValue - BRIGHTNESS_INCREMENT <= 0 ) {
                                              LastDimValue = 0;
                                            }
                                            else {
                                               LastDimValue -= BRIGHTNESS_INCREMENT;
                                            }
                                            if ( LastDimValue == 0 ) {
                                              LastLightState = LIGHT_OFF;
                                            }
                                            else {
                                              LastLightState = LIGHT_ON;
                                            }
                                            SetCurrentState2Hardware();
                                            break;
                                          case DIR_LEFT: // Handle left stroke. Turn lamp off
                                            LastLightState = LIGHT_OFF;
                                            SetCurrentState2Hardware();
                                            break;
                                          case DIR_RIGHT: // Handle right stroke. Turn lamp on
                                            LastLightState = LIGHT_ON;
                                            if ( LastDimValue == 0 ) { // @@Version 1.1 addition Slight modification. When the dimValue was 0, the light stayed off when turned on.
                                              LastDimValue = BRIGHTNESS_INCREMENT; // Just used the first Gesture dimming stage (2 times would be better for my taste though. Might change that in the future)
                                            }
                                            SetCurrentState2Hardware();
                                            break;
                                        }
                                      }
                                    }
                                    
                                    /**
                                     * Handler for message send by the MySensor gateway.
                                     */ 
                                    void receive(const MyMessage &message) {
                                      if ( message.type == V_LIGHT ) { // Gateway reports a new Light state
                                        int lstate= atoi( message.data );
                                        if ( ( lstate < 0 ) || ( lstate > 1 ) ) {
                                          return;
                                        }
                                        LastLightState=lstate;
                                        if ( ( LastLightState == LIGHT_ON ) &&( LastDimValue == 0 ) ) {
                                           //In the case that the Light State = On, but the dimmer value is zero, then something (probably the controller) did something wrong,
                                           //for the Dim value to 100%
                                          LastDimValue = 100;
                                        }
                                        
                                        //When receiving a V_LIGHT command we switch the light between OFF and the last received dimmer value
                                        //This means if you previously set the lights dimmer value to 50%, and turn the light ON
                                        //it will do so at 50%
                                      }
                                      else if (message.type == V_DIMMER) { // Gateway reports new dimmer level. We'l adjust it to the new value
                                        int dimvalue= atoi( message.data );
                                        if ( ( dimvalue < 0 ) || ( dimvalue > 100 ) ) {
                                          return;
                                        }
                                        if ( dimvalue == 0 ) {
                                          LastLightState = LIGHT_OFF;
                                        }
                                        else {
                                          LastLightState = LIGHT_ON;
                                          LastDimValue = dimvalue;
                                        }
                                      }
                                      //Here we'll set the actual light state/level
                                      SetCurrentState2Hardware();
                                    }
                                    
                                    // Send current values to the PWM controlled MOSFET
                                    void SetCurrentState2Hardware() {
                                      if (LastLightState==LIGHT_OFF) {
                                         analogWrite( LED_PIN, dimlevels[0] );
                                      }
                                      else {
                                         analogWrite( LED_PIN, dimlevels[ LastDimValue - 1 ] );
                                      }
                                    
                                      //Send current state to the controller
                                      SendCurrentState2Controller();
                                    }
                                    
                                    // Report new values to the Gateway.
                                    void SendCurrentState2Controller()
                                    {
                                      if ((LastLightState==LIGHT_OFF)||(LastDimValue==0)) {
                                        //gw.send(dimmerMsg.set(0));
                                        send(dimmerMsg.set(0));
                                      }
                                      else {
                                        //gw.send(dimmerMsg.set(LastDimValue));
                                        send(dimmerMsg.set(LastDimValue));
                                      }
                                    }
                                    
                                    
                                    TheoLT 1 Reply Last reply
                                    0
                                    • P pjjarzembowski

                                      Hi, I'am new with this but I am going to build a kitchen lamp with this scetch. Unfortunately it doesn't work with Mysensors 2.0 library :( Befor I bought a devices for the lamp I was trying to remake the program for mysensors 2.0 I have to wait for my devices from aliexpress for almost two another months so I am going to post my correctet program and I would like to ask someone who has this lamp build with old library if he could test it. Thenk you very much in advance.

                                      And this is the code. It compiles well in compiler program.

                                      /****************************************************************
                                        Title: MySensors enabled, gesture controlled lamp.
                                        
                                        V1.1 March 2016 by Theo
                                        
                                        This lamp can be turned on/off, and dimmed by gestures. And it can be controlled by any Home Automation
                                        system, that can talk with MySensors.
                                        
                                        Supported gesture:
                                        1. Left to right stroke: turns lamp on
                                        2. Right to left stroke: turns lamp off
                                        3. Down to up stroke: increases brightness (When brightness is already at max, the lamp will blink - duration and blink count can be changed in the sketch)
                                        4. Up to down stroke: decreases brgihtness (When brightness level is at 0 the lamp is off)
                                        
                                        The gesture sensor ues in this Sketch is an APDS-9960 RGB and Gesture Sensor, sold by SparkFun. They can be found on eBay and Aliexpress as well.
                                        See Sparkfuns hookup guide for pin lay-out ( https://learn.sparkfun.com/tutorials/apds-9960-rgb-and-gesture-sensor-hookup-guide ) 
                                        IMPORTANT: The APDS-9960 can only accept 3.3V! Use bi direction level converter when using another Arduino than a Pro Mini 3.3V
                                      
                                        This Sketch is based upon the GestureTest exampl developped by,
                                        Shawn Hymel @ SparkFun Electronics on May 30, 2014. See https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
                                      
                                        The lamp itself is a white LED strip, controlled by an N channel MOSFET.
                                        
                                        Fore more details on the used hardware and libraries (see https://www.openhardware.io/view/50/Gesture-controlled-MySensors-Floor-lamp )
                                        
                                        Developed and test with MySensors release 1.5.4
                                        
                                        Revision history:
                                        3-07-2017 Changed for tests on Mysensors 2.0 
                                        - The change was not made by the original author of the program
                                      
                                        
                                      
                                        
                                        20-03-2016 Version 1.1:
                                            - set the brightness level to defined BRIGHTNESS_INCREMENT, when lamp is being turned on be a gesture and the current brightness level is 0.
                                              This was a little bug in previous version. It sometimes seemed that the APDS didn't work, but in some cases I had to increase brightness after
                                              I turned the lamp on.
                                            - cleaned up the code a bit
                                        19-03-2016 Version 1.0
                                      ****************************************************************/
                                      // Import libraries used by the Sketch.
                                      // added some of my radio definitions (must be before #includes)
                                      #define MY_DEBUG
                                      #define MY_RADIO_NRF24
                                      #define MY_RF24_PA_LEVEL RF24_PA_MAX
                                      #define MY_NODE_ID 10
                                      
                                      
                                      #include <SPI.h>
                                      #include <MySensors.h>  
                                      #include <Wire.h>
                                      #include <SparkFun_APDS9960.h>
                                      
                                      
                                      
                                      // Constants declaration(s)
                                      #define APDS9960_INT                      2   // Needs to be an interrupt pin. We should be able to use the Arduino's pin 3 as well.
                                      #define LED_PIN                           3   // The led PWM pin, that drives the LED strip. This is the pin thats attached to the mosfet.
                                      #define MAXDIMLEVELS                     100  // The maximum number of dim levels. Domoticz supports 0-100 (we'll transalate thim in an array)
                                      #define BRIGHTNESS_INCREMENT             15   // Dimmer increment for gesture(s). Play with this value yourself. The amount of gesture controlled
                                                                                    // dim levels is MAXDIMLEVELS / BRIGHTNESS_INCREMENT having 8 to 5 levels feels more natural to me.
                                      #define MAX_LEVEL_REACHED_DELAY          150  // Short blinking delay when increasing the dimmer while the dimmer is already at max
                                                                                    // Had some troubles in the past with tha acurateness of the gw.wait on pro mini's. But that'll probably
                                                                                    // not be noticeable with this short delay. Delay is in milliseconds
                                      #define MAX_LEVEL_REACHED_SIGNAL_COUNT   2    // The amount of blinks, when the max dim level already has been reached. It's just a way to let the user know
                                                                                    // that the lamp can not be more brighter than the current brightness
                                      #define CHILD_ID_LIGHT                   1    // The child id of the Node. Only one Node on this sensor though. See MySensors documentation
                                      #define LIGHT_OFF                        0    // Constant indicating the lamp on state
                                      #define LIGHT_ON                         1    // Constant indicationg light off state
                                      //#define SN "Gesture controlled lamp"          // Description of this sketch. 
                                      //#define SV                               "1.1" // The version of the Sketch
                                      
                                      // Global Variables
                                      SparkFun_APDS9960 apds = SparkFun_APDS9960(); // Initialize a SparkFun_APDS9960 object. This does all the magic incl. i2c communication with the sensor.
                                      int isr_flag = 0;                             // interrupt flag, triggered when a gesture has been dectected. Used to detect gesture detection in the interrupt handler
                                                                                    // the actual handling is done in the main loop. This allows is the keep the interrupt handler is lightweight is possible
                                                                                    // which is a good practice. Otherwise you'll get some behaviour you don't expect.
                                      int LastLightState=LIGHT_OFF;                 // The current lamp state. Wel'll turn it off for first time useage. The Sketch will query your Home Automation System for
                                                                                    // the last value when it's being reboot.
                                      int LastDimValue=MAXDIMLEVELS;                // last known dim value (Only initial value. Value is retrieved from your HA system)
                                      
                                      /**
                                       * Values could be calculated. But the sketch is small and storing in an Array is just faster. Otherwise we have to do calculations that incl Floats.
                                       * Floats take up a lot of your arduino memory
                                       */
                                      int dimlevels[ MAXDIMLEVELS ] =  // PWM values used for translating home automation dimmer levels. This gives smoother transations
                                        {   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,
                                           10,  11,  12,  13,  14,  15,  16,  17,  18,  19,
                                           20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
                                           30,  31,  32,  35,  39,  42,  46,  49,  52,  56,
                                           59,  62,  66,  69,  73,  76,  79,  83,  86,  89,
                                           93,  96, 100, 103, 106, 110, 113, 116, 120, 123,
                                          126, 130, 133, 137, 140, 144, 147, 150, 154, 157,
                                          160, 164, 167, 171, 174, 177, 181, 184, 187, 191,
                                          194, 197, 201, 204, 208, 211, 215, 218, 221, 225,
                                          228, 231, 235, 238, 242, 245, 246, 250, 251, 255 };
                                      
                                      /**
                                       * Variables needed for setting up and communication with MySensors. These variables will handle all of the MySensors magic for you.
                                       */
                                      //MySensor gw;
                                      MyMessage lightMsg(CHILD_ID_LIGHT, V_LIGHT);
                                      MyMessage dimmerMsg(CHILD_ID_LIGHT, V_DIMMER);
                                      
                                      /**
                                       * Initializing code. Basicly we'll setup MySensors communication and test if we can communicate with the gesture sensor. See comment in setup method for more details
                                       */
                                       // interrupt handler. Is being triggered by the gesture sensor whenever a gesture has been detected. We've setup this up in the setup.
                                      void interruptRoutine() {
                                        isr_flag = 1;
                                      }
                                      
                                      void setup() {
                                        // Initialize NFR24L01+ radio for enabling MySensors );
                                        //gw.begin(incomingMessage, AUTO, false);
                                      
                                        // Send the Sketch Version Information to the Gateway. Domoticz seems to ignore this. Don't know about the other HA systems. 
                                       // gw.sendSketchInfo(SN, SV);
                                      sendSketchInfo("Led Kuchnia Lampa", "2.0");
                                        // Present the dimmable lamp is a child node to the HA system. We'll enable ACK communication.
                                       // gw.present(CHILD_ID_LIGHT, S_DIMMER, "floor lamp", true );
                                        present(CHILD_ID_LIGHT, S_DIMMER);
                                        // declare output pin for PWM control of the MOSFET
                                        pinMode( LED_PIN, OUTPUT );
                                      
                                        // APDS Initialization code
                                        pinMode(APDS9960_INT, INPUT);   // Set interrupt pin as input. @@Note: this should be handled my the library. But it isn't
                                        attachInterrupt(0, interruptRoutine, FALLING);   // Initialize interrupt service routine. Basicly it'll call our interrupt routine
                                      
                                        if ( apds.init() ) { // Initialize APDS-9960 (configure I2C and initial values)
                                          // @@NOTE: original value is two. But it looks like the modern gesture sensor or more sensitive. 1 does it for me
                                          apds.setGestureGain( 1 );
                                        }
                                        
                                        if ( apds.enableGestureSensor(true) ) { // Start running the APDS-9960 gesture sensor engine. Sensor support more functions than gesture detection only.
                                          analogWrite( LED_PIN, 0 ); // Turn the lamp off.
                                          //gw.request( CHILD_ID_LIGHT, V_PERCENTAGE ); // Request current dimvalue from HA. The current value is being handled in the incomming method.
                                         request( CHILD_ID_LIGHT, V_PERCENTAGE ); // Request current dimvalue from HA. The current value is being handled in the incomming method.
                                          //gw.request( CHILD_ID_LIGHT, V_STATUS ); // Request current lamp state from HA. The current value is being handled in the incomming method.
                                        request( CHILD_ID_LIGHT, V_STATUS ); // Request current lamp state from HA. The current value is being handled in the incomming method.
                                        }
                                        }
                                      // }
                                      
                                      // Main loop. Does twoe things. Handle gestures if detected by the interrupt routine. And give the MySensors lib the oppurtunity to handle incomming messages.
                                      void loop() {
                                        if( isr_flag == 1 ) {
                                          detachInterrupt(0);
                                          handleGesture();
                                          isr_flag = 0;
                                          attachInterrupt(0, interruptRoutine, FALLING);
                                        }
                                        //gw.process();
                                      }
                                      
                                      
                                      
                                      
                                      //here originaly was
                                      // interrupt handler. Is being triggered by the gesture sensor whenever a gesture has been detected. We've setup this up in the setup.
                                      //void interruptRoutine() {
                                      //  isr_flag = 1;
                                      //}
                                      
                                      
                                      // Determine gesture and handle accordingly.We'll ignore FAR and NEAR gestures. Do didn't feel natural to me anyway.
                                      void handleGesture() {
                                        if ( apds.isGestureAvailable() ) { // Check if there's a gesture available. Which should be, because the interrupt handler told us so.
                                          switch ( apds.readGesture() ) { // Get the gesture type.
                                            case DIR_UP: // Handle up stroke (Brightness increasing)
                                              if ( LastDimValue + BRIGHTNESS_INCREMENT > ( MAXDIMLEVELS - 1 ) ) {
                                                for ( int i = 0; i < MAX_LEVEL_REACHED_SIGNAL_COUNT; i++ ) {
                                                  analogWrite( LED_PIN, dimlevels[ 0 ] );
                                                  //gw.wait( MAX_LEVEL_REACHED_DELAY );
                                                  wait( MAX_LEVEL_REACHED_DELAY );
                                                  analogWrite( LED_PIN, dimlevels[ MAXDIMLEVELS - 1 ] );
                                                  //gw.wait(MAX_LEVEL_REACHED_DELAY );
                                                  wait(MAX_LEVEL_REACHED_DELAY );
                                                }
                                                LastDimValue = ( MAXDIMLEVELS - 1 );
                                              }
                                              else {
                                                 LastDimValue += BRIGHTNESS_INCREMENT;
                                              }
                                              LastLightState = LIGHT_ON;
                                              SetCurrentState2Hardware();
                                              break;
                                            case DIR_DOWN: // Handle down stroke (Brightness decreasing)
                                              if ( LastDimValue - BRIGHTNESS_INCREMENT <= 0 ) {
                                                LastDimValue = 0;
                                              }
                                              else {
                                                 LastDimValue -= BRIGHTNESS_INCREMENT;
                                              }
                                              if ( LastDimValue == 0 ) {
                                                LastLightState = LIGHT_OFF;
                                              }
                                              else {
                                                LastLightState = LIGHT_ON;
                                              }
                                              SetCurrentState2Hardware();
                                              break;
                                            case DIR_LEFT: // Handle left stroke. Turn lamp off
                                              LastLightState = LIGHT_OFF;
                                              SetCurrentState2Hardware();
                                              break;
                                            case DIR_RIGHT: // Handle right stroke. Turn lamp on
                                              LastLightState = LIGHT_ON;
                                              if ( LastDimValue == 0 ) { // @@Version 1.1 addition Slight modification. When the dimValue was 0, the light stayed off when turned on.
                                                LastDimValue = BRIGHTNESS_INCREMENT; // Just used the first Gesture dimming stage (2 times would be better for my taste though. Might change that in the future)
                                              }
                                              SetCurrentState2Hardware();
                                              break;
                                          }
                                        }
                                      }
                                      
                                      /**
                                       * Handler for message send by the MySensor gateway.
                                       */ 
                                      void receive(const MyMessage &message) {
                                        if ( message.type == V_LIGHT ) { // Gateway reports a new Light state
                                          int lstate= atoi( message.data );
                                          if ( ( lstate < 0 ) || ( lstate > 1 ) ) {
                                            return;
                                          }
                                          LastLightState=lstate;
                                          if ( ( LastLightState == LIGHT_ON ) &&( LastDimValue == 0 ) ) {
                                             //In the case that the Light State = On, but the dimmer value is zero, then something (probably the controller) did something wrong,
                                             //for the Dim value to 100%
                                            LastDimValue = 100;
                                          }
                                          
                                          //When receiving a V_LIGHT command we switch the light between OFF and the last received dimmer value
                                          //This means if you previously set the lights dimmer value to 50%, and turn the light ON
                                          //it will do so at 50%
                                        }
                                        else if (message.type == V_DIMMER) { // Gateway reports new dimmer level. We'l adjust it to the new value
                                          int dimvalue= atoi( message.data );
                                          if ( ( dimvalue < 0 ) || ( dimvalue > 100 ) ) {
                                            return;
                                          }
                                          if ( dimvalue == 0 ) {
                                            LastLightState = LIGHT_OFF;
                                          }
                                          else {
                                            LastLightState = LIGHT_ON;
                                            LastDimValue = dimvalue;
                                          }
                                        }
                                        //Here we'll set the actual light state/level
                                        SetCurrentState2Hardware();
                                      }
                                      
                                      // Send current values to the PWM controlled MOSFET
                                      void SetCurrentState2Hardware() {
                                        if (LastLightState==LIGHT_OFF) {
                                           analogWrite( LED_PIN, dimlevels[0] );
                                        }
                                        else {
                                           analogWrite( LED_PIN, dimlevels[ LastDimValue - 1 ] );
                                        }
                                      
                                        //Send current state to the controller
                                        SendCurrentState2Controller();
                                      }
                                      
                                      // Report new values to the Gateway.
                                      void SendCurrentState2Controller()
                                      {
                                        if ((LastLightState==LIGHT_OFF)||(LastDimValue==0)) {
                                          //gw.send(dimmerMsg.set(0));
                                          send(dimmerMsg.set(0));
                                        }
                                        else {
                                          //gw.send(dimmerMsg.set(LastDimValue));
                                          send(dimmerMsg.set(LastDimValue));
                                        }
                                      }
                                      
                                      
                                      TheoLT Offline
                                      TheoLT Offline
                                      TheoL
                                      Contest Winner
                                      wrote on last edited by
                                      #19

                                      @pjjarzembowski I'm sorry my dear friend. I've been really occupied the last month. Can't wait until it's getting less busy at work. Than I'll have some time to see if I can help you.
                                      But I've read somewhere that the cheaper versions of the gesture sensors aren't that great. Curious about your findings.

                                      1 Reply Last reply
                                      0
                                      • P Offline
                                        P Offline
                                        pjjarzembowski
                                        wrote on last edited by
                                        #20
                                        This post is deleted!
                                        P 1 Reply Last reply
                                        0
                                        • P pjjarzembowski

                                          This post is deleted!

                                          P Offline
                                          P Offline
                                          pjjarzembowski
                                          wrote on last edited by pjjarzembowski
                                          #21

                                          @pjjarzembowski said in ๐Ÿ’ฌ Gesture controlled MySensors, Floor lamp:
                                          Hello!!
                                          I can now say that the program below, is working in mysensors 2.0. It was tested in arduino Uno (china clone) and in arduino Nano (china clone). The gesture controller is also from China.
                                          But additionaly I had to change the line:
                                          void incomingMessage(const MyMessage &message) {
                                          to
                                          void receive(const MyMessage &message) {

                                          and I had to change the file in arduino library:

                                          In the file SparkFun_APDS9960.cpp, search and find the line:
                                          if( !setLEDBoost(LED_BOOST_300) ) {
                                          and edit it to read:
                                          if( !setLEDBoost(LED_BOOST_100) ) {

                                          That is all. It works fine :)
                                          Thanks Theo for a Great program :)

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


                                          19

                                          Online

                                          11.7k

                                          Users

                                          11.2k

                                          Topics

                                          113.0k

                                          Posts


                                          Copyright 2019 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
                                          • OpenHardware.io
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular