CCCPaste Login

pumpPWM.h

#include "esphome.h"
#include "pwmWrite.h"
using namespace esphome;

#define PUMP_PWM_A 32
#define PUMP_PWM_B 33

Pwm pwm = Pwm();
const char TAG[]="PUMP_PWM";
class AeroGardenPumpOutput : public Component, public BinaryOutput {
    public:
        bool runState=false;
        void setup() override {
            ESP_LOGI(TAG,"Started PWM Control.");
            //https://github.com/Dlloydev/ESP32-ESP32S2-AnalogWrite
            pwm.pause();

            //The following is done in the write_state function.
            //For the H-Bridge to truly turn off, both outputs need
            // to be 0 or both 1.
            //The inverted pin needs to be detached and reattached as non-inverted
            //for its output to go to 0 on pause or else it will go to 1.
            //So, I just made it detach and reattach both pins on both
            // on/off branches of write_state for simplicity and so that it's clear.

            //No longer need below
            //Attach to pwm channel sharing timer 2
            // pwm.attach(PUMP_PWM_A, 4, false);   //pin 32, channel 4, invert=false
            // pwm.attach(PUMP_PWM_B, 5, true);    //pin 33, channel 5, invert=true
            // pwm.write(PUMP_PWM_A, 128, 60);     //Set pin 32 to 50% duty, 60hz
            // pwm.write(PUMP_PWM_B, 128, 60);
        }
        bool state(){return runState;}
        void loop() override {
        }

        void write_state(bool state) override {
            if(!runState && state){
                ESP_LOGI(TAG,"Turning PWM ON.");
                 //resume pins 32 & 33 to 50% duty, 60hz
                pwm.detach(PUMP_PWM_A);    //pin 32, channel 4, invert=false
                pwm.detach(PUMP_PWM_B);    //pin 33, channel 5, invert=true
                pwm.attach(PUMP_PWM_A, 4, false);   //pin 32, channel 4, invert=false
                pwm.attach(PUMP_PWM_B, 5, true);    //pin 33, channel 5, invert=true
                pwm.write(PUMP_PWM_A, 128, 60); 
                pwm.write(PUMP_PWM_B, 128, 60);
                pwm.resume(4); //Resume channel 4
                pwm.resume(5); //Resume channel 5
            } else if (runState) {
                ESP_LOGI(TAG,"Turning PWM OFF.");

                //Roundabout way - detach and reattach without inverted pin
                pwm.detach(PUMP_PWM_A);
                pwm.detach(PUMP_PWM_B);
                pwm.attach(PUMP_PWM_A, 4, false);
                pwm.attach(PUMP_PWM_B, 5, false);
                pwm.write(PUMP_PWM_A, 0, 60);
                pwm.write(PUMP_PWM_B, 0, 60);
                pwm.pause(4); //Pause channel 4
                pwm.pause(5); //Pause channel 5
            }
            runState = state;
        }
};