Adjustable voltage source from QuickCharge 3.0 (W/simulation)

I saw Hacking Qualcomm Quick Charge 3.0 - #9 by shaladrer and thought it might work well for a couple small motor projects.

Here's my rats-nest wiring and schematic:

It's basically this:

...with an extra 47K:10K voltage divider to bring the possible 20V Vbus ouput down to Nano ADC levels.

My code:

// QuickCharge 3.0 demo
// Use the library from https://github.com/vdeconinck/QC3Control/blob/master/src/QC3Control.cpp
// to control a Quick Charge power controller
// Copied the QC3Control.h and QC3Control.cpp to this Wokwi
//
// Should control QuickCharge/FastCharge power block
// https://en.wikipedia.org/wiki/Quick_Charge
// See https://forum.arduino.cc/t/hacking-qualcomm-quick-charge-3-0/906880/11
// for a prototype

// The resistors aren't electronically simulated in Wokwi, but per the library's
// diagram, they form voltage dividers to control the D+ and D- voltages on
// a QC2/QC3 charger's data lines.

#include "QC3Control.h" // quotes for local files in Wokwi

//Pin 4 for Data+ 470R to VCC+10K+1K5+GND
//Pin 5 for Data- 470R to VCC+10K+1K5+GND
//See How to connect in the documentation for more details.
QC3Control quickCharge(4, 5);

float Vcc = 5;
float Vbus = 0;

void printMVolts() {
  Vcc = readVcc() / 1000.0;
  Serial.print(quickCharge.getMilliVoltage());
  Serial.print("mV, D-: ");
  Serial.print((analogRead(A0) + 0.5) * Vcc / 1023);
  Serial.print("V, D+: ");
  Serial.print((analogRead(A1) + 0.5) * Vcc / 1023);
  Serial.print("V, VBus: ");
  Serial.print(Vbus = (analogRead(A2) + 0.5) / 1023.0 * Vcc * (46.29 + 9.89) / 9.89 ); //
  Serial.print("V, Vcc=");
  Serial.print(Vcc); //
  Serial.println("V ");
}

long readVcc() {
  long result;
  byte ADMUXsave = ADMUX;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA, ADSC));
  result = ADCL;
  result |= ADCH << 8;
  ADMUX = ADMUXsave;
  result = 1126400L / result; // Back-calculate AVcc in mV
  //Serial.println(result);
  return result;
}


void setup() {
  Vcc = readVcc() / 1000.0;
  quickCharge.begin();

  Serial.begin(115200);
  //set voltage to 12V

  quickCharge.set5V();
  //delay(5000);
  //quickCharge.set12V();
  printMVolts();
  delay(5000);
}

void demoModes(void) {
  const int interval = 1000;
  static unsigned long last = 0;
  static int mode = 0;
  static int ii = 0;
  unsigned long now = millis();
  if (now - last > interval) {
    if (now - last > 4 * interval) {
      last = now ;
    }
    else {
      last += interval;
    }
    Serial.print("Mode ");
    Serial.print(mode);
    Serial.print(": ");
    printMVolts();
    switch (mode) {
      case 0:
        quickCharge.set5V();
        mode++;
        break;
      case 1:
        quickCharge.set9V();
        mode++;
        break;
      case 2:
        quickCharge.set12V();
        mode++;
        break;
      case 3:
        quickCharge.setMilliVoltage(3200);
        mode++;
        break;
      case 4:
        quickCharge.setMilliVoltage(12000);
        mode++;
        break;
      case 5:  // decrementing 0.2v/step
        if (ii < 50) {
          ii++;
          quickCharge.decrementVoltage();
        }
        else
        {
          mode++;
          //ii = 60; //override
        }
        break;
      case 6:
        if (ii > 0) {
          ii--;
          quickCharge.incrementVoltage();
        }
        else
        {
          mode++;
        }
        break;
      case 7:
        quickCharge.set5V();
        mode = 0;
        break;
      default:
        mode = 0;
        break;
    }
  }
}

// loopCounter from https://forum.arduino.cc/t/while-loop-as-a-condition-for-limit-switches/963899/11
void LoopCounter() // tells the average response speed of void loop()
{ // inside a function, static variables keep their value from run to run
  const unsigned long microsInOneSecond = 1000000UL;
  static unsigned long count, countStartMicros; // only this function sees these

  count++; // adds 1 to count after any use in an expression, here it just adds 1.
  if ( micros() - countStartMicros >= microsInOneSecond ) // 1 second
  {
    countStartMicros += microsInOneSecond; // for a regular second
    Serial.println( count ); // 32-bit binary into decimal text = many micros
    count = 0; // don't forget to reset the counter
  }
}

void loop() {
  //And you can change it on the fly
  demoModes();
  //LoopCounter();
}

