/*
  SFF Minilab PDU Project
  Current Sensing & Display Driver Board

  Author: tobychui
*/
#define I_sense_A 32
#define I_sense_B 33
#define I_sense_C 34
#define I_sense_D 35

#define NUM_SAMPLES 10

const float Rt = 5100.0;   // top resistor (ohms)
const float Rb = 10000.0;  // bottom resistor (ohms)

void setup() {
  Serial.begin(115200);

  //ADC_11db set ADC to ~0–3.3 V range
  analogSetPinAttenuation(I_sense_A, ADC_11db);
  analogSetPinAttenuation(I_sense_B, ADC_11db);
  analogSetPinAttenuation(I_sense_C, ADC_11db);
  analogSetPinAttenuation(I_sense_D, ADC_11db);
}

// get_current_sensor_voltage() gets the sensor raw output voltage from the given pin number
// The sensor output is passed through a voltage divider of 5.1k - 10k that
// convert the 5V signal output of ACS712 to 3.3v logic level readable by ESP32 3.3v ADC
void get_current_sensor_voltage(int pin_number) {
  long sum_mV = 0;

  // take multiple samples
  for (int i = 0; i < NUM_SAMPLES; i++) {
    sum_mV += analogReadMilliVolts(pin_number);
    delayMicroseconds(200);  // short delay to stabilize readings
  }

  // average the readings
  int avg_mV = sum_mV / NUM_SAMPLES;

  // Convert to float volts
  float vout = avg_mV / 1000.0f;

  // Reconstruct original pre-divider voltage
  float vin  = vout * (Rt + Rb) / Rb;

  Serial.printf("Pin %d -> Vout=%.3f V  Vin=%.3f V\n", pin_number, vout, vin);
}

void loop() {
  get_current_sensor_voltage(I_sense_A);
  get_current_sensor_voltage(I_sense_B);
  get_current_sensor_voltage(I_sense_C);
  get_current_sensor_voltage(I_sense_D);
  Serial.println("---");
  delay(3000);
}