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 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
                                        • Matt PittsM Offline
                                          Matt PittsM Offline
                                          Matt Pitts
                                          wrote on last edited by
                                          #39

                                          Hi Guys,

                                          I've been trying to compile this sketch without any success. I keep getting the following error when compiling

                                          #error No forward link or gateway feature activated. This means nowhere to send messages! Pretty pointless.
                                          

                                          Can anyone help? thanks

                                          petewillP 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