pimoroni-pico/examples/servo2040/servo2040_read_sensors.cpp

60 lines
1.7 KiB
C++

#include <cstdio>
#include "pico/stdlib.h"
#include "servo2040.hpp"
#include "analogmux.hpp"
#include "analog.hpp"
#include "button.hpp"
/*
Shows how to initialise and read the 6 external
and 2 internal sensors of Servo 2040.
Press "Boot" to exit the program.
*/
using namespace servo;
// Set up the shared analog inputs
Analog sen_adc = Analog(servo2040::SHARED_ADC);
Analog vol_adc = Analog(servo2040::SHARED_ADC, servo2040::VOLTAGE_GAIN);
Analog cur_adc = Analog(servo2040::SHARED_ADC, servo2040::CURRENT_GAIN,
servo2040::SHUNT_RESISTOR, servo2040::CURRENT_OFFSET);
// Set up the analog multiplexer, including the pin for controlling pull-up/pull-down
AnalogMux mux = AnalogMux(servo2040::ADC_ADDR_0, servo2040::ADC_ADDR_1, servo2040::ADC_ADDR_2,
PIN_UNUSED, servo2040::SHARED_ADC);
// Create the user button
Button user_sw(servo2040::USER_SW);
int main() {
stdio_init_all();
// Set up the sensor addresses with pull downs
for(auto i = 0u; i < servo2040::NUM_SENSORS; i++) {
mux.configure_pulls(servo2040::SENSOR_1_ADDR + i, false, true);
}
// Read sensors until the user button is pressed
while(!user_sw.raw()) {
// Read each sensor in turn and print its voltage
for(auto i = 0u; i < servo2040::NUM_SENSORS; i++) {
mux.select(servo2040::SENSOR_1_ADDR + i);
printf("S%d = %f, ", i + 1, sen_adc.read_voltage());
}
// Read the voltage sense and print the value
mux.select(servo2040::VOLTAGE_SENSE_ADDR);
printf("Voltage = %f, ", vol_adc.read_voltage());
// Read the current sense and print the value
mux.select(servo2040::CURRENT_SENSE_ADDR);
printf("Current = %f\n", cur_adc.read_current());
sleep_ms(500);
}
}