123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- /*
- PD Power Supply
- Author:
- This is the firmware for the PD power supply
- that reads the voltage and current of the supply and display the
- power information on the SSD1306 OLED display.
- This firmware is designed for CH552G with CH55xduino board definations
- Recommend config
- 24Mhz (Internal), 5V
- */
- #include <Serial.h>
- /* Hardware Definations */
- #define CURRENT_PIN 14 //0 - 5A
- #define VOLTAGE_PIN 32 //0 - 20V
- #define CCCV_PIN 15 //CC = LOW, CV = HIGH
- #define OLED_SCL 30
- #define OLED_SDA 31
- /* Global Variables */
- uint16_t voltageReading;
- uint16_t currentReading;
- bool isCCMode;
- /* Function Prototypes */
- void setupOLED();
- void initializeOLED();
- void clearScreen();
- void PS_Screen(uint16_t, uint16_t, bool);
- void setup() {
- //Disable internal pull-up resistors for input pins
- pinMode(CURRENT_PIN, INPUT);
- pinMode(VOLTAGE_PIN, INPUT);
- pinMode(CCCV_PIN, INPUT);
- // Initialize I2C pins for OLED
- setupOLED();
- initializeOLED();
- //Clear the OLED screen
- clearScreen();
- }
- void loop() {
- //Read the analog reading of both pins
- voltageReading = analogRead(VOLTAGE_PIN);
- currentReading = analogRead(CURRENT_PIN);
- isCCMode = !digitalRead(CCCV_PIN);
- //Convert them to actual voltage / current value
- voltageReading = map(voltageReading, 0, 255, 0, 500) * 4; //30k - 10k voltage divider
- currentReading = (2.5 - (currentReading * (5.0 / 255)) )/0.185; //Max range 0 to 5A
- //Cap the range of digits to make sure it won't overflow
- voltageReading = min(voltageReading, 9999);
- currentReading = min(currentReading, 999);
- //Print result on USB Serial
- USBSerial_print(((float)voltageReading/100));
- USBSerial_print(",");
- USBSerial_println(((float)currentReading/100));
-
- //Update OLED display
- PS_Screen(voltageReading, currentReading, isCCMode);
- }
|