Simulated on Wokwi: QuickChargeControl.ino - Wokwi Arduino and ESP32 Simulator

And the output from my Nano:

5000mV, D-: 0.62V, D+: 0.16V, VBus: 11.97V, Vcc=4.75V 
Mode 0: 5000mV, D-: 0.62V, D+: 0.16V, VBus: 5.24V, Vcc=4.75V 
Mode 1: 5000mV, D-: 0.62V, D+: 0.16V, VBus: 5.24V, Vcc=4.75V 
Mode 2: 9000mV, D-: 3.60V, D+: 0.56V, VBus: 9.42V, Vcc=4.73V 
Mode 3: 12000mV, D-: 0.62V, D+: 0.58V, VBus: 12.60V, Vcc=4.75V 
Mode 4: 3600mV, D-: 0.62V, D+: 3.56V, VBus: 3.89V, Vcc=4.75V 
Mode 5: 12000mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V 
Mode 5: 11800mV, D-: 0.61V, D+: 3.54V, VBus: 12.31V, Vcc=4.73V 
Mode 5: 11600mV, D-: 0.61V, D+: 3.55V, VBus: 12.10V, Vcc=4.73V 
Mode 5: 11400mV, D-: 0.61V, D+: 3.54V, VBus: 11.92V, Vcc=4.73V 
Mode 5: 11200mV, D-: 0.61V, D+: 3.54V, VBus: 11.73V, Vcc=4.73V 
Mode 5: 11000mV, D-: 0.62V, D+: 3.56V, VBus: 11.57V, Vcc=4.75V 
Mode 5: 10800mV, D-: 0.61V, D+: 3.55V, VBus: 11.31V, Vcc=4.73V 
Mode 5: 10600mV, D-: 0.61V, D+: 3.55V, VBus: 11.10V, Vcc=4.73V 
Mode 5: 10400mV, D-: 0.61V, D+: 3.54V, VBus: 10.89V, Vcc=4.73V 
Mode 5: 10200mV, D-: 0.61V, D+: 3.54V, VBus: 10.68V, Vcc=4.73V 
Mode 5: 10000mV, D-: 0.62V, D+: 3.54V, VBus: 10.50V, Vcc=4.73V 
Mode 5: 9800mV, D-: 0.61V, D+: 3.55V, VBus: 10.23V, Vcc=4.73V 
Mode 5: 9600mV, D-: 0.61V, D+: 3.54V, VBus: 10.02V, Vcc=4.73V 
Mode 5: 9400mV, D-: 0.61V, D+: 3.54V, VBus: 9.84V, Vcc=4.73V 
Mode 5: 9200mV, D-: 0.61V, D+: 3.54V, VBus: 9.63V, Vcc=4.73V 
Mode 5: 9000mV, D-: 0.61V, D+: 3.55V, VBus: 9.39V, Vcc=4.73V 
Mode 5: 8800mV, D-: 0.61V, D+: 3.55V, VBus: 9.21V, Vcc=4.73V 
Mode 5: 8600mV, D-: 0.61V, D+: 3.54V, VBus: 9.00V, Vcc=4.73V 
Mode 5: 8400mV, D-: 0.61V, D+: 3.55V, VBus: 8.79V, Vcc=4.73V 
Mode 5: 8200mV, D-: 0.61V, D+: 3.54V, VBus: 8.58V, Vcc=4.73V 
Mode 5: 8000mV, D-: 0.61V, D+: 3.54V, VBus: 8.37V, Vcc=4.73V 
Mode 5: 7800mV, D-: 0.61V, D+: 3.54V, VBus: 8.16V, Vcc=4.73V 
Mode 5: 7600mV, D-: 0.61V, D+: 3.54V, VBus: 7.95V, Vcc=4.73V 
Mode 5: 7400mV, D-: 0.61V, D+: 3.54V, VBus: 7.71V, Vcc=4.73V 
Mode 5: 7200mV, D-: 0.61V, D+: 3.55V, VBus: 7.55V, Vcc=4.73V 
Mode 5: 7000mV, D-: 0.61V, D+: 3.55V, VBus: 7.32V, Vcc=4.73V 
Mode 5: 6800mV, D-: 0.61V, D+: 3.55V, VBus: 7.11V, Vcc=4.73V 
Mode 5: 6600mV, D-: 0.61V, D+: 3.54V, VBus: 6.90V, Vcc=4.73V 
Mode 5: 6400mV, D-: 0.62V, D+: 3.56V, VBus: 6.72V, Vcc=4.75V 
Mode 5: 6200mV, D-: 0.62V, D+: 3.56V, VBus: 6.50V, Vcc=4.75V 
Mode 5: 6000mV, D-: 0.61V, D+: 3.55V, VBus: 6.27V, Vcc=4.73V 
Mode 5: 5800mV, D-: 0.62V, D+: 3.56V, VBus: 6.08V, Vcc=4.75V 
Mode 5: 5600mV, D-: 0.62V, D+: 3.56V, VBus: 5.87V, Vcc=4.75V 
Mode 5: 5400mV, D-: 0.61V, D+: 3.54V, VBus: 5.66V, Vcc=4.73V 
Mode 5: 5200mV, D-: 0.61V, D+: 3.54V, VBus: 5.45V, Vcc=4.73V 
Mode 5: 5000mV, D-: 0.61V, D+: 3.55V, VBus: 5.22V, Vcc=4.73V 
Mode 5: 4800mV, D-: 0.61V, D+: 3.55V, VBus: 5.01V, Vcc=4.73V 
Mode 5: 4600mV, D-: 0.61V, D+: 3.54V, VBus: 4.80V, Vcc=4.73V 
Mode 5: 4400mV, D-: 0.61V, D+: 3.54V, VBus: 4.56V, Vcc=4.73V 
Mode 5: 4200mV, D-: 0.62V, D+: 3.56V, VBus: 4.39V, Vcc=4.75V 
Mode 5: 4000mV, D-: 0.61V, D+: 3.54V, VBus: 4.16V, Vcc=4.73V 
Mode 5: 3800mV, D-: 0.61V, D+: 3.54V, VBus: 3.95V, Vcc=4.73V 
Mode 5: 3600mV, D-: 0.61V, D+: 3.54V, VBus: 3.88V, Vcc=4.73V 
Mode 5: 3400mV, D-: 0.61V, D+: 3.55V, VBus: 3.90V, Vcc=4.73V 
Mode 5: 3200mV, D-: 0.62V, D+: 3.56V, VBus: 3.89V, Vcc=4.75V 
Mode 5: 3000mV, D-: 0.61V, D+: 3.55V, VBus: 3.90V, Vcc=4.73V 
Mode 5: 2800mV, D-: 0.61V, D+: 3.54V, VBus: 3.88V, Vcc=4.73V 
Mode 5: 2600mV, D-: 0.61V, D+: 3.54V, VBus: 3.90V, Vcc=4.73V 
Mode 5: 2400mV, D-: 0.62V, D+: 3.56V, VBus: 3.89V, Vcc=4.75V 
Mode 5: 2200mV, D-: 0.62V, D+: 3.56V, VBus: 3.89V, Vcc=4.75V 
Mode 5: 2000mV, D-: 0.61V, D+: 3.55V, VBus: 3.88V, Vcc=4.73V 
Mode 6: 2000mV, D-: 0.61V, D+: 3.55V, VBus: 3.90V, Vcc=4.73V 
Mode 6: 2200mV, D-: 0.61V, D+: 3.54V, VBus: 3.98V, Vcc=4.73V 
Mode 6: 2400mV, D-: 0.62V, D+: 3.56V, VBus: 4.16V, Vcc=4.75V 
Mode 6: 2600mV, D-: 0.61V, D+: 3.55V, VBus: 4.37V, Vcc=4.73V 
Mode 6: 2800mV, D-: 0.61V, D+: 3.54V, VBus: 4.59V, Vcc=4.73V 
Mode 6: 3000mV, D-: 0.61V, D+: 3.54V, VBus: 4.80V, Vcc=4.73V 
Mode 6: 3200mV, D-: 0.62V, D+: 3.56V, VBus: 5.03V, Vcc=4.75V 
Mode 6: 3400mV, D-: 0.61V, D+: 3.54V, VBus: 5.24V, Vcc=4.73V 
Mode 6: 3600mV, D-: 0.61V, D+: 3.54V, VBus: 5.45V, Vcc=4.73V 
Mode 6: 3800mV, D-: 0.62V, D+: 3.56V, VBus: 5.69V, Vcc=4.75V 
Mode 6: 4000mV, D-: 0.61V, D+: 3.55V, VBus: 5.85V, Vcc=4.73V 
Mode 6: 4200mV, D-: 0.62V, D+: 3.56V, VBus: 6.08V, Vcc=4.75V 
Mode 6: 4400mV, D-: 0.61V, D+: 3.54V, VBus: 6.27V, Vcc=4.73V 
Mode 6: 4600mV, D-: 0.62V, D+: 3.56V, VBus: 6.48V, Vcc=4.75V 
Mode 6: 4800mV, D-: 0.62V, D+: 3.56V, VBus: 6.69V, Vcc=4.75V 
Mode 6: 5000mV, D-: 0.61V, D+: 3.55V, VBus: 6.90V, Vcc=4.73V 
Mode 6: 5200mV, D-: 0.62V, D+: 3.56V, VBus: 7.16V, Vcc=4.75V 
Mode 6: 5400mV, D-: 0.61V, D+: 3.54V, VBus: 7.32V, Vcc=4.73V 
Mode 6: 5600mV, D-: 0.62V, D+: 3.56V, VBus: 7.56V, Vcc=4.75V 
Mode 6: 5800mV, D-: 0.62V, D+: 3.56V, VBus: 7.74V, Vcc=4.75V 
Mode 6: 6000mV, D-: 0.61V, D+: 3.55V, VBus: 7.92V, Vcc=4.73V 
Mode 6: 6200mV, D-: 0.62V, D+: 3.56V, VBus: 8.17V, Vcc=4.75V 
Mode 6: 6400mV, D-: 0.61V, D+: 3.55V, VBus: 8.37V, Vcc=4.73V 
Mode 6: 6600mV, D-: 0.61V, D+: 3.55V, VBus: 8.58V, Vcc=4.73V 
Mode 6: 6800mV, D-: 0.62V, D+: 3.56V, VBus: 8.83V, Vcc=4.75V 
Mode 6: 7000mV, D-: 0.62V, D+: 3.56V, VBus: 9.01V, Vcc=4.75V 
Mode 6: 7200mV, D-: 0.62V, D+: 3.56V, VBus: 9.22V, Vcc=4.75V 
Mode 6: 7400mV, D-: 0.62V, D+: 3.56V, VBus: 9.43V, Vcc=4.75V 
Mode 6: 7600mV, D-: 0.62V, D+: 3.56V, VBus: 9.70V, Vcc=4.75V 
Mode 6: 7800mV, D-: 0.61V, D+: 3.55V, VBus: 9.81V, Vcc=4.73V 
Mode 6: 8000mV, D-: 0.61V, D+: 3.55V, VBus: 10.05V, Vcc=4.73V 
Mode 6: 8200mV, D-: 0.61V, D+: 3.55V, VBus: 10.26V, Vcc=4.73V 
Mode 6: 8400mV, D-: 0.61V, D+: 3.55V, VBus: 10.47V, Vcc=4.73V 
Mode 6: 8600mV, D-: 0.61V, D+: 3.54V, VBus: 10.71V, Vcc=4.73V 
Mode 6: 8800mV, D-: 0.62V, D+: 3.56V, VBus: 10.94V, Vcc=4.75V 
Mode 6: 9000mV, D-: 0.61V, D+: 3.55V, VBus: 11.08V, Vcc=4.73V 
Mode 6: 9200mV, D-: 0.60V, D+: 3.54V, VBus: 11.31V, Vcc=4.73V 
Mode 6: 9400mV, D-: 0.62V, D+: 3.56V, VBus: 11.54V, Vcc=4.75V 
Mode 6: 9600mV, D-: 0.61V, D+: 3.55V, VBus: 11.73V, Vcc=4.73V 
Mode 6: 9800mV, D-: 0.61V, D+: 3.54V, VBus: 11.92V, Vcc=4.73V 
Mode 6: 10000mV, D-: 0.62V, D+: 3.56V, VBus: 12.18V, Vcc=4.75V 
Mode 6: 10200mV, D-: 0.62V, D+: 3.54V, VBus: 12.36V, Vcc=4.73V 
Mode 6: 10400mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V 
Mode 6: 10600mV, D-: 0.62V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V 
Mode 6: 10800mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V 
Mode 6: 11000mV, D-: 0.62V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V 
Mode 6: 11200mV, D-: 0.62V, D+: 3.56V, VBus: 12.60V, Vcc=4.75V 
Mode 6: 11400mV, D-: 0.61V, D+: 3.55V, VBus: 12.57V, Vcc=4.73V 
Mode 6: 11600mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V 
Mode 6: 11800mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V 
Mode 6: 12000mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V 
Mode 7: 12000mV, D-: 0.62V, D+: 3.54V, VBus: 12.57V, Vcc=4.73V 
Mode 0: 5000mV, D-: 0.61V, D+: 0.16V, VBus: 5.24V, Vcc=4.75V 
Mode 1: 5000mV, D-: 0.62V, D+: 0.16V, VBus: 5.24V, Vcc=4.75V 
Mode 2: 9000mV, D-: 3.61V, D+: 0.58V, VBus: 9.42V, Vcc=4.73V 
Mode 3: 12000mV, D-: 0.62V, D+: 0.58V, VBus: 12.57V, Vcc=4.75V 
Mode 4: 3600mV, D-: 0.62V, D+: 3.56V, VBus: 3.89V, Vcc=4.75V 

