diff --git a/src/PTSolns_microWatt.cpp b/src/PTSolns_microWatt.cpp index 6eec17c..9084fce 100644 --- a/src/PTSolns_microWatt.cpp +++ b/src/PTSolns_microWatt.cpp @@ -1,5 +1,5 @@ // microWatt Support Library (mSL) -// Last Update: Oct 25, 2023 +// Last Update: Oct 27, 2023 // contact@PTSolns.com #include "PTSolns_microWatt.h" @@ -9,14 +9,20 @@ #include #include "Arduino.h" #include +#include +#include int flag_wire = 0; +int flag_fade = 0; +int flag_blinkWarning = 0; int SDA_pin_global = SDA_pin_default; int SCL_pin_global = SCL_pin_default; int mSL_code = 0; +int dutyCycle = 0; +int fade_inverter = 1; +unsigned long fade_timer; - -uint8_t microWatt::begin(int LED, int number_of_blink, int time_between_blink) { +uint8_t microWatt::begin(const int LED, int number_of_blink, int time_between_blink) { delay(1000); @@ -35,13 +41,14 @@ uint8_t microWatt::begin(int LED, int number_of_blink, int time_between_blink) { Serial.println(""); } Serial.println("Available commands:"); - Serial.println(" microWatt.begin(int LED = LED_buildIn, int number_of_blink = 4, int time_between_blink = 50)"); - Serial.println(" microWatt.blink(int LED = LED_buildIn, int number_of_blink = 4, int time_between_blink = 50)"); - Serial.println(" microWatt.setI2Cpins(int SDA_pin = SDA_pin_default, int SCL_pin = SCL_pin_default)"); + Serial.println(" microWatt.begin(const int LED = LED_buildIn, int number_of_blink = 4, int time_between_blink = 50)"); + Serial.println(" microWatt.blink(const int LED = LED_buildIn, int number_of_blink = 4, int time_between_blink = 50)"); + Serial.println(" microWatt.setI2Cpins(const int SDA_pin = SDA_pin_default, const int SCL_pin = SCL_pin_default)"); Serial.println(" microWatt.printI2Cpins()"); - Serial.println(" microWatt.I2Cscan(int SDA_pin_scan = SDA_pin_default, int SCL_pin_scan = SCL_pin_default)"); + Serial.println(" microWatt.I2Cscan(const int SDA_pin_scan = SDA_pin_default, const int SCL_pin_scan = SCL_pin_default)"); Serial.println(" microWatt.printSPIpins()"); Serial.println(" microWatt.printPinout()"); + Serial.println(" microWatt.fade(const int LED_pin = LED_buildIn, const int PWM_Channel = 0, const int PWM_freq = 500, const int PWM_res = 8, int fade_inc = 5, int time_step = 20)"); Serial.println(""); Serial.println("For further details visit: https://github.com/PTSolns/PTSolns_microWatt"); @@ -55,7 +62,8 @@ uint8_t microWatt::begin(int LED, int number_of_blink, int time_between_blink) { } -void microWatt::blink(int LED, int number_of_blink, int time_between_blink) { +void microWatt::blink(const int LED, int number_of_blink, int time_between_blink) { + pinMode(LED, OUTPUT); for (int i = 1; i <= number_of_blink; ++i) { @@ -67,36 +75,56 @@ void microWatt::blink(int LED, int number_of_blink, int time_between_blink) { } +void microWatt::blinkWarning() { + if (flag_blinkWarning == 0) { + flag_blinkWarning = 1; + pinMode(LED_buildIn, OUTPUT); + } + + for (int i = 1; i <= 10; ++i) { + digitalWrite(LED_buildIn, HIGH); + delay(30); + digitalWrite(LED_buildIn, LOW); + delay(30); + } + + delay(500); +} + + void microWatt::printPinout() { - Serial.println(" microWatt v1.2 PINOUT"); - Serial.println(" __________________________"); - Serial.println(" | | | |"); - Serial.println(" Vin | | | | Vin"); - Serial.println(" GND | | | | GND"); - Serial.println(" 3.3V | | ESP32 | | G22 -- SCL"); - Serial.println(" EN | | Module | | G21 -- SDA"); - Serial.println(" Input only -- SVP | | | | G23 -- COPI"); - Serial.println(" Input only -- SVN | | | | G19 -- CIPO"); - Serial.println(" Input only -- G34 | | | | G18 -- SCK"); - Serial.println(" Input only -- G35 | | | | G5 --- CS"); - Serial.println(" G32 | |______________________| | TX"); - Serial.println(" G33 | | RX"); - Serial.println(" GND | | GND"); - Serial.println(" G25 | | G17"); - Serial.println(" G26 | | G16"); - Serial.println(" G27 | | G4"); - Serial.println(" G14 | | G0"); - Serial.println(" G12 | | G2"); - Serial.println("Onboard LED -- G13 | | G15"); - Serial.println(" 3.3V | ________ | 3.3V"); - Serial.println(" GND | | | | GND"); - Serial.println(" Vusb | | USB-C | | Vusb"); - Serial.println(" |________|________|________|"); + Serial.println(" microWatt v1.1+ Pinout"); + Serial.println(" __________________________"); + Serial.println(" | | | |"); + Serial.println(" Vin--| | | |--Vin"); + Serial.println(" GND--| | | |--GND"); + Serial.println(" 3.3V--| | ESP32 | |~~G22 -- SCL"); + Serial.println(" EN--| | Module | |~~G21 -- SDA"); + Serial.println(" Input only -- SVP--| | | |~~G23 -- COPI"); + Serial.println(" Input only -- SVN--| | | |~~G19 -- CIPO"); + Serial.println(" Input only -- G34--| | | |~~G18 -- SCK"); + Serial.println(" Input only -- G35--| | | |~~G5 --- CS"); + Serial.println(" G32~~| |______________________| |~~TX"); + Serial.println(" G33~~| |~~RX"); + Serial.println(" GND--| |--GND"); + Serial.println(" G25~~| |~~G17"); + Serial.println(" G26~~| |~~G16"); + Serial.println(" G27~~| |~~G4"); + Serial.println(" G14~~| |~~G0"); + Serial.println(" G12~~| |~~G2"); + Serial.println("Onboard LED -- G13~~| |~~G15"); + Serial.println(" 3.3V--| ________ |--3.3V"); + Serial.println(" GND--| | | |--GND"); + Serial.println(" Vusb--| | USB-C | |--Vusb"); + Serial.println(" |________|________|________|"); + Serial.println(""); + Serial.println(" NOTE: Pins connected by symbol '~~' are PWM capable pins."); + Serial.println(" PWM_pins = {G0, G1, G3, G4, G5, G12, G13, G14, G15, G16, G17, G18, G19, G21, G22, G23, G25, G26, G27, G32, G33}"); Serial.println(""); } -void microWatt::callWire(int SDA_pin, int SCL_pin) { +void microWatt::callWire(const int SDA_pin, const int SCL_pin) { if (flag_wire == 0) { flag_wire = 1; if ((SDA_pin != SDA_pin_default) || (SCL_pin != SCL_pin_default)) { @@ -114,7 +142,7 @@ void microWatt::callWire(int SDA_pin, int SCL_pin) { } -uint8_t microWatt::setI2Cpins(int SDA_pin, int SCL_pin) { +uint8_t microWatt::setI2Cpins(const int SDA_pin, const int SCL_pin) { SDA_pin_global = SDA_pin; SCL_pin_global = SCL_pin; callWire(SDA_pin, SCL_pin); @@ -157,7 +185,7 @@ void microWatt::printSPIpins() { } -void microWatt::I2Cscan(int SDA_pin, int SCL_pin) { +void microWatt::I2Cscan(const int SDA_pin, const int SCL_pin) { byte error, address; int nDevices; @@ -210,3 +238,52 @@ void microWatt::I2Cscan(int SDA_pin, int SCL_pin) { delay(5000); } + + +void microWatt::fade(const int LED_pin, const int PWM_Channel, const int PWM_freq, const int PWM_res, int fade_inc, int time_step) { + + const int duty_max = (int)(pow(2, PWM_res) - 1); + bool found = false; + + // Call this only once at the beginning + if (flag_fade == 0) { + flag_fade = 1; + + std::list PWM_pins = {0, 1, 3, 4, 5, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33}; + + for (int pin : PWM_pins) { + if (LED_pin == pin) { + found = true; + break; + } + } + + // Forever while loop to print warning message and turn on warning blinkWarning pattern. + if (!found) { + delay(500); + while(1) { + Serial.println("WARNING!"); + Serial.print(" LED_pin = G"); + Serial.print(LED_pin); + Serial.println(" input in .fade() is not allowed. Please choose a PWM pin from the following list: "); + Serial.println(" PWM_pins = {G0, G1, G3, G4, G5, G12, G13, G14, G15, G16, G17, G18, G19, G21, G22, G23, G25, G26, G27, G32, G33}"); + Serial.println(" Program stuck in a forever loop ..."); + Serial.println(""); + + blinkWarning(); + } + } + ledcSetup(PWM_Channel, PWM_freq, PWM_res); + ledcAttachPin(LED_pin, PWM_Channel); + } + + if ((millis() - fade_timer) >= time_step) { + fade_timer = millis(); + dutyCycle = dutyCycle + fade_inverter*fade_inc; + ledcWrite(PWM_Channel, dutyCycle); + + if ((dutyCycle <= 0) || (dutyCycle >= duty_max)) { + fade_inverter = -fade_inverter; + } + } +}