Skip to content

Commit

Permalink
examples: Add ADC examples
Browse files Browse the repository at this point in the history
Add ADC examples for all boards to demonstrate how to read from the
analog pins.
  • Loading branch information
Rahix committed Mar 13, 2021
1 parent 749dcc5 commit 66def94
Show file tree
Hide file tree
Showing 3 changed files with 161 additions and 0 deletions.
50 changes: 50 additions & 0 deletions examples/arduino-leonardo/src/bin/leonardo-adc.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#![no_std]
#![no_main]

use arduino_hal::prelude::*;
use panic_halt as _;

use arduino_hal::adc;

#[arduino_hal::entry]
fn main() -> ! {
let dp = arduino_hal::Peripherals::take().unwrap();
let pins = arduino_hal::pins!(dp);
let mut serial = arduino_hal::default_serial!(dp, pins, 57600);

let mut adc = arduino_hal::Adc::new(dp.ADC, Default::default());

let (vbg, gnd, tmp) = (
adc.read_blocking(&adc::channel::Vbg),
adc.read_blocking(&adc::channel::Gnd),
adc.read_blocking(&adc::channel::Temperature),
);
ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).void_unwrap();
ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).void_unwrap();
ufmt::uwriteln!(&mut serial, "Temperature: {}", tmp).void_unwrap();

let a0 = pins.a0.into_analog_input(&mut adc);
let a1 = pins.a1.into_analog_input(&mut adc);
let a2 = pins.a2.into_analog_input(&mut adc);
let a3 = pins.a3.into_analog_input(&mut adc);
let a4 = pins.a4.into_analog_input(&mut adc);
let a5 = pins.a5.into_analog_input(&mut adc);

loop {
let values = [
a0.analog_read(&mut adc),
a1.analog_read(&mut adc),
a2.analog_read(&mut adc),
a3.analog_read(&mut adc),
a4.analog_read(&mut adc),
a5.analog_read(&mut adc),
];

for (i, v) in values.iter().enumerate() {
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).void_unwrap();
}

ufmt::uwriteln!(&mut serial, "").void_unwrap();
arduino_hal::delay_ms(1000);
}
}
53 changes: 53 additions & 0 deletions examples/arduino-mega2560/src/bin/mega2560-adc.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#![no_std]
#![no_main]

use arduino_hal::prelude::*;
use panic_halt as _;

use arduino_hal::adc;

#[arduino_hal::entry]
fn main() -> ! {
let dp = arduino_hal::Peripherals::take().unwrap();
let pins = arduino_hal::pins!(dp);
let mut serial = arduino_hal::default_serial!(dp, pins, 57600);

let mut adc = arduino_hal::Adc::new(dp.ADC, Default::default());

let (vbg, gnd) = (
adc.read_blocking(&adc::channel::Vbg),
adc.read_blocking(&adc::channel::Gnd),
);
ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).void_unwrap();
ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).void_unwrap();

// To store multiple channels in an array, we use the `into_channel()` method.
let channels: [adc::Channel; 16] = [
pins.a0.into_analog_input(&mut adc).into_channel(),
pins.a1.into_analog_input(&mut adc).into_channel(),
pins.a2.into_analog_input(&mut adc).into_channel(),
pins.a3.into_analog_input(&mut adc).into_channel(),
pins.a4.into_analog_input(&mut adc).into_channel(),
pins.a5.into_analog_input(&mut adc).into_channel(),
pins.a6.into_analog_input(&mut adc).into_channel(),
pins.a7.into_analog_input(&mut adc).into_channel(),
pins.a8.into_analog_input(&mut adc).into_channel(),
pins.a9.into_analog_input(&mut adc).into_channel(),
pins.a10.into_analog_input(&mut adc).into_channel(),
pins.a11.into_analog_input(&mut adc).into_channel(),
pins.a12.into_analog_input(&mut adc).into_channel(),
pins.a13.into_analog_input(&mut adc).into_channel(),
pins.a14.into_analog_input(&mut adc).into_channel(),
pins.a15.into_analog_input(&mut adc).into_channel(),
];

loop {
for (i, ch) in channels.iter().enumerate() {
let v = adc.read_blocking(ch);
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).void_unwrap();
}

ufmt::uwriteln!(&mut serial, "").void_unwrap();
arduino_hal::delay_ms(1000);
}
}
58 changes: 58 additions & 0 deletions examples/arduino-uno/src/bin/uno-adc.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#![no_std]
#![no_main]

use arduino_hal::prelude::*;
use panic_halt as _;

use arduino_hal::adc;

#[arduino_hal::entry]
fn main() -> ! {
let dp = arduino_hal::Peripherals::take().unwrap();
let pins = arduino_hal::pins!(dp);
let mut serial = arduino_hal::default_serial!(dp, pins, 57600);

let mut adc = arduino_hal::Adc::new(dp.ADC, Default::default());

let (vbg, gnd, tmp) = (
adc.read_blocking(&adc::channel::Vbg),
adc.read_blocking(&adc::channel::Gnd),
adc.read_blocking(&adc::channel::Temperature),
);
ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).void_unwrap();
ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).void_unwrap();
ufmt::uwriteln!(&mut serial, "Temperature: {}", tmp).void_unwrap();

let a0 = pins.a0.into_analog_input(&mut adc);
let a1 = pins.a1.into_analog_input(&mut adc);
let a2 = pins.a2.into_analog_input(&mut adc);
let a3 = pins.a3.into_analog_input(&mut adc);
let a4 = pins.a4.into_analog_input(&mut adc);
let a5 = pins.a5.into_analog_input(&mut adc);

loop {
let values = [
a0.analog_read(&mut adc),
a1.analog_read(&mut adc),
a2.analog_read(&mut adc),
a3.analog_read(&mut adc),
a4.analog_read(&mut adc),
a5.analog_read(&mut adc),
];

for (i, v) in values.iter().enumerate() {
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).void_unwrap();
}

// Arduino Nano has two more ADC pins A6 and A7. Accessing them works a bit different from
// the other pins as they are not normal IO pins. The code below shows how it works.
let (a6, a7) = (
adc.read_blocking(&channel::ADC6),
adc.read_blocking(&channel::ADC7),
);
ufmt::uwrite!(&mut serial, "A6: {} A7: {}", a6, a7).void_unwrap();

ufmt::uwriteln!(&mut serial, "").void_unwrap();
arduino_hal::delay_ms(1000);
}
}

0 comments on commit 66def94

Please sign in to comment.