From 4d1d53312250f732b565065a95b2e8f7f8d991bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20K=C3=BChne?= Date: Mon, 16 May 2022 17:13:35 -0300 Subject: [PATCH] Added onboard_temperature example. (#80) Co-authored-by: Felipe Kuhne --- README.md | 1 + adc/CMakeLists.txt | 1 + adc/onboard_temperature/CMakeLists.txt | 14 +++++ adc/onboard_temperature/onboard_temperature.c | 59 +++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 adc/onboard_temperature/CMakeLists.txt create mode 100644 adc/onboard_temperature/onboard_temperature.c diff --git a/README.md b/README.md index 458a715..77da428 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ App|Description [hello_adc](adc/hello_adc)|Display the voltage from an ADC input. [joystick_display](adc/joystick_display)|Display a Joystick X/Y input based on two ADC inputs. [adc_console](adc/adc_console)|An interactive shell for playing with the ADC. Includes example of free-running capture mode. +[onboard_temperature](adc/onboard_temperature)|Display the value of the onboard temperature sensor. [microphone_adc](adc/microphone_adc)|Read analog values from a microphone and plot the measured sound amplitude. ### Clocks diff --git a/adc/CMakeLists.txt b/adc/CMakeLists.txt index bb5ca09..65399b6 100644 --- a/adc/CMakeLists.txt +++ b/adc/CMakeLists.txt @@ -3,5 +3,6 @@ if (NOT PICO_NO_HARDWARE) add_subdirectory(dma_capture) add_subdirectory(hello_adc) add_subdirectory(joystick_display) + add_subdirectory(onboard_temperature) add_subdirectory(microphone_adc) endif () diff --git a/adc/onboard_temperature/CMakeLists.txt b/adc/onboard_temperature/CMakeLists.txt new file mode 100644 index 0000000..1557ed2 --- /dev/null +++ b/adc/onboard_temperature/CMakeLists.txt @@ -0,0 +1,14 @@ +add_executable(onboard_temperature onboard_temperature.c) + +target_link_libraries(onboard_temperature pico_stdlib hardware_adc) + +# enable uart output, disable usb output +pico_enable_stdio_uart(onboard_temperature 1) +pico_enable_stdio_usb(onboard_temperature 0) + +# create map/bin/hex file etc. +pico_add_extra_outputs(onboard_temperature) + +# add url via pico_set_program_url +example_auto_set_url(onboard_temperature) + diff --git a/adc/onboard_temperature/onboard_temperature.c b/adc/onboard_temperature/onboard_temperature.c new file mode 100644 index 0000000..724cd8f --- /dev/null +++ b/adc/onboard_temperature/onboard_temperature.c @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2021 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include +#include "pico/stdlib.h" +#include "hardware/adc.h" + +/* Choose 'C' for Celsius or 'F' for Fahrenheit. */ +#define TEMPERATURE_UNITS 'C' + +/* References for this implementation: + * raspberry-pi-pico-c-sdk.pdf, Section '4.1.1. hardware_adc' + * pico-examples/adc/adc_console/adc_console.c */ +float read_onboard_temperature(const char unit) { + + /* 12-bit conversion, assume max value == ADC_VREF == 3.3 V */ + const float conversionFactor = 3.3f / (1 << 12); + + float adc = adc_read() * conversionFactor; + float tempC = 27.0 - (adc - 0.706) / 0.001721; + + if (unit == 'C') { + return tempC; + } else if (unit == 'F') { + return tempC * 9 / 5 + 32; + } + + return -1.0; +} + +int main() { + stdio_init_all(); + gpio_init(PICO_DEFAULT_LED_PIN); + gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT); + + /* Initialize hardware AD converter, enable onboard temperature sensor and + * select its channel (do this once for efficiency, but beware that this + * is a global operation). */ + adc_init(); + adc_set_temp_sensor_enabled(true); + adc_select_input(4); + + while (true) { + float temperature = read_onboard_temperature(TEMPERATURE_UNITS); + printf("Onboard temperature = %.02f %c\n", temperature, TEMPERATURE_UNITS); + + gpio_put(PICO_DEFAULT_LED_PIN, 1); + sleep_ms(10); + + gpio_put(PICO_DEFAULT_LED_PIN, 0); + sleep_ms(990); + } + + return 0; +}