With a Motorola TurboPower25 brick, it only did the 5,9,12V settings and the others modes didn't work. But with a new $5 18W "Quick Charger 3.0 Wall Charger" I got a 3.9-12.5V range, controllable and readable by the Nano.

Anybody have good/bad experiences using a QuickCharge as an adjustable voltage source?

I updated the WokWi simulation to simulate the voltage dividers and analogReads:

// QuickCharge 3.0 demo
// Use the library from https://github.com/vdeconinck/QC3Control/blob/master/src/QC3Control.cpp
// to control a Quick Charge power controller
// Copied the QC3Control.h and QC3Control.cpp to this Wokwi
//
// Should control QuickCharge/FastCharge power block
// https://en.wikipedia.org/wiki/Quick_Charge
// See https://forum.arduino.cc/t/hacking-qualcomm-quick-charge-3-0/906880/11
// for a prototype

// The resistors aren't electronically simulated in Wokwi, but per the library's
// diagram, they form voltage dividers to control the D+ and D- voltages on
// a QC2/QC3 charger's data lines.  This is simulated here with wokwiSim().
//
// DaveX 2022-03-06 CC BY-SA
// See https://forum.arduino.cc/t/quickcharge-3-0-as-adjustable-voltage-source/966276
// for discussion

const bool inWokwi = true;

