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. Troubleshooting
  3. PWM control

PWM control

Scheduled Pinned Locked Moved Troubleshooting
16 Posts 4 Posters 205 Views 3 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.
  • doodoovaneD Offline
    doodoovaneD Offline
    doodoovane
    wrote on last edited by
    #5

    Some news, it works now!
    I took some code for a dimmable LED here

    The only problem now is that the fan does a little sound it didn't with the first code.

    here is the code:

    /**
    * 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-2019 Sensnology AB
    * Full contributor list: https://github.com/mysensors/MySensors/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.
    *
    *******************************
    *
    * DESCRIPTION
    * The ArduinoGateway prints data received from sensors on the serial link.
    * The gateway accepts input on serial which will be sent out on radio network.
    *
    * The GW code is designed for Arduino Nano 328p / 16MHz
    *
    * Wire connections (OPTIONAL):
    * - Inclusion button should be connected between digital pin 3 and GND
    * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series
    *
    * LEDs (OPTIONAL):
    * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs
    * - RX (green) - blink fast on radio message received. In inclusion mode will blink fast only on presentation received
    * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
    * - ERR (red) - fast blink on error during transmission error or receive crc error
    *
    */
    
    // 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
    
    // Set LOW transmit power level as default, if you have an amplified NRF-module and
    // power your radio separately with a good regulator you can turn up PA level.
    //#define MY_RF24_PA_LEVEL RF24_PA_LOW
    
    // Enable serial gateway
    #define MY_GATEWAY_SERIAL
    
    // Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
    #if F_CPU == 8000000L
    #define MY_BAUD_RATE 38400
    #endif
    
    // Enable inclusion mode
    #define MY_INCLUSION_MODE_FEATURE
    // Enable Inclusion mode button on gateway
    //#define MY_INCLUSION_BUTTON_FEATURE
    
    // Inverses behavior of inclusion button (if using external pullup)
    //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP
    
    // Set inclusion mode duration (in seconds)
    #define MY_INCLUSION_MODE_DURATION 60
    // Digital pin used for inclusion mode button
    //#define MY_INCLUSION_MODE_BUTTON_PIN  3
    
    // Set blinking period
    #define MY_DEFAULT_LED_BLINK_PERIOD 300
    
    // Inverses the behavior of leds
    //#define MY_WITH_LEDS_BLINKING_INVERSE
    
    // Flash leds on rx/tx/err
    // Uncomment to override default HW configurations
    //#define MY_DEFAULT_ERR_LED_PIN 4  // Error led pin
    //#define MY_DEFAULT_RX_LED_PIN  6  // Receive led pin
    //#define MY_DEFAULT_TX_LED_PIN  5  // the PCB, on board LED
    
    #include <MySensors.h>
    
    #define SN "DimmableLED"
    #define SV "1.1"
    
    #define LED_PIN 9      // Arduino pin attached to MOSFET Gate pin
    #define FADE_DELAY 10  // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
    
    static int16_t currentLevel = 0;  // Current dim level...
    MyMessage dimmerMsg(0, V_DIMMER);
    MyMessage lightMsg(0, V_LIGHT);
    
    void setup()
    {
    	// Setup locally attached sensors
     request( 0, V_DIMMER );
    }
    
    void presentation()
    {
    	// Present locally attached sensors
     present( 0, S_DIMMER );
    
        sendSketchInfo(SN, SV);
    }
    
    void loop()
    {
    	// Send locally attached sensor data here
    }
    
    void receive(const MyMessage &message)
    {
        if (message.getType() == V_LIGHT || message.getType() == V_DIMMER) {
    
            //  Retrieve the power or dim level from the incoming request message
            int requestedLevel = atoi( message.data );
    
            // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
            requestedLevel *= ( message.getType() == V_LIGHT ? 100 : 1 );
    
            // Clip incoming level to valid range of 0 to 100
            requestedLevel = requestedLevel > 100 ? 100 : requestedLevel;
            requestedLevel = requestedLevel < 0   ? 0   : requestedLevel;
    
            Serial.print( "Changing level to " );
            Serial.print( requestedLevel );
            Serial.print( ", from " );
            Serial.println( currentLevel );
    
            fadeToLevel( requestedLevel );
    
            // Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
            send(lightMsg.set(currentLevel > 0));
    
            // hek comment: Is this really nessesary?
            send( dimmerMsg.set(currentLevel) );
    
    
        }
    }
    
    /***
     *  This method provides a graceful fade up/down effect
     */
    void fadeToLevel( int toLevel )
    {
    
        int delta = ( toLevel - currentLevel ) < 0 ? -1 : 1;
    
        while ( currentLevel != toLevel ) {
            currentLevel += delta;
            analogWrite( LED_PIN, (int)(currentLevel / 100. * 255) );
            delay( FADE_DELAY );
        }
    }
    

    Do you have any idea why it does this?

    1 Reply Last reply
    0
    • scalzS Offline
      scalzS Offline
      scalz
      Hardware Contributor
      wrote on last edited by scalz
      #6

      @doodoovane
      not sure if I get it, but the little sound could be generated by pwm freq.

      Note, your last sketch is not ideal:

      • don't send msg in receive(). it's better to update a variable, and check this variable in loop() for sending a msg, to avoid recursive call to receive()
      • Same for your fading function, it's better to call it from loop(). Receive() should finish as fast as possible.
      • don't use delay() in your fading function, it's a blocking function. It's better to do this async, in a non-blocking way, or use wait() as it can process received msg in background .
      mfalkviddM doodoovaneD 2 Replies Last reply
      1
      • scalzS scalz

        @doodoovane
        not sure if I get it, but the little sound could be generated by pwm freq.

        Note, your last sketch is not ideal:

        • don't send msg in receive(). it's better to update a variable, and check this variable in loop() for sending a msg, to avoid recursive call to receive()
        • Same for your fading function, it's better to call it from loop(). Receive() should finish as fast as possible.
        • don't use delay() in your fading function, it's a blocking function. It's better to do this async, in a non-blocking way, or use wait() as it can process received msg in background .
        mfalkviddM Offline
        mfalkviddM Offline
        mfalkvidd
        Mod
        wrote on last edited by
        #7

        @scalz the delay() and send() calls are from the MySensors example, my guess is that doodoovane just followed the example.

        1 Reply Last reply
        1
        • scalzS Offline
          scalzS Offline
          scalz
          Hardware Contributor
          wrote on last edited by scalz
          #8

          @mfalkvidd
          yep I noticed that. I just provided a few feedbacks for his future sketches :)

          1 Reply Last reply
          2
          • scalzS scalz

            @doodoovane
            not sure if I get it, but the little sound could be generated by pwm freq.

            Note, your last sketch is not ideal:

            • don't send msg in receive(). it's better to update a variable, and check this variable in loop() for sending a msg, to avoid recursive call to receive()
            • Same for your fading function, it's better to call it from loop(). Receive() should finish as fast as possible.
            • don't use delay() in your fading function, it's a blocking function. It's better to do this async, in a non-blocking way, or use wait() as it can process received msg in background .
            doodoovaneD Offline
            doodoovaneD Offline
            doodoovane
            wrote on last edited by
            #9

            @scalz that's what I thought but it doesn't make any sound with the first code I posted.
            Something to do with the frequency maybe?

            1 Reply Last reply
            0
            • doodoovaneD Offline
              doodoovaneD Offline
              doodoovane
              wrote on last edited by
              #10
              This post is deleted!
              1 Reply Last reply
              0
              • doodoovaneD Offline
                doodoovaneD Offline
                doodoovane
                wrote on last edited by
                #11

                Me again!
                So the problem seemed to be the frequency as I don't have sound anymore.
                With a little hindsight, I looked back at @Yveaux's messages (here and on another post) and here is what I've tried.

                /**
                * 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-2019 Sensnology AB
                * Full contributor list: https://github.com/mysensors/MySensors/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.
                *
                *******************************
                *
                * DESCRIPTION
                * The ArduinoGateway prints data received from sensors on the serial link.
                * The gateway accepts input on serial which will be sent out on radio network.
                *
                * The GW code is designed for Arduino Nano 328p / 16MHz
                *
                * Wire connections (OPTIONAL):
                * - Inclusion button should be connected between digital pin 3 and GND
                * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series
                *
                * LEDs (OPTIONAL):
                * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs
                * - RX (green) - blink fast on radio message received. In inclusion mode will blink fast only on presentation received
                * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
                * - ERR (red) - fast blink on error during transmission error or receive crc error
                *
                */
                
                // 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
                
                // Set LOW transmit power level as default, if you have an amplified NRF-module and
                // power your radio separately with a good regulator you can turn up PA level.
                //#define MY_RF24_PA_LEVEL RF24_PA_LOW
                
                // Enable serial gateway
                #define MY_GATEWAY_SERIAL
                
                // Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
                #if F_CPU == 8000000L
                #define MY_BAUD_RATE 38400
                #endif
                
                // Enable inclusion mode
                #define MY_INCLUSION_MODE_FEATURE
                // Enable Inclusion mode button on gateway
                //#define MY_INCLUSION_BUTTON_FEATURE
                
                // Inverses behavior of inclusion button (if using external pullup)
                //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP
                
                // Set inclusion mode duration (in seconds)
                #define MY_INCLUSION_MODE_DURATION 60
                // Digital pin used for inclusion mode button
                //#define MY_INCLUSION_MODE_BUTTON_PIN  3
                
                // Set blinking period
                #define MY_DEFAULT_LED_BLINK_PERIOD 300
                
                // Inverses the behavior of leds
                //#define MY_WITH_LEDS_BLINKING_INVERSE
                
                // Flash leds on rx/tx/err
                // Uncomment to override default HW configurations
                //#define MY_DEFAULT_ERR_LED_PIN 4  // Error led pin
                //#define MY_DEFAULT_RX_LED_PIN  6  // Receive led pin
                //#define MY_DEFAULT_TX_LED_PIN  5  // the PCB, on board LED
                
                #include <MySensors.h>
                #include <TimerOne.h>
                
                #define SN "DimmableLED"
                #define SV "1.1"
                
                #define LED_PIN 9      // Arduino pin attached to MOSFET Gate pin
                #define FADE_DELAY 10  // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
                
                
                static int16_t currentLevel = 0;  // Current dim level...
                MyMessage dimmerMsg(0, V_DIMMER);
                MyMessage lightMsg(0, V_LIGHT);
                
                void setup()
                {
                  // Setup locally attached sensors
                 request( 0, V_DIMMER );
                 #define PWM_FREQ_HZ (25000) 
                #define PWM_CYCLE_US (1000000/PWM_FREQ_HZ)
                
                Timer1.initialize(PWM_CYCLE_US);
                Timer1.pwm(LED_PIN, 1023); 
                }
                
                void presentation()
                {
                  // Present locally attached sensors
                 present( 0, S_DIMMER );
                
                    sendSketchInfo(SN, SV);
                }
                
                void loop()
                {
                  // Send locally attached sensor data here
                }
                
                void receive(const MyMessage &message)
                {
                    if (message.getType() == V_LIGHT || message.getType() == V_DIMMER) {
                
                        //  Retrieve the power or dim level from the incoming request message
                        int requestedLevel = atoi( message.data );
                
                        // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
                        requestedLevel *= ( message.getType() == V_LIGHT ? 100 : 1 );
                
                        // Clip incoming level to valid range of 0 to 100
                        requestedLevel = requestedLevel >= 101 ? 100 : requestedLevel;
                        requestedLevel = requestedLevel < 0   ? 0   : requestedLevel;
                
                        Serial.print( "Changing level to " );
                        Serial.print( requestedLevel );
                        Serial.print( ", from " );
                        Serial.println( currentLevel );
                
                        fadeToLevel( requestedLevel );
                
                        // Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
                        send(lightMsg.set(currentLevel > 0));
                
                        // hek comment: Is this really nessesary?
                        send( dimmerMsg.set(currentLevel) );
                
                
                    }
                }
                
                /***
                 *  This method provides a graceful fade up/down effect
                 */
                void fadeToLevel( int toLevel )
                {
                
                    int delta = ( toLevel - currentLevel ) < 0 ? -1 : 1;
                
                    while ( currentLevel != toLevel ) {
                        currentLevel += delta;
                        analogWrite( LED_PIN, (int)(currentLevel / 100. * 255) );
                        delay( FADE_DELAY );
                    }
                }
                

                No more sound, but now Can't get it more than 99% in domoticz... The only way to get 100% is to turn it off and turn it back on. As long as you touch the slider, no more 100%...

                Any clue of what can cause this?

                YveauxY 1 Reply Last reply
                1
                • doodoovaneD doodoovane

                  Me again!
                  So the problem seemed to be the frequency as I don't have sound anymore.
                  With a little hindsight, I looked back at @Yveaux's messages (here and on another post) and here is what I've tried.

                  /**
                  * 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-2019 Sensnology AB
                  * Full contributor list: https://github.com/mysensors/MySensors/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.
                  *
                  *******************************
                  *
                  * DESCRIPTION
                  * The ArduinoGateway prints data received from sensors on the serial link.
                  * The gateway accepts input on serial which will be sent out on radio network.
                  *
                  * The GW code is designed for Arduino Nano 328p / 16MHz
                  *
                  * Wire connections (OPTIONAL):
                  * - Inclusion button should be connected between digital pin 3 and GND
                  * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series
                  *
                  * LEDs (OPTIONAL):
                  * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs
                  * - RX (green) - blink fast on radio message received. In inclusion mode will blink fast only on presentation received
                  * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
                  * - ERR (red) - fast blink on error during transmission error or receive crc error
                  *
                  */
                  
                  // 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
                  
                  // Set LOW transmit power level as default, if you have an amplified NRF-module and
                  // power your radio separately with a good regulator you can turn up PA level.
                  //#define MY_RF24_PA_LEVEL RF24_PA_LOW
                  
                  // Enable serial gateway
                  #define MY_GATEWAY_SERIAL
                  
                  // Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
                  #if F_CPU == 8000000L
                  #define MY_BAUD_RATE 38400
                  #endif
                  
                  // Enable inclusion mode
                  #define MY_INCLUSION_MODE_FEATURE
                  // Enable Inclusion mode button on gateway
                  //#define MY_INCLUSION_BUTTON_FEATURE
                  
                  // Inverses behavior of inclusion button (if using external pullup)
                  //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP
                  
                  // Set inclusion mode duration (in seconds)
                  #define MY_INCLUSION_MODE_DURATION 60
                  // Digital pin used for inclusion mode button
                  //#define MY_INCLUSION_MODE_BUTTON_PIN  3
                  
                  // Set blinking period
                  #define MY_DEFAULT_LED_BLINK_PERIOD 300
                  
                  // Inverses the behavior of leds
                  //#define MY_WITH_LEDS_BLINKING_INVERSE
                  
                  // Flash leds on rx/tx/err
                  // Uncomment to override default HW configurations
                  //#define MY_DEFAULT_ERR_LED_PIN 4  // Error led pin
                  //#define MY_DEFAULT_RX_LED_PIN  6  // Receive led pin
                  //#define MY_DEFAULT_TX_LED_PIN  5  // the PCB, on board LED
                  
                  #include <MySensors.h>
                  #include <TimerOne.h>
                  
                  #define SN "DimmableLED"
                  #define SV "1.1"
                  
                  #define LED_PIN 9      // Arduino pin attached to MOSFET Gate pin
                  #define FADE_DELAY 10  // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
                  
                  
                  static int16_t currentLevel = 0;  // Current dim level...
                  MyMessage dimmerMsg(0, V_DIMMER);
                  MyMessage lightMsg(0, V_LIGHT);
                  
                  void setup()
                  {
                    // Setup locally attached sensors
                   request( 0, V_DIMMER );
                   #define PWM_FREQ_HZ (25000) 
                  #define PWM_CYCLE_US (1000000/PWM_FREQ_HZ)
                  
                  Timer1.initialize(PWM_CYCLE_US);
                  Timer1.pwm(LED_PIN, 1023); 
                  }
                  
                  void presentation()
                  {
                    // Present locally attached sensors
                   present( 0, S_DIMMER );
                  
                      sendSketchInfo(SN, SV);
                  }
                  
                  void loop()
                  {
                    // Send locally attached sensor data here
                  }
                  
                  void receive(const MyMessage &message)
                  {
                      if (message.getType() == V_LIGHT || message.getType() == V_DIMMER) {
                  
                          //  Retrieve the power or dim level from the incoming request message
                          int requestedLevel = atoi( message.data );
                  
                          // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
                          requestedLevel *= ( message.getType() == V_LIGHT ? 100 : 1 );
                  
                          // Clip incoming level to valid range of 0 to 100
                          requestedLevel = requestedLevel >= 101 ? 100 : requestedLevel;
                          requestedLevel = requestedLevel < 0   ? 0   : requestedLevel;
                  
                          Serial.print( "Changing level to " );
                          Serial.print( requestedLevel );
                          Serial.print( ", from " );
                          Serial.println( currentLevel );
                  
                          fadeToLevel( requestedLevel );
                  
                          // Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
                          send(lightMsg.set(currentLevel > 0));
                  
                          // hek comment: Is this really nessesary?
                          send( dimmerMsg.set(currentLevel) );
                  
                  
                      }
                  }
                  
                  /***
                   *  This method provides a graceful fade up/down effect
                   */
                  void fadeToLevel( int toLevel )
                  {
                  
                      int delta = ( toLevel - currentLevel ) < 0 ? -1 : 1;
                  
                      while ( currentLevel != toLevel ) {
                          currentLevel += delta;
                          analogWrite( LED_PIN, (int)(currentLevel / 100. * 255) );
                          delay( FADE_DELAY );
                      }
                  }
                  

                  No more sound, but now Can't get it more than 99% in domoticz... The only way to get 100% is to turn it off and turn it back on. As long as you touch the slider, no more 100%...

                  Any clue of what can cause this?

                  YveauxY Offline
                  YveauxY Offline
                  Yveaux
                  Mod
                  wrote on last edited by Yveaux
                  #12

                  @doodoovane why do you use analogwrite instead of Timer1.setPwmDuty?
                  Also, the fading should not be required for a fan.
                  Iirr the maximum duty value is 1023. Likely the fan won't be at its maximum speed then, only when you supply it a continuous high 'pulse'. Is that what you mean by 99%?

                  http://yveaux.blogspot.nl

                  doodoovaneD 1 Reply Last reply
                  0
                  • YveauxY Yveaux

                    @doodoovane why do you use analogwrite instead of Timer1.setPwmDuty?
                    Also, the fading should not be required for a fan.
                    Iirr the maximum duty value is 1023. Likely the fan won't be at its maximum speed then, only when you supply it a continuous high 'pulse'. Is that what you mean by 99%?

                    doodoovaneD Offline
                    doodoovaneD Offline
                    doodoovane
                    wrote on last edited by
                    #13

                    @Yveaux said in PWM control:

                    Timer1.setPwmDuty

                    I did but there must be something wrong with my code as the PWM doesn't work anymore.
                    Here is my try:

                    #include <MySensors.h>
                    #include <TimerOne.h>
                    
                    #define SN "Fan_PWM"
                    #define SV "1.3"
                    
                    #define LED_PIN 9      // Arduino pin attached to MOSFET Gate pin
                    #define FADE_DELAY 10  // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
                    
                    
                    static int16_t currentLevel = 0;  // Current dim level...
                    MyMessage dimmerMsg(0, V_DIMMER);
                    MyMessage lightMsg(0, V_LIGHT);
                    
                    void setup()
                    {
                      // Setup locally attached sensors
                     request( 0, V_DIMMER );
                     #define PWM_FREQ_HZ (25000) 
                     #define PWM_CYCLE_US (1000000/PWM_FREQ_HZ)
                    
                    Timer1.initialize(PWM_CYCLE_US);
                    Timer1.pwm(LED_PIN, 1023); 
                    }
                    
                    void presentation()
                    {
                      // Present locally attached sensors
                     present( 0, S_DIMMER );
                    
                        sendSketchInfo(SN, SV);
                    }
                    
                    void loop()
                    {
                      // Send locally attached sensor data here
                    }
                    
                    void receive(const MyMessage &message)
                    {
                        if (message.getType() == V_LIGHT || message.getType() == V_DIMMER) {
                    
                            //  Retrieve the power or dim level from the incoming request message
                            int requestedLevel = atoi( message.data );
                    
                            // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
                            requestedLevel *= ( message.getType() == V_LIGHT ? 100 : 1 );
                    
                            // Clip incoming level to valid range of 0 to 100
                            requestedLevel = requestedLevel > 100 ? 100 : requestedLevel;
                            requestedLevel = requestedLevel < 0   ? 0   : requestedLevel;
                    
                            Serial.print( "Changing level to " );
                            Serial.print( requestedLevel );
                            Serial.print( ", from " );
                            Serial.println( currentLevel );
                    
                            Timer1.setPwmDuty(LED_PIN, requestedLevel);
                    
                            // Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
                            send(lightMsg.set(currentLevel > 0));
                    
                            // hek comment: Is this really nessesary?
                            send( dimmerMsg.set(currentLevel) );
                    
                    
                        }
                    }
                    

                    What I mean by 99% is that the slider of the dimmer when pulled to 100% come back to 99% (as I can see in my switch log) in domoticz. And there is no "100%" input just like if I pulled the slider to 99%...

                    1 Reply Last reply
                    0
                    • doodoovaneD Offline
                      doodoovaneD Offline
                      doodoovane
                      wrote on last edited by
                      #14

                      Hello everyone,

                      I'm still stuck with my problem as I don't fin any solution.
                      Is there a way to say in the code "if level is at 100%, stop the PWM regulation (full power fan)" ?

                      Thank you for your help

                      mfalkviddM 1 Reply Last reply
                      0
                      • doodoovaneD doodoovane

                        Hello everyone,

                        I'm still stuck with my problem as I don't fin any solution.
                        Is there a way to say in the code "if level is at 100%, stop the PWM regulation (full power fan)" ?

                        Thank you for your help

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

                        @doodoovane you can change

                        requestedLevel = requestedLevel > 100 ? 100 : requestedLevel;
                        

                        to

                        requestedLevel = requestedLevel > 98 ? 100 : requestedLevel;
                        
                        doodoovaneD 1 Reply Last reply
                        0
                        • mfalkviddM mfalkvidd

                          @doodoovane you can change

                          requestedLevel = requestedLevel > 100 ? 100 : requestedLevel;
                          

                          to

                          requestedLevel = requestedLevel > 98 ? 100 : requestedLevel;
                          
                          doodoovaneD Offline
                          doodoovaneD Offline
                          doodoovane
                          wrote on last edited by
                          #16

                          @mfalkvidd said in PWM control:

                          requestedLevel = requestedLevel > 98 ? 100 : requestedLevel;

                          Thank You @mfalkvidd it works that way! Domoticz still showing me his 99% but at least the fan is going 100%.

                          Thank you for your help, sometime thing can get easier :)

                          1 Reply Last reply
                          2
                          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.1k

                          Posts


                          Copyright 2025 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