Skip to content
Snippets Groups Projects
voltage.rs 855 B
Newer Older
Stephen D's avatar
Stephen D committed
use embedded_hal::adc::OneShot;
use rp2040_hal::{
    adc::AdcPin,
    gpio::{
        bank0::{Gpio26, Gpio28},
        FunctionNull, Pin, PullNone,
    },
    Adc,
};

// u16, 3.3V ADC, resistor half-divider
const FACTOR: f64 = 3.3 * 2.0 / 4095.0;

Stephen D's avatar
Stephen D committed
type Batt = Pin<Gpio26, FunctionNull, PullNone>;
type Usb = Pin<Gpio28, FunctionNull, PullNone>;
Stephen D's avatar
Stephen D committed

pub struct VoltMeter {
Stephen D's avatar
Stephen D committed
    batt: AdcPin<Batt>,
    usb: AdcPin<Usb>,
Stephen D's avatar
Stephen D committed
    adc: Adc,
}

impl VoltMeter {
Stephen D's avatar
Stephen D committed
    pub fn new(adc: Adc, batt: Batt, usb: Usb) -> Self {
Stephen D's avatar
Stephen D committed
        let batt = AdcPin::new(batt);
        let usb = AdcPin::new(usb);

        Self { batt, usb, adc }
    }

    pub fn voltage(&mut self) -> (f64, f64) {
        let batt: u16 = self.adc.read(&mut self.batt).unwrap();
        let usb: u16 = self.adc.read(&mut self.usb).unwrap();

        (batt as f64 * FACTOR, usb as f64 * FACTOR)
    }
}