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:

  1. Stáhněte si obě knihovny a rozbalte je do adresáře, třeba ~/pico-knihovny.

  2. Do souboru ~/.bashrc přidejte řádek: export PICO_SDK_CONTRIB=~/pico-knihovny.

  3. Udělejte source ~/.bashrc anebo 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

voltmetr prototyp

Zdroje a odkazy