S ADC převodníkem Texas Instruments ADS1115 lze udělat celkem přesný voltmetr. Při napájecím napětí 3.3V a defaultním nastavení je nepřesnost měření \(62.5 \muV\). Rozsah měření je 0V až 3.3V.
Použijeme knihovny pro ADS1115 převodník https://github.com/antgon/pico-ads1115 a pro OLED SSD1306 display.
Schéma zapojení
Program
/* Voltmetr s ADC Texas Instrumets ADS1115
(c) Jirka Chráska 2025, <jirka@lixis.cz>
BSD 3 clause license
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "ads1115.h"
#define ADS1115_I2C_PORT i2c0
#define ADS1115_I2C_FREQ 400000
#define ADS1115_I2C_ADDR 0x48
const uint8_t ADS1115_SDA_PIN = 4;
const uint8_t ADS1115_SCL_PIN = 5;
struct ads1115_adc adc;
#include "ssd1306.h"
#include "font_spleen_8x5.h"
#include "font_spleen_16x8a.h"
#define OLED_I2C_PORT i2c1
#define OLED_I2C_FREQ 400000
#define OLED_I2C_ADDR 0x3C
const uint8_t OLED_SDA_PIN = 6;
const uint8_t OLED_SCL_PIN = 7;
ssd1306_t disp;
#define DISPLAY_WIDTH 128
#define DISPLAY_HEIGHT 32
void setup_i2c_oled(void)
{
i2c_init(i2c1, OLED_I2C_FREQ);
gpio_set_function(OLED_SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(OLED_SCL_PIN, GPIO_FUNC_I2C);
// Pull-up rezistory jsou v displeji, netřeba nastavovat
}
int main()
{
char buf[128];
gpio_set_function( 25, GPIO_FUNC_SIO );
gpio_set_dir( 25, true );
gpio_put(25,1);
sleep_ms(200);
stdio_init_all();
// Nastavení I2C pro ADC
i2c_init(ADS1115_I2C_PORT, ADS1115_I2C_FREQ);
gpio_set_function(ADS1115_SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(ADS1115_SCL_PIN, GPIO_FUNC_I2C);
gpio_pull_up(ADS1115_SDA_PIN);
gpio_pull_up(ADS1115_SCL_PIN);
// Nastavení I2C pro OLED display
setup_i2c_oled();
// Nastavení ADC
ads1115_init(ADS1115_I2C_PORT, ADS1115_I2C_ADDR, &adc);
// Nastavení konfigurace 1 vstup
ads1115_set_input_mux(ADS1115_MUX_SINGLE_0, &adc);
ads1115_set_pga(ADS1115_PGA_4_096, &adc);
ads1115_set_data_rate(ADS1115_RATE_475_SPS, &adc);
// Zapíšeme konfiguraci do ADC převodníku
ads1115_write_config(&adc);
// nastavení displeje SSD1306
disp.external_vcc = false;
ssd1306_init(&disp, DISPLAY_WIDTH, DISPLAY_HEIGHT, OLED_I2C_ADDR, OLED_I2C_PORT); // inicializace
ssd1306_poweron(&disp); // zapnutí dipleje
ssd1306_clear(&disp); // vymazání displeje
// data z ADC
float volts;
uint16_t adc_value;
while (true) {
gpio_put(25,0);
// Přečteme hodnotu a přepočítáme
ads1115_read_adc(&adc_value, &adc);
volts = ads1115_raw_to_volts(adc_value, &adc);
printf("ADC: %u Voltage: %f\n", adc_value, volts);
ssd1306_clear(&disp);
sprintf(buf, "%1.3f V", volts);
ssd1306_draw_string_with_font(&disp, 0, 0, 2, font_spleen_16x8a, buf);
ssd1306_show(&disp);
gpio_put(25,1);
sleep_ms(10);
}
}
Sestavení programu udělejte takto:
-
Stáhněte si obě knihovny a rozbalte je do adresáře, třeba
~/pico-knihovny. -
Do souboru
~/.bashrcpřidejte řádek:export PICO_SDK_CONTRIB=~/pico-knihovny. -
Udělejte
source ~/.bashrcanebo se odhlaste a znovu přihlaste.
Knihovny ke stažení:
A nyní můžete postupovat obvyklým způsobem:
cd adresar_s_projektem
mkdir build
cd build
cmake ..
make -j4
cmake_minimum_required(VERSION 3.13)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
# přidání knihovny pro ads1115
add_subdirectory($ENV{PICO_SDK_CONTRIB}/pico-ads1115/lib ads1115)
# přidání knihovny pro oled displej SSD1306
add_subdirectory($ENV{PICO_SDK_CONTRIB}/pico-oled-SSD1306/lib oled)
# Nastavení jména projektu
project(voltmetr_ads1115 C CXX ASM)
pico_sdk_init()
add_executable(${PROJECT_NAME} ${PROJECT_NAME}.c)
target_link_libraries(
${PROJECT_NAME}
pico_stdlib
hardware_i2c
pico-ads1115
pico-oled
)
pico_enable_stdio_usb(${PROJECT_NAME} 1)
pico_enable_stdio_uart(${PROJECT_NAME} 0)
pico_add_extra_outputs(${PROJECT_NAME})
Konstrukce

