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.
  • 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 Online
    mfalkviddM Online
    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 Online
                    mfalkviddM Online
                    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