#include "QC3Control.h" // quotes for local files in Wokwi

//
// External Connections: 
// A0 to D- on QC3
// A1 to D+ on QC3
// Vin is simulating Vbus on the QC3.  In real life, disconnect this.
// 
//Pin 4 for Data+ 470R to VCC+10K+1K5+GND
//Pin 5 for Data- 470R to VCC+10K+1K5+GND
//See How to connect in the documentation for more details.
QC3Control quickCharge(4, 5);

float Vcc = 5;
float Vbus = 0;

float simVbus = 0;
int simA0, simA1, simA2;

void wokwiSim(void){
  // Simulate the the QC3 device and voltage dividers on WokWi
  const float r10kP470 = 1/(1.0/10000+1.0/470); // 10K || 470
  const float r1k5P470 = 1/(1.0/1500+1.0/470);  // 1K5 || 470
  
  simVbus = constrain(quickCharge.getMilliVoltage(),3900,12600)/1000.0; 
  simA0 = 1024.0*(digitalRead(5) ? (1500/(r10kP470+1500)) : (r1k5P470/(r1k5P470+10000)) );
  simA1 = 1024.0*(digitalRead(4) ? (1500/(r10kP470+1500)) : (r1k5P470/(r1k5P470+10000)) );
  simA2 = 1024.0*simVbus*10000/(10000.0+47000)/Vcc;
}

void printMVolts() {
  int rA0 = analogRead(A0);
  int rA1 = analogRead(A1);
  int rA2 = analogRead(A2);
  if(inWokwi){ // override the analogRead on WokWi with simulated values
    wokwiSim();
    rA0 = simA0;
    rA1 = simA1;
    rA2 = simA2;
  }

  Vcc = readVcc() / 1000.0;
  Serial.print(quickCharge.getMilliVoltage());
  Serial.print("mV, D-: ");
  Serial.print((rA0 + 0.5) * Vcc / 1024);
  Serial.print("V, D+: ");
  Serial.print((rA1 + 0.5) * Vcc / 1024);
  Serial.print("V, VBus: ");
  Serial.print(Vbus = (rA2 + 0.5) / 1024.0 * Vcc * (46.29 + 9.89) / 9.89 ); //
  Serial.print("V, Vcc=");
  Serial.print(Vcc); //
  Serial.println("V ");
}

long readVcc() {
  // https://forum.arduino.cc/t/how-to-know-vcc-voltage-in-arduino/344001/3
  long result;
  byte ADMUXsave = ADMUX;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA, ADSC));
  result = ADCL;
  result |= ADCH << 8;
  ADMUX = ADMUXsave;
  result = 1126400L / result; // Back-calculate AVcc in mV
  //Serial.println(result);
  return result;
}


void setup() {
  Vcc = readVcc() / 1000.0;
  quickCharge.begin();

  Serial.begin(115200);
  //set voltage to 12V

  quickCharge.set5V();
  //delay(5000);
  //quickCharge.set12V();
  Serial.print("QuickChargeControl.ino -- Control a QuickCharge3\n"
  "3.9-12V variable power supply with an Arduino.\n"
  "Setup: ");
  printMVolts();
  delay(5000);
}

void demoModes(void) {
  const int interval = 1000;
  static unsigned long last = 0;
  static int mode = 0;
  static int ii = 0;
  unsigned long now = millis();
  if (now - last > interval) {
    if (now - last > 4 * interval) {
      last = now ;
    }
    else {
      last += interval;
    }
    Serial.print("Mode ");
    Serial.print(mode);
    Serial.print(": ");
    printMVolts();
    switch (mode) {
      case 0:
        quickCharge.set5V();
        mode++;
        break;
      case 1:
        quickCharge.set9V();
        mode++;
        break;
      case 2:
        quickCharge.set12V();
        mode++;
        break;
      case 3:
        quickCharge.setMilliVoltage(3200);
        mode++;
        break;
      case 4:
        quickCharge.setMilliVoltage(12000);
        mode++;
        break;
      case 5:  // decrementing 0.2v/step
        if (ii < 50) {
          ii++;
          quickCharge.decrementVoltage();
        }
        else
        {
          mode++;
          //ii = 60; //override
        }
        break;
      case 6:
        if (ii > 0) {
          ii--;
          quickCharge.incrementVoltage();
        }
        else
        {
          mode++;
        }
        break;
      case 7:
        quickCharge.set5V();
        mode = 0;
        break;
      default:
        mode = 0;
        break;
    }
  }
}

// loopCounter from https://forum.arduino.cc/t/while-loop-as-a-condition-for-limit-switches/963899/11
void LoopCounter() // tells the average response speed of void loop()
{ // inside a function, static variables keep their value from run to run
  const unsigned long microsInOneSecond = 1000000UL;
  static unsigned long count, countStartMicros; // only this function sees these

  count++; // adds 1 to count after any use in an expression, here it just adds 1.
  if ( micros() - countStartMicros >= microsInOneSecond ) // 1 second
  {
    countStartMicros += microsInOneSecond; // for a regular second
    Serial.println( count ); // 32-bit binary into decimal text = many micros
    count = 0; // don't forget to reset the counter
  }
}


void loop() {
  //And you can change it on the fly
  demoModes();
  //LoopCounter();
}

Wokwi output:

QuickChargeControl.ino -- Control a QuickCharge3
3.9-12V variable power supply with an Arduino.
Setup: 5000mV, D-: 0.17V, D+: 0.17V, VBus: 4.98V, Vcc=5.01V 
Mode 0: 5000mV, D-: 0.17V, D+: 0.17V, VBus: 4.98V, Vcc=5.01V 
Mode 1: 5000mV, D-: 0.17V, D+: 0.17V, VBus: 4.98V, Vcc=5.01V 
Mode 2: 9000mV, D-: 3.85V, D+: 3.85V, VBus: 8.96V, Vcc=5.01V 
Mode 3: 12000mV, D-: 3.85V, D+: 3.85V, VBus: 11.95V, Vcc=5.01V 
Mode 4: 3600mV, D-: 3.85V, D+: 3.85V, VBus: 3.87V, Vcc=5.01V 
Mode 5: 12000mV, D-: 3.85V, D+: 0.17V, VBus: 11.95V, Vcc=5.01V 
Mode 5: 11800mV, D-: 3.85V, D+: 0.17V, VBus: 11.76V, Vcc=5.01V 
Mode 5: 11600mV, D-: 3.85V, D+: 0.17V, VBus: 11.57V, Vcc=5.01V 
Mode 5: 11400mV, D-: 3.85V, D+: 0.17V, VBus: 11.37V, Vcc=5.01V 
Mode 5: 11200mV, D-: 3.85V, D+: 0.17V, VBus: 11.15V, Vcc=5.01V 
Mode 5: 11000mV, D-: 3.85V, D+: 0.17V, VBus: 10.96V, Vcc=5.01V 
Mode 5: 10800mV, D-: 3.85V, D+: 0.17V, VBus: 10.76V, Vcc=5.01V 
Mode 5: 10600mV, D-: 3.85V, D+: 0.17V, VBus: 10.57V, Vcc=5.01V 
Mode 5: 10400mV, D-: 3.85V, D+: 0.17V, VBus: 10.37V, Vcc=5.01V 
Mode 5: 10200mV, D-: 3.85V, D+: 0.17V, VBus: 10.18V, Vcc=5.01V 
Mode 5: 10000mV, D-: 3.85V, D+: 0.17V, VBus: 9.96V, Vcc=5.01V 
Mode 5: 9800mV, D-: 3.85V, D+: 0.17V, VBus: 9.76V, Vcc=5.01V 
Mode 5: 9600mV, D-: 3.85V, D+: 0.17V, VBus: 9.57V, Vcc=5.01V 
Mode 5: 9400mV, D-: 3.85V, D+: 0.17V, VBus: 9.37V, Vcc=5.01V 
Mode 5: 9200mV, D-: 3.85V, D+: 0.17V, VBus: 9.18V, Vcc=5.01V 
Mode 5: 9000mV, D-: 3.85V, D+: 0.17V, VBus: 8.96V, Vcc=5.01V 
Mode 5: 8800mV, D-: 3.85V, D+: 0.17V, VBus: 8.76V, Vcc=5.01V 
Mode 5: 8600mV, D-: 3.85V, D+: 0.17V, VBus: 8.57V, Vcc=5.01V 
Mode 5: 8400mV, D-: 3.85V, D+: 0.17V, VBus: 8.37V, Vcc=5.01V 
Mode 5: 8200mV, D-: 3.85V, D+: 0.17V, VBus: 8.18V, Vcc=5.01V 
Mode 5: 8000mV, D-: 3.85V, D+: 0.17V, VBus: 7.98V, Vcc=5.01V 
Mode 5: 7800mV, D-: 3.85V, D+: 0.17V, VBus: 7.76V, Vcc=5.01V 
Mode 5: 7600mV, D-: 3.85V, D+: 0.17V, VBus: 7.57V, Vcc=5.01V 
Mode 5: 7400mV, D-: 3.85V, D+: 0.17V, VBus: 7.37V, Vcc=5.01V 
Mode 5: 7200mV, D-: 3.85V, D+: 0.17V, VBus: 7.18V, Vcc=5.01V 
Mode 5: 7000mV, D-: 3.85V, D+: 0.17V, VBus: 6.98V, Vcc=5.01V 
Mode 5: 6800mV, D-: 3.85V, D+: 0.17V, VBus: 6.79V, Vcc=5.01V 
Mode 5: 6600mV, D-: 3.85V, D+: 0.17V, VBus: 6.57V, Vcc=5.01V 
Mode 5: 6400mV, D-: 3.85V, D+: 0.17V, VBus: 6.37V, Vcc=5.01V 
Mode 5: 6200mV, D-: 3.85V, D+: 0.17V, VBus: 6.18V, Vcc=5.01V 
Mode 5: 6000mV, D-: 3.85V, D+: 0.17V, VBus: 5.98V, Vcc=5.01V 
Mode 5: 5800mV, D-: 3.85V, D+: 0.17V, VBus: 5.79V, Vcc=5.01V 
Mode 5: 5600mV, D-: 3.85V, D+: 0.17V, VBus: 5.57V, Vcc=5.01V 
Mode 5: 5400mV, D-: 3.85V, D+: 0.17V, VBus: 5.37V, Vcc=5.01V 
Mode 5: 5200mV, D-: 3.85V, D+: 0.17V, VBus: 5.18V, Vcc=5.01V 
Mode 5: 5000mV, D-: 3.85V, D+: 0.17V, VBus: 4.98V, Vcc=5.01V 
Mode 5: 4800mV, D-: 3.85V, D+: 0.17V, VBus: 4.79V, Vcc=5.01V 
Mode 5: 4600mV, D-: 3.85V, D+: 0.17V, VBus: 4.60V, Vcc=5.01V 
Mode 5: 4400mV, D-: 3.85V, D+: 0.17V, VBus: 4.37V, Vcc=5.01V 
Mode 5: 4200mV, D-: 3.85V, D+: 0.17V, VBus: 4.18V, Vcc=5.01V 
Mode 5: 4000mV, D-: 3.85V, D+: 0.17V, VBus: 3.98V, Vcc=5.01V 
Mode 5: 3800mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 5: 3600mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 5: 3400mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 5: 3200mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 5: 3000mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 5: 2800mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 5: 2600mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 5: 2400mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 5: 2200mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 5: 2000mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 2000mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 2200mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 2400mV, D-: 3.85V, D+: 3.85V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 2600mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 2800mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 3000mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 3200mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 3400mV, D-: 3.85V, D+: 0.17V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 3600mV, D-: 3.85V, D+: 3.85V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 3800mV, D-: 3.85V, D+: 3.85V, VBus: 3.87V, Vcc=5.01V 
Mode 6: 4000mV, D-: 3.85V, D+: 0.17V, VBus: 3.98V, Vcc=5.01V 
Mode 6: 4200mV, D-: 3.85V, D+: 0.17V, VBus: 4.18V, Vcc=5.01V 
Mode 6: 4400mV, D-: 3.85V, D+: 3.85V, VBus: 4.37V, Vcc=5.01V 
Mode 6: 4600mV, D-: 3.85V, D+: 3.85V, VBus: 4.60V, Vcc=5.01V 
Mode 6: 4800mV, D-: 3.85V, D+: 0.17V, VBus: 4.79V, Vcc=5.01V 
Mode 6: 5000mV, D-: 3.85V, D+: 3.85V, VBus: 4.98V, Vcc=5.01V 
Mode 6: 5200mV, D-: 3.85V, D+: 0.17V, VBus: 5.18V, Vcc=5.01V 
Mode 6: 5400mV, D-: 3.85V, D+: 3.85V, VBus: 5.37V, Vcc=5.01V 
Mode 6: 5600mV, D-: 3.85V, D+: 0.17V, VBus: 5.57V, Vcc=5.01V 
Mode 6: 5800mV, D-: 3.85V, D+: 0.17V, VBus: 5.79V, Vcc=5.01V 
Mode 6: 6000mV, D-: 3.85V, D+: 0.17V, VBus: 5.98V, Vcc=5.01V 
Mode 6: 6200mV, D-: 3.85V, D+: 3.85V, VBus: 6.18V, Vcc=5.01V 
Mode 6: 6400mV, D-: 3.85V, D+: 0.17V, VBus: 6.37V, Vcc=5.01V 
Mode 6: 6600mV, D-: 3.85V, D+: 0.17V, VBus: 6.57V, Vcc=5.01V 
Mode 6: 6800mV, D-: 3.85V, D+: 3.85V, VBus: 6.79V, Vcc=5.01V 
Mode 6: 7000mV, D-: 3.85V, D+: 3.85V, VBus: 6.98V, Vcc=5.01V 
Mode 6: 7200mV, D-: 3.85V, D+: 0.17V, VBus: 7.18V, Vcc=5.01V 
Mode 6: 7400mV, D-: 3.85V, D+: 3.85V, VBus: 7.37V, Vcc=5.01V 
Mode 6: 7600mV, D-: 3.85V, D+: 3.85V, VBus: 7.57V, Vcc=5.01V 
Mode 6: 7800mV, D-: 3.85V, D+: 0.17V, VBus: 7.76V, Vcc=5.01V 
Mode 6: 8000mV, D-: 3.85V, D+: 0.17V, VBus: 7.98V, Vcc=5.01V 
Mode 6: 8200mV, D-: 3.85V, D+: 3.85V, VBus: 8.18V, Vcc=5.01V 
Mode 6: 8400mV, D-: 3.85V, D+: 3.85V, VBus: 8.37V, Vcc=5.01V 
Mode 6: 8600mV, D-: 3.85V, D+: 0.17V, VBus: 8.57V, Vcc=5.01V 
Mode 6: 8800mV, D-: 3.85V, D+: 3.85V, VBus: 8.76V, Vcc=5.01V 
Mode 6: 9000mV, D-: 3.85V, D+: 0.17V, VBus: 8.96V, Vcc=5.01V 
Mode 6: 9200mV, D-: 3.85V, D+: 3.85V, VBus: 9.18V, Vcc=5.01V 
Mode 6: 9400mV, D-: 3.85V, D+: 3.85V, VBus: 9.37V, Vcc=5.01V 
Mode 6: 9600mV, D-: 3.85V, D+: 0.17V, VBus: 9.57V, Vcc=5.01V 
Mode 6: 9800mV, D-: 3.85V, D+: 0.17V, VBus: 9.76V, Vcc=5.01V 
Mode 6: 10000mV, D-: 3.85V, D+: 3.85V, VBus: 9.96V, Vcc=5.01V 
Mode 6: 10200mV, D-: 3.85V, D+: 0.17V, VBus: 10.18V, Vcc=5.01V 
Mode 6: 10400mV, D-: 3.85V, D+: 0.17V, VBus: 10.37V, Vcc=5.01V 
Mode 6: 10600mV, D-: 3.85V, D+: 3.85V, VBus: 10.57V, Vcc=5.01V 
Mode 6: 10800mV, D-: 3.85V, D+: 3.85V, VBus: 10.76V, Vcc=5.01V 
Mode 6: 11000mV, D-: 3.85V, D+: 0.17V, VBus: 10.96V, Vcc=5.01V 
Mode 6: 11200mV, D-: 3.85V, D+: 0.17V, VBus: 11.15V, Vcc=5.01V 
Mode 6: 11400mV, D-: 3.85V, D+: 3.85V, VBus: 11.37V, Vcc=5.01V 
Mode 6: 11600mV, D-: 3.85V, D+: 3.85V, VBus: 11.57V, Vcc=5.01V 
Mode 6: 11800mV, D-: 3.85V, D+: 3.85V, VBus: 11.76V, Vcc=5.01V 
Mode 6: 12000mV, D-: 3.85V, D+: 0.17V, VBus: 11.95V, Vcc=5.01V 
Mode 7: 12000mV, D-: 3.85V, D+: 0.17V, VBus: 11.95V, Vcc=5.01V 
Mode 0: 5000mV, D-: 0.17V, D+: 0.17V, VBus: 4.98V, Vcc=5.01V 
...

The output differs in that the simulated QC3 uses the library's idea of the mV, and doesn't increment from the least value properly.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.