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
A

adds666

@adds666
  • Getting Started
  • Controller
  • Build
  • Hardware
  • Download/API
  • Forum
  • Store
About
Posts
18
Topics
3
Shares
0
Groups
0
Followers
0
Following
1

Posts

Recent Best Controversial

  • Combining 'Build' examples in to one Arduino
    A adds666

    @mfalkvidd many thanks for coming back. I think I'll keep more complex things seperate, however will explore multiple binary sensors and relays on the same node.

    Thanks

    Hardware

  • MyHelperFunctions.h error: expected unqualified-id before 'static'
    A adds666

    No way - found it. Large comment at the top of sketch (not copied to this forum) had a line of *********s across the top.

    Removed and all ok. Thanks for your help anyway @mfalkvidd

    Troubleshooting

  • Relay Actuator with momentary (pulse) action
    A adds666

    @BearWithBeard said in Relay Actuator with momentary (pulse) action:

    digitalWrite(relayPin[message.getSensor()-7], RELAY_ON)

    Many thanks for coming back @BearWithBeard, its a huge help.
    So my logic for correcting the State problem at the bottom would be to do the same calculation to get them in to 0 and 1.

    saveState(message.getSensor()-7, message.getBool());
    

    Compiled correctly and then uploaded and it works! Fantastic. The following sketch has 3 dimmers, 4 buttons and 2 relay outputs.

    Thank you very much - I'm learning ;)

    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - February 15, 2014 - Bruce Lacey
     * Version 1.1 - August 13, 2014 - Converted to 1.4 (hek)
     *
     * DESCRIPTION
     * This sketch provides a Dimmable LED Light using PWM and based Henrik Ekblad
     * <henrik.ekblad@gmail.com> Vera Arduino Sensor project.
     * Developed by Bruce Lacey, inspired by Hek's MySensor's example sketches.
     *
     * The circuit uses a MOSFET for Pulse-Wave-Modulation to dim the attached LED or LED strip.
     * The MOSFET Gate pin is connected to Arduino pin 3 (LED_PIN), the MOSFET Drain pin is connected
     * to the LED negative terminal and the MOSFET Source pin is connected to ground.
     *
     */
    // Button
    // The below includes 4 buttons using code examples from here:  https://forum.mysensors.org/topic/9538/multiple-switch-inputs/8
    // Button
    
    // Relay
    // The below includes 2 relays from https://www.mysensors.org/build/relay
    // https://forum.mysensors.org/topic/5906/relay-actuator-with-momentary-pulse-action/2
    // Relay
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    //#define MY_RADIO_RF24
    //#define MY_RADIO_NRF5_ESB
    //#define MY_RADIO_RFM69
    //#define MY_RADIO_RFM95
    // Enable RS485 transport layer
    #define MY_RS485
    
    // Define this to enables DE-pin management on defined pin
    #define MY_RS485_DE_PIN 2
    
    // Set RS485 baud rate to use
    #define MY_RS485_BAUD_RATE 9600
    
    #define MY_NODE_ID 4 
    
    #include <SPI.h>
    #include <MySensors.h> 
    
    // Button
    #include <Bounce2.h>
    //
    
    #define SN "N004"
    #define SV "1.0"
    
    #define noLEDs 2
    const int LED_Pin[] = {5, 6}; 
    
    #define FADE_DELAY 10  // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
    
    static int currentLevel1 = 0;  // Current dim level...
    static int currentLevel2 = 0;  // Current dim level...
    
    MyMessage dimmer1Msg(1, V_DIMMER);
    MyMessage light1Msg(1, V_LIGHT);
    MyMessage dimmer2Msg(2, V_DIMMER);
    MyMessage light2Msg(2, V_LIGHT);
    
    // Button
    #define FIRST_BUTTON_ID 3
    #define MAX_BUTTON 4 
    const uint8_t buttonPin[] = {4, 10, 11, 12};   //  switch around pins to your desire
    Bounce debouncer[MAX_BUTTON];
    MyMessage buttonMsg(0, V_TRIPPED);
    bool oldButton[MAX_BUTTON] = {false};
    // Button
    
    
    // Relay
    #define FIRST_RELAY_ID 7
    #define MAX_RELAY 2
    const uint8_t relayPin[] = {3, 7};  // Pins of relays
    
    MyMessage relayMsg(0, V_STATUS);
    
    
    #define RELAY_ON 1
    #define RELAY_OFF 0
    // Relay
    
    
    void before()
    {
      
    }
    
    /***
     * Dimmable LED initialization method
     */
    void setup()  
    { 
      // LEDS
      // Pull the gateway's current dim level - restore light level upon sendor node power-up
    for (int sensor=1; sensor<=noLEDs; sensor++){
      request( sensor, V_DIMMER );
     }
    // Button
    for (uint8_t i = 0; i < MAX_BUTTON; i++) {
        debouncer[i] = Bounce();                        // initialize debouncer
        debouncer[i].attach(buttonPin[i], INPUT_PULLUP);
        debouncer[i].interval(5);
        oldButton[i] =  debouncer[i].read();
      }
    // Button
    
    
    // Relay
    for (uint8_t i = 0; i < MAX_RELAY; i++) {
      pinMode(relayPin[i], OUTPUT);
      //digitalWrite(relayPin, loadState(i)?RELAY_ON:RELAY_OFF);
      if (loadState(i) == RELAY_ON) {
    digitalWrite(relayPin, RELAY_ON);
    wait(500);
    digitalWrite(relayPin, RELAY_OFF);
    }
    }
    // Relay
    }
    
    void presentation() {
      // Register the LED Dimmable Light with the gateway
     for (int sensor=1; sensor<=noLEDs; sensor++){
     present(sensor, S_DIMMER);
     wait(2);
     }
    
    // Button
     for (int i = 0; i < MAX_BUTTON; i++) { //i < numSensors &&
        present(FIRST_BUTTON_ID + i, S_DOOR);
      }
     // Button
    
    // Relay
    for (int i = 0; i < MAX_RELAY; i++)   {
      present(FIRST_RELAY_ID + i, S_BINARY);
    }
    // Relay
    
      sendSketchInfo(SN, SV);
    }
    
    /***
     *  Dimmable LED main processing loop 
     */
    void loop() 
    {
    
    // Button
      bool button[MAX_BUTTON];
      for (uint8_t i = 0; i < MAX_BUTTON; i++) {
        debouncer[i].update();
        button[i] = debouncer[i].read();
        if (button[i] != oldButton[i]) {
          send(buttonMsg.setSensor(FIRST_BUTTON_ID + i).set( button[i])); // Send tripped value to gw
          oldButton[i] = button[i];
        }
      } 
      // Button
    
    }
    
    
    
    void receive(const MyMessage &message) {
      if (message.type == V_LIGHT || message.type == V_DIMMER) {
    
        if (message.sensor == 1) {
    
         //  Retrieve the power or dim level from the incoming request message
        int requestedLevel1 = atoi( message.data );
        
        // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
        requestedLevel1 *= ( message.type == V_LIGHT ? 100 : 1 );
        
        // Clip incoming level to valid range of 0 to 100
        requestedLevel1 = requestedLevel1 > 100 ? 100 : requestedLevel1;
        requestedLevel1 = requestedLevel1 < 0   ? 0   : requestedLevel1;
    
          
         fadeToLevel1( requestedLevel1, message.sensor );
        send(light1Msg.set(currentLevel1 > 0 ? 1 : 0)); 
        send(dimmer1Msg.set(currentLevel1) );}
       
        
        
         
       if (message.sensor == 2) {
       //  Retrieve the power or dim level from the incoming request message
        int requestedLevel2 = atoi( message.data );
        
        // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
        requestedLevel2 *= ( message.type == V_LIGHT ? 100 : 1 );
        
        // Clip incoming level to valid range of 0 to 100
        requestedLevel2 = requestedLevel2 > 100 ? 100 : requestedLevel2;
        requestedLevel2 = requestedLevel2 < 0   ? 0   : requestedLevel2;
        
        fadeToLevel2( requestedLevel2, message.sensor );
        send(light2Msg.set(currentLevel2 > 0 ? 1 : 0));
        send(dimmer2Msg.set(currentLevel2) );}
         
    
        }
    
    // Relay
      if (message.type == V_STATUS) {
    
        if (message.sensor == 7)  {
          if (message.getBool() == RELAY_ON) {
            //digitalWrite(message.getSensor()-1+relayPin, RELAY_ON);
            digitalWrite(relayPin[message.getSensor()-7], RELAY_ON);
            wait(500);
            //digitalWrite(message.getSensor()-1+relayPin, RELAY_OFF);
            digitalWrite(relayPin[message.getSensor()-7], RELAY_OFF);
          }
        saveState(message.getSensor()-7, message.getBool());
        }
        
        
        if (message.sensor == 8)  {
          if (message.getBool() == RELAY_ON) {
            //digitalWrite(message.getSensor()-1+relayPin, RELAY_ON);
            digitalWrite(relayPin[message.getSensor()-7], RELAY_ON);
            wait(500);
            //digitalWrite(message.getSensor()-1+relayPin, RELAY_OFF);
            digitalWrite(relayPin[message.getSensor()-7], RELAY_OFF);
          }
        saveState(message.getSensor()-7, message.getBool());  
        }
      }
    
    
    // Relay
        
    }
    
    /***
     *  This method provides a graceful fade up/down effect
     */
    void fadeToLevel1( int toLevel1, int ledid1 ) {
    
      int delta1 = ( toLevel1 - currentLevel1 ) < 0 ? -1 : 1;
      
      while ( currentLevel1 != toLevel1 ) {
        currentLevel1 += delta1;
        analogWrite(LED_Pin[ledid1-1], (int)(currentLevel1 / 100. * 255) );
        wait( FADE_DELAY );
      }
    }
    void fadeToLevel2( int toLevel2, int ledid2 ) {
    
      int delta2 = ( toLevel2 - currentLevel2 ) < 0 ? -1 : 1;
      
      while ( currentLevel2 != toLevel2 ) {
        currentLevel2 += delta2;
        analogWrite(LED_Pin[ledid2-1], (int)(currentLevel2 / 100. * 255) );
        wait( FADE_DELAY );
      }
    }
    
    Troubleshooting
  • Login

  • Don't have an account? Register

  • Login or register to search.
  • First post
    Last post
0
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular