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.
  • 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
                                      • dvr123D Offline
                                        dvr123D Offline
                                        dvr123
                                        wrote on last edited by
                                        #37

                                        @petewill Any news about the 2.0 code? I am in the process of making scene controllers in the different rooms but can't get it to work.

                                        petewillP 1 Reply Last reply
                                        0
                                        • dvr123D dvr123

                                          @petewill Any news about the 2.0 code? I am in the process of making scene controllers in the different rooms but can't get it to work.

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

                                          @dvr123 No, not yet :grimacing:
                                          My thermostat project has taken priority over everything because I need one in my house. I have a prototype working but I need to finish it. It is taking much longer than expected and I also haven't had much time lately. Sorry.

                                          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


                                          18

                                          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