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. My Project
  3. How To: Make a Simple/Cheap Scene Controller (with video)

How To: Make a Simple/Cheap Scene Controller (with video)

Scheduled Pinned Locked Moved My Project
62 Posts 19 Posters 40.1k Views 15 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.
  • B Offline
    B Offline
    brom_snor
    wrote on last edited by
    #17

    Hi Petewill
    I 'd like to build your Scene Controller but I am missing the keypad.h library. Where can I get it?

    greetings
    Brom_Snor

    petewillP 1 Reply Last reply
    0
    • B brom_snor

      Hi Petewill
      I 'd like to build your Scene Controller but I am missing the keypad.h library. Where can I get it?

      greetings
      Brom_Snor

      petewillP Offline
      petewillP Offline
      petewill
      Admin
      wrote on last edited by
      #18

      @brom_snor
      Sorry about that. I thought it was part of the default libraries. I must have downloaded it a while ago. This one should work: http://playground.arduino.cc/Code/Keypad

      My "How To" home automation video channel: https://www.youtube.com/channel/UCq_Evyh5PQALx4m4CQuxqkA

      1 Reply Last reply
      0
      • F Offline
        F Offline
        Fred LaR
        wrote on last edited by
        #19

        Hi all - Another capacitive version with an "out of the bottle" keypad - 4 buttons. Like AWI's version, also toggles between 'Scene ON' and 'Scene OFF', but states are kept in a variable (keyState) - LEDs added for better toogle visibility. Capacitive routine found at http://www.arduino.cc/playground/Code/CapacitiveSensor

        Great post from @petewill and nice version from AWI. Thanks!

        Imagen.jpg

        #include <SPI.h>
        #include <MySensor.h>
        #define SN "Scene Controller"
        #define SV "1.2"
        #define NODE_ID 20 // or set to AUTO if you want gw to assign a NODE_ID for you.
        const byte KEYPAD_CHILD_ID = 1 ;
        MySensor gw;
        MyMessage scene_on(KEYPAD_CHILD_ID, V_SCENE_ON);
        MyMessage scene_off(KEYPAD_CHILD_ID, V_SCENE_OFF);

        long time = 0;
        long debounce = 800;
        const byte keyLeds[] = {14, 15, 16, 17}; //LEDs to turn on/off
        const byte keyPins[] = {2, 3, 4, 5}; //capacitive keys
        byte keyState = B1111; //save LEDs states

        void setup() {
        Serial.begin(9600);
        for (byte i = 0 ; i < sizeof(keyLeds) ; i++)
        { pinMode(keyLeds[i], OUTPUT);
        }
        gw.begin(NULL, NODE_ID);
        gw.sendSketchInfo(SN, SV);
        gw.present(KEYPAD_CHILD_ID, S_SCENE_CONTROLLER);
        }

        void loop() {
        uint8_t pinRead;
        for (byte i = 0 ; i < sizeof(keyPins) ; i++){
        pinRead = readCapacitivePin(keyPins[i]);
        if (pinRead > 2 && millis() - time > debounce) {
        digitalWrite(keyLeds[i], bitRead(keyState,i));
        if (bitRead(keyState,i) == 1){
        gw.send(scene_on.set(keyPins[i]));
        bitWrite(keyState, i, 0);} else
        {gw.send(scene_off.set(keyPins[i]));
        bitWrite(keyState, i, 1);}
        time = millis();
        }
        }
        }

        // — readCapPin found at http://www.arduino.cc/playground/Code/CapacitiveSensor
        uint8_t readCapacitivePin(int pinToMeasure) {

        // Variables used to translate from Arduino to AVR pin naming
        volatile uint8_t* port;
        volatile uint8_t* ddr;
        volatile uint8_t* pin;
        // Here we translate the input pin number from
        // Arduino pin number to the AVR PORT, PIN, DDR,
        // and which bit of those registers we care about.
        byte bitmask;
        port = portOutputRegister(digitalPinToPort(pinToMeasure));
        ddr = portModeRegister(digitalPinToPort(pinToMeasure));
        bitmask = digitalPinToBitMask(pinToMeasure);
        pin = portInputRegister(digitalPinToPort(pinToMeasure));
        // Discharge the pin first by setting it low and output
        *port &= ~(bitmask);
        *ddr |= bitmask;
        delay(1);
        // Make the pin an input with the internal pull-up on
        *ddr &= ~(bitmask);
        *port |= bitmask;

        // Now see how long the pin to get pulled up. This manual unrolling of the loop
        // decreases the number of hardware cycles between each read of the pin,
        // thus increasing sensitivity.
        uint8_t cycles = 17;
        if (*pin & bitmask) { cycles = 0;}
        else if (*pin & bitmask) { cycles = 1;}
        else if (*pin & bitmask) { cycles = 2;}
        else if (*pin & bitmask) { cycles = 3;}
        else if (*pin & bitmask) { cycles = 4;}
        else if (*pin & bitmask) { cycles = 5;}
        else if (*pin & bitmask) { cycles = 6;}
        else if (*pin & bitmask) { cycles = 7;}
        else if (*pin & bitmask) { cycles = 8;}
        else if (*pin & bitmask) { cycles = 9;}
        else if (*pin & bitmask) { cycles = 10;}
        else if (*pin & bitmask) { cycles = 11;}
        else if (*pin & bitmask) { cycles = 12;}
        else if (*pin & bitmask) { cycles = 13;}
        else if (*pin & bitmask) { cycles = 14;}
        else if (*pin & bitmask) { cycles = 15;}
        else if (*pin & bitmask) { cycles = 16;}

        // Discharge the pin again by setting it low and output
        // It’s important to leave the pins low if you want to
        // be able to touch more than 1 sensor at a time – if
        // the sensor is left pulled high, when you touch
        // two sensors, your body will transfer the charge between
        // sensors.
        *port &= ~(bitmask);
        *ddr |= bitmask;

        return cycles;
        }

        DrJeffD petewillP 2 Replies Last reply
        4
        • F Fred LaR

          Hi all - Another capacitive version with an "out of the bottle" keypad - 4 buttons. Like AWI's version, also toggles between 'Scene ON' and 'Scene OFF', but states are kept in a variable (keyState) - LEDs added for better toogle visibility. Capacitive routine found at http://www.arduino.cc/playground/Code/CapacitiveSensor

          Great post from @petewill and nice version from AWI. Thanks!

          Imagen.jpg

          #include <SPI.h>
          #include <MySensor.h>
          #define SN "Scene Controller"
          #define SV "1.2"
          #define NODE_ID 20 // or set to AUTO if you want gw to assign a NODE_ID for you.
          const byte KEYPAD_CHILD_ID = 1 ;
          MySensor gw;
          MyMessage scene_on(KEYPAD_CHILD_ID, V_SCENE_ON);
          MyMessage scene_off(KEYPAD_CHILD_ID, V_SCENE_OFF);

          long time = 0;
          long debounce = 800;
          const byte keyLeds[] = {14, 15, 16, 17}; //LEDs to turn on/off
          const byte keyPins[] = {2, 3, 4, 5}; //capacitive keys
          byte keyState = B1111; //save LEDs states

          void setup() {
          Serial.begin(9600);
          for (byte i = 0 ; i < sizeof(keyLeds) ; i++)
          { pinMode(keyLeds[i], OUTPUT);
          }
          gw.begin(NULL, NODE_ID);
          gw.sendSketchInfo(SN, SV);
          gw.present(KEYPAD_CHILD_ID, S_SCENE_CONTROLLER);
          }

          void loop() {
          uint8_t pinRead;
          for (byte i = 0 ; i < sizeof(keyPins) ; i++){
          pinRead = readCapacitivePin(keyPins[i]);
          if (pinRead > 2 && millis() - time > debounce) {
          digitalWrite(keyLeds[i], bitRead(keyState,i));
          if (bitRead(keyState,i) == 1){
          gw.send(scene_on.set(keyPins[i]));
          bitWrite(keyState, i, 0);} else
          {gw.send(scene_off.set(keyPins[i]));
          bitWrite(keyState, i, 1);}
          time = millis();
          }
          }
          }

          // — readCapPin found at http://www.arduino.cc/playground/Code/CapacitiveSensor
          uint8_t readCapacitivePin(int pinToMeasure) {

          // Variables used to translate from Arduino to AVR pin naming
          volatile uint8_t* port;
          volatile uint8_t* ddr;
          volatile uint8_t* pin;
          // Here we translate the input pin number from
          // Arduino pin number to the AVR PORT, PIN, DDR,
          // and which bit of those registers we care about.
          byte bitmask;
          port = portOutputRegister(digitalPinToPort(pinToMeasure));
          ddr = portModeRegister(digitalPinToPort(pinToMeasure));
          bitmask = digitalPinToBitMask(pinToMeasure);
          pin = portInputRegister(digitalPinToPort(pinToMeasure));
          // Discharge the pin first by setting it low and output
          *port &= ~(bitmask);
          *ddr |= bitmask;
          delay(1);
          // Make the pin an input with the internal pull-up on
          *ddr &= ~(bitmask);
          *port |= bitmask;

          // Now see how long the pin to get pulled up. This manual unrolling of the loop
          // decreases the number of hardware cycles between each read of the pin,
          // thus increasing sensitivity.
          uint8_t cycles = 17;
          if (*pin & bitmask) { cycles = 0;}
          else if (*pin & bitmask) { cycles = 1;}
          else if (*pin & bitmask) { cycles = 2;}
          else if (*pin & bitmask) { cycles = 3;}
          else if (*pin & bitmask) { cycles = 4;}
          else if (*pin & bitmask) { cycles = 5;}
          else if (*pin & bitmask) { cycles = 6;}
          else if (*pin & bitmask) { cycles = 7;}
          else if (*pin & bitmask) { cycles = 8;}
          else if (*pin & bitmask) { cycles = 9;}
          else if (*pin & bitmask) { cycles = 10;}
          else if (*pin & bitmask) { cycles = 11;}
          else if (*pin & bitmask) { cycles = 12;}
          else if (*pin & bitmask) { cycles = 13;}
          else if (*pin & bitmask) { cycles = 14;}
          else if (*pin & bitmask) { cycles = 15;}
          else if (*pin & bitmask) { cycles = 16;}

          // Discharge the pin again by setting it low and output
          // It’s important to leave the pins low if you want to
          // be able to touch more than 1 sensor at a time – if
          // the sensor is left pulled high, when you touch
          // two sensors, your body will transfer the charge between
          // sensors.
          *port &= ~(bitmask);
          *ddr |= bitmask;

          return cycles;
          }

          DrJeffD Offline
          DrJeffD Offline
          DrJeff
          wrote on last edited by
          #20

          @Fred-LaR WOW!
          You just perked up my intrest got to try this one!

          1 Reply Last reply
          0
          • M Offline
            M Offline
            msebbe
            wrote on last edited by
            #21

            Anybody made some Nice enclosure for this?

            1 Reply Last reply
            0
            • F Fred LaR

              Hi all - Another capacitive version with an "out of the bottle" keypad - 4 buttons. Like AWI's version, also toggles between 'Scene ON' and 'Scene OFF', but states are kept in a variable (keyState) - LEDs added for better toogle visibility. Capacitive routine found at http://www.arduino.cc/playground/Code/CapacitiveSensor

              Great post from @petewill and nice version from AWI. Thanks!

              Imagen.jpg

              #include <SPI.h>
              #include <MySensor.h>
              #define SN "Scene Controller"
              #define SV "1.2"
              #define NODE_ID 20 // or set to AUTO if you want gw to assign a NODE_ID for you.
              const byte KEYPAD_CHILD_ID = 1 ;
              MySensor gw;
              MyMessage scene_on(KEYPAD_CHILD_ID, V_SCENE_ON);
              MyMessage scene_off(KEYPAD_CHILD_ID, V_SCENE_OFF);

              long time = 0;
              long debounce = 800;
              const byte keyLeds[] = {14, 15, 16, 17}; //LEDs to turn on/off
              const byte keyPins[] = {2, 3, 4, 5}; //capacitive keys
              byte keyState = B1111; //save LEDs states

              void setup() {
              Serial.begin(9600);
              for (byte i = 0 ; i < sizeof(keyLeds) ; i++)
              { pinMode(keyLeds[i], OUTPUT);
              }
              gw.begin(NULL, NODE_ID);
              gw.sendSketchInfo(SN, SV);
              gw.present(KEYPAD_CHILD_ID, S_SCENE_CONTROLLER);
              }

              void loop() {
              uint8_t pinRead;
              for (byte i = 0 ; i < sizeof(keyPins) ; i++){
              pinRead = readCapacitivePin(keyPins[i]);
              if (pinRead > 2 && millis() - time > debounce) {
              digitalWrite(keyLeds[i], bitRead(keyState,i));
              if (bitRead(keyState,i) == 1){
              gw.send(scene_on.set(keyPins[i]));
              bitWrite(keyState, i, 0);} else
              {gw.send(scene_off.set(keyPins[i]));
              bitWrite(keyState, i, 1);}
              time = millis();
              }
              }
              }

              // — readCapPin found at http://www.arduino.cc/playground/Code/CapacitiveSensor
              uint8_t readCapacitivePin(int pinToMeasure) {

              // Variables used to translate from Arduino to AVR pin naming
              volatile uint8_t* port;
              volatile uint8_t* ddr;
              volatile uint8_t* pin;
              // Here we translate the input pin number from
              // Arduino pin number to the AVR PORT, PIN, DDR,
              // and which bit of those registers we care about.
              byte bitmask;
              port = portOutputRegister(digitalPinToPort(pinToMeasure));
              ddr = portModeRegister(digitalPinToPort(pinToMeasure));
              bitmask = digitalPinToBitMask(pinToMeasure);
              pin = portInputRegister(digitalPinToPort(pinToMeasure));
              // Discharge the pin first by setting it low and output
              *port &= ~(bitmask);
              *ddr |= bitmask;
              delay(1);
              // Make the pin an input with the internal pull-up on
              *ddr &= ~(bitmask);
              *port |= bitmask;

              // Now see how long the pin to get pulled up. This manual unrolling of the loop
              // decreases the number of hardware cycles between each read of the pin,
              // thus increasing sensitivity.
              uint8_t cycles = 17;
              if (*pin & bitmask) { cycles = 0;}
              else if (*pin & bitmask) { cycles = 1;}
              else if (*pin & bitmask) { cycles = 2;}
              else if (*pin & bitmask) { cycles = 3;}
              else if (*pin & bitmask) { cycles = 4;}
              else if (*pin & bitmask) { cycles = 5;}
              else if (*pin & bitmask) { cycles = 6;}
              else if (*pin & bitmask) { cycles = 7;}
              else if (*pin & bitmask) { cycles = 8;}
              else if (*pin & bitmask) { cycles = 9;}
              else if (*pin & bitmask) { cycles = 10;}
              else if (*pin & bitmask) { cycles = 11;}
              else if (*pin & bitmask) { cycles = 12;}
              else if (*pin & bitmask) { cycles = 13;}
              else if (*pin & bitmask) { cycles = 14;}
              else if (*pin & bitmask) { cycles = 15;}
              else if (*pin & bitmask) { cycles = 16;}

              // Discharge the pin again by setting it low and output
              // It’s important to leave the pins low if you want to
              // be able to touch more than 1 sensor at a time – if
              // the sensor is left pulled high, when you touch
              // two sensors, your body will transfer the charge between
              // sensors.
              *port &= ~(bitmask);
              *ddr |= bitmask;

              return cycles;
              }

              petewillP Offline
              petewillP Offline
              petewill
              Admin
              wrote on last edited by
              #22

              @Fred-LaR That's a great idea. Nice!

              My "How To" home automation video channel: https://www.youtube.com/channel/UCq_Evyh5PQALx4m4CQuxqkA

              1 Reply Last reply
              0
              • Michal MormonM Offline
                Michal MormonM Offline
                Michal Mormon
                wrote on last edited by
                #23

                My domoticz found S_SCENE_CONTROLLER sensor but there is not any devices for such a hardware. Do you know how can I control scene with it?

                mfalkviddM M 2 Replies Last reply
                0
                • Michal MormonM Michal Mormon

                  My domoticz found S_SCENE_CONTROLLER sensor but there is not any devices for such a hardware. Do you know how can I control scene with it?

                  mfalkviddM Offline
                  mfalkviddM Offline
                  mfalkvidd
                  Mod
                  wrote on last edited by
                  #24

                  @Michal-Mormon which version of Domoticz are you using?

                  1 Reply Last reply
                  0
                  • Michal MormonM Offline
                    Michal MormonM Offline
                    Michal Mormon
                    wrote on last edited by
                    #25

                    Domoticz v.2.4633

                    1 Reply Last reply
                    0
                    • Michel - ItM Offline
                      Michel - ItM Offline
                      Michel - It
                      wrote on last edited by
                      #26

                      lua script?

                      petewillP 1 Reply Last reply
                      0
                      • Michel - ItM Michel - It

                        lua script?

                        petewillP Offline
                        petewillP Offline
                        petewill
                        Admin
                        wrote on last edited by
                        #27

                        @Michel---It said:

                        lua script?

                        Sorry, not sure what you're asking.

                        My "How To" home automation video channel: https://www.youtube.com/channel/UCq_Evyh5PQALx4m4CQuxqkA

                        1 Reply Last reply
                        0
                        • Michal MormonM Michal Mormon

                          My domoticz found S_SCENE_CONTROLLER sensor but there is not any devices for such a hardware. Do you know how can I control scene with it?

                          M Offline
                          M Offline
                          Maciej Kulawik
                          wrote on last edited by
                          #28

                          @Michal-Mormon
                          S_SCENE_CONTROLLER can send messages V_SCENE_ON and V_SCENE_OFF. If you send those messages for the first time, domoticz will create new switch with the name 'scene'.

                          Michal MormonM 1 Reply Last reply
                          1
                          • M Maciej Kulawik

                            @Michal-Mormon
                            S_SCENE_CONTROLLER can send messages V_SCENE_ON and V_SCENE_OFF. If you send those messages for the first time, domoticz will create new switch with the name 'scene'.

                            Michal MormonM Offline
                            Michal MormonM Offline
                            Michal Mormon
                            wrote on last edited by
                            #29

                            @Maciej-Kulawik
                            I found it as 'Scene' switch but this example send only V_SCENE_ON the first time (the switch is still ON later)

                            M 1 Reply Last reply
                            1
                            • Michal MormonM Michal Mormon

                              @Maciej-Kulawik
                              I found it as 'Scene' switch but this example send only V_SCENE_ON the first time (the switch is still ON later)

                              M Offline
                              M Offline
                              Maciej Kulawik
                              wrote on last edited by
                              #30

                              @Michal-Mormon
                              Yes, exactly! It looks like without scene_off sent from scene controller in domoticz it will be one-time action (since if this scene switch is switched on you cannot switch it on again). You can try to setup automatic switching it off in domoticz.

                              1 Reply Last reply
                              1
                              • Michal MormonM Offline
                                Michal MormonM Offline
                                Michal Mormon
                                wrote on last edited by
                                #31

                                I added 2 lines and works perfect with Domoticz:

                                MyMessage scene(KEYPAD_CHILD_ID, V_SCENE_ON);
                                MyMessage scene2(KEYPAD_CHILD_ID, V_SCENE_OFF); //added line

                                gw.send(scene.set(keyInt));
                                gw.send(scene2.set(keyInt)); //added line

                                Michel - ItM 1 Reply Last reply
                                1
                                • Michal MormonM Michal Mormon

                                  I added 2 lines and works perfect with Domoticz:

                                  MyMessage scene(KEYPAD_CHILD_ID, V_SCENE_ON);
                                  MyMessage scene2(KEYPAD_CHILD_ID, V_SCENE_OFF); //added line

                                  gw.send(scene.set(keyInt));
                                  gw.send(scene2.set(keyInt)); //added line

                                  Michel - ItM Offline
                                  Michel - ItM Offline
                                  Michel - It
                                  wrote on last edited by
                                  #32

                                  @Michal-Mormon awesome!

                                  1 Reply Last reply
                                  0
                                  • DrJeffD Offline
                                    DrJeffD Offline
                                    DrJeff
                                    wrote on last edited by
                                    #33

                                    @petewill Have you updated this code to 2.0 yet? What is different?

                                    hekH petewillP 2 Replies Last reply
                                    0
                                    • DrJeffD DrJeff

                                      @petewill Have you updated this code to 2.0 yet? What is different?

                                      hekH Online
                                      hekH Online
                                      hek
                                      Admin
                                      wrote on last edited by
                                      #34

                                      @DrJeff

                                      https://forum.mysensors.org/topic/4276/converting-a-sketch-from-1-5-x-to-2-0-x

                                      DrJeffD 1 Reply Last reply
                                      0
                                      • hekH hek

                                        @DrJeff

                                        https://forum.mysensors.org/topic/4276/converting-a-sketch-from-1-5-x-to-2-0-x

                                        DrJeffD Offline
                                        DrJeffD Offline
                                        DrJeff
                                        wrote on last edited by
                                        #35

                                        @hek
                                        Yes I read but was soooo lazy! I just wanted it already done :grimacing:

                                        I just update one of my old sensors it was a simple single relay. My others are way more complicated! I will give this a try.

                                        1 Reply Last reply
                                        0
                                        • DrJeffD DrJeff

                                          @petewill Have you updated this code to 2.0 yet? What is different?

                                          petewillP Offline
                                          petewillP Offline
                                          petewill
                                          Admin
                                          wrote on last edited by
                                          #36

                                          @DrJeff said:

                                          @petewill Have you updated this code to 2.0 yet? What is different?

                                          Not yet, but I'm slowly working on it. :) The link hek gave is very helpful if you want to try it yourself. It's a good way to learn about the new features in 2.0.

                                          My "How To" home automation video channel: https://www.youtube.com/channel/UCq_Evyh5PQALx4m4CQuxqkA

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


                                          16

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