Sam pomiar napięcia na Arduino jest prosty dopiero wtedy, gdy rozumiesz, co naprawdę robi przetwornik ADC, skąd bierze się napięcie odniesienia i po co w ogóle stosuje się dzielnik rezystorowy. W praktyce nie chodzi wyłącznie o odczyt liczby z pinu A0, ale o wynik, który da się bezpiecznie przeliczyć na wolty i porównać z multimetrem. W tym artykule pokazuję, jak to zrobić bez zgadywania, z przykładami dla typowych napięć i z komentarzem do najczęstszych błędów.
Najpierw ustal zakres wejścia, potem liczby z ADC
- `analogRead()` zwraca kod ADC, a nie napięcie. Na klasycznych płytkach AVR zakres 10-bitowy to zwykle 0-1023.
- Napięcie odniesienia decyduje o skali pomiaru. Przy 5,00 V krok wynosi około 4,88 mV, ale rzeczywiste Vref warto zmierzyć.
- Do napięć wyższych niż referencja potrzebny jest dzielnik. Bez niego łatwo uszkodzić wejście analogowe.
- Wspólna masa jest obowiązkowa. Bez niej odczyt nie ma poprawnego punktu odniesienia.
- Uśrednianie i krótki kondensator przy wejściu pomagają w praktyce. To najprostszy sposób na stabilniejszy wynik.
- Przy 230 V AC Arduino nie mierzy się bezpośrednio. Tu potrzebna jest izolacja i odpowiedni tor pomiarowy.
Jak Arduino zamienia napięcie na liczbę
Arduino nie mierzy napięcia „wprost”. Wejście analogowe trafia do przetwornika ADC, który zamienia poziom napięcia na liczbę całkowitą, a ta liczba jest tylko proporcją względem napięcia referencyjnego. Na klasycznych płytkach AVR, takich jak Uno, Nano czy Mega, `analogRead()` zwykle daje wartości od 0 do 1023, więc krok pomiaru przy referencji 5 V wynosi około 4,88 mV.
To ważne rozróżnienie, bo wiele problemów bierze się właśnie z mylenia odczytu z napięciem. Jeśli referencja ma 5,00 V, to kod 512 oznacza mniej więcej 2,50 V na pinie, ale jeśli rzeczywiste Vref ma 4,92 V, wynik już się zmienia. Na części nowszych płytek możesz też spotkać inną rozdzielczość ADC i wtedy przelicznik trzeba dopasować do ustawienia `analogReadResolution()`.
Jeśli korzystasz z zewnętrznej referencji, na klasycznych AVR ustawiasz `analogReference(EXTERNAL)` i dopiero potem podajesz właściwe napięcie na AREF. Nie każda płytka zachowuje się tak samo, więc nie zakładam z góry identycznych zasad dla całej rodziny Arduino.
| Tryb ADC | Zakres odczytu | Przeliczenie na napięcie |
|---|---|---|
| 10 bit | 0-1023 | raw * Vref / 1023.0 |
| 12 bit | 0-4095 | raw * Vref / 4095.0 |
| Inna rozdzielczość | zależna od płytki | sprawdź ustawienie i dokumentację |
Gdy to już jest jasne, można bezpiecznie przejść do samego podłączenia wejścia.
Jak podłączyć dzielnik napięcia, żeby niczego nie spalić
Jeżeli mierzone napięcie mieści się w zakresie wejścia analogowego, możesz podłączyć je bezpośrednio. Jeżeli jest wyższe, potrzebujesz dzielnika rezystorowego, czyli dwóch rezystorów, które obniżają napięcie do bezpiecznego poziomu. Najprostszy układ wygląda tak: `Vin` trafia na `R1`, z węzła pomiarowego schodzisz przez `R2` do masy, a punkt pośredni łączysz z pinem analogowym.
Wspólna masa jest obowiązkowa. Masa mierzonego układu i masa Arduino muszą być połączone, inaczej wynik będzie przypadkowy albo całkiem błędny. Tak samo ważne jest to, żeby napięcie na pinie nie przekraczało referencji z zapasem. Ja zwykle zostawiam kilka procent marginesu, bo zasilacze, akumulatory i instalacje 12 V potrafią podnieść się wyżej, niż sugeruje nazwa nominalna.
- R1 jest po stronie wyższego napięcia.
- R2 schodzi do masy.
- Punkt między rezystorami łączysz z wejściem analogowym.
- Dla dłuższych przewodów i szumu pomaga kondensator 100 nF między pinem a masą.
- Przy napięciach sieciowych 230 V AC nie używa się samego dzielnika i pinu Arduino bez izolacji.
Takie połączenie jest proste, ale działa dobrze tylko wtedy, gdy potem poprawnie policzysz wynik w kodzie.
Jak przeliczyć odczyt na wolty w kodzie
Najwygodniej liczyć to w dwóch krokach: najpierw przekształcam odczyt ADC na napięcie na pinie, a dopiero potem cofam go przez wzór dzielnika. Dla układu z rezystorami `R1` i `R2` wzór wygląda tak: Vin = Vout × (R1 + R2) / R2. W praktyce oznacza to, że jeśli na pinie masz 2,50 V, a dzielnik ma proporcję 3:1, to źródło daje około 10 V.
const byte PIN_VOLT = A0;
const float VREF = 5.00; // wpisz zmierzone napięcie odniesienia
const float R1 = 30000.0; // rezystor po stronie wyższego napięcia
const float R2 = 10000.0; // rezystor do masy
float readVoltage()
{
long sum = 0;
for (byte i = 0; i < 20; i++) {
sum += analogRead(PIN_VOLT);
delayMicroseconds(200);
}
float raw = sum / 20.0;
float vout = raw * VREF / 1023.0;
return vout * (R1 + R2) / R2;
}Warto zwrócić uwagę na dwie rzeczy. Po pierwsze, VREF lepiej zmierzyć multimetrem niż wpisywać z pamięci, bo USB i stabilizatory rzadko dają idealne 5,00 V. Po drugie, uśrednianie kilkunastu odczytów zmniejsza rozrzut, który w prostych układach bywa większy, niż się intuicyjnie spodziewa początkujący.
Na płytkach z inną rozdzielczością niż 10 bitów zmieniasz tylko mianownik i ustawienia ADC. W tym miejscu robi się już praktyka doboru elementów, bo nie każdy dzielnik jest równie dobry dla każdego napięcia.
Jak dobrać wartości rezystorów do typowych zastosowań
Dobór dzielnika to kompromis między bezpieczeństwem, poborem prądu i stabilnością odczytu. Zbyt małe rezystory niepotrzebnie obciążają badany układ, a zbyt duże zwiększają podatność na szum i potrafią rozjechać wynik, zwłaszcza przy dłuższych przewodach. Ja zwykle zaczynam od prostych par rezystorów i dopiero później dopracowuję je pod konkretny projekt.
| Zastosowanie | Przykładowe wartości | Co daje taki układ | Uwagi praktyczne |
|---|---|---|---|
| Pomiar 0-5 V | bez dzielnika | pełny zakres ADC | pilnuj, żeby sygnał nie przekraczał referencji |
| Akumulator 12 V | 30 kΩ / 10 kΩ | około 3,0 V przy 12 V i 3,75 V przy 15 V | dobry margines dla ładowanego akumulatora |
| Instalacja 24 V | 120 kΩ / 22 kΩ | około 3,7 V przy 24 V i 4,6 V przy 30 V | sensowny kompromis dla automatyki i zasilaczy |
| Pomiar dokładniejszy | AREF + dobrany dzielnik | lepsza rozdzielczość w węższym zakresie | wymaga poprawnej konfiguracji referencji |
Jeśli z dzielnika chcesz zasilać tylko wejście analogowe, prąd zwykle jest niewielki. Przy 30 kΩ i 10 kΩ dla 15 V mówimy o około 0,375 mA, więc układ nie obciąża źródła mocno. To właśnie dlatego taki sposób sprawdza się w monitorowaniu baterii i zasilaczy, ale nie zastępuje pomiaru wysokiej klasy, gdy liczy się każda dziesiąta wolta.
Wybór rezystorów wygląda banalnie, ale to właśnie on najczęściej decyduje o tym, czy odczyt będzie stabilny, czy frustrująco pływający.
Najczęstsze błędy przy pomiarze napięcia
Najwięcej problemów widzę nie w samym kodzie, tylko w okablowaniu i założeniach. Arduino bardzo chętnie „pokazuje” napięcie, które w rzeczywistości jest sumą błędu referencji, szumu i źle dobranego dzielnika.
- Brak wspólnej masy sprawia, że wynik nie ma odniesienia i zaczyna wyglądać losowo.
- Za duże rezystory podnoszą podatność na zakłócenia, szczególnie przy dłuższych przewodach.
- Za mały margines nad referencją kończy się przesterowaniem wejścia przy wyższych niż nominalne napięciach.
- Założenie, że USB daje idealne 5 V prowadzi do systematycznego błędu w przeliczeniu.
- Nieprawidłowa konfiguracja AREF potrafi całkowicie zmienić skalę pomiaru.
- Bezpośredni pomiar napięcia sieciowego bez izolacji jest po prostu niebezpieczny i nie powinien być robiony „na szybko”.
Jeżeli wynik skacze o kilka jednostek, nie zaczynam od wymiany Arduino. Najpierw skracam przewody, dodaję uśrednianie, sprawdzam masę i dopiero potem oceniam, czy potrzebny jest lepszy tor pomiarowy.
To prowadzi do najważniejszego pytania: kiedy zwykły ADC z Arduino wystarczy, a kiedy lepiej od razu sięgnąć po coś dokładniejszego.
Kiedy Arduino wystarczy, a kiedy lepiej wyjść poza sam ADC
Do prostych zadań Arduino naprawdę wystarcza. Monitorowanie poziomu baterii, kontrola zasilacza, alarm przy spadku napięcia czy logowanie prostych wartości w projekcie robotycznym to typowe przypadki, w których poprawnie policzony dzielnik i sensowny kod załatwiają sprawę.
Jeśli jednak potrzebujesz wyższej dokładności, pracy w silnym szumie, długiego kabla albo stabilnego pomiaru wielu kanałów, rozważ zewnętrzny przetwornik ADC albo dedykowany układ monitorujący napięcie. Przy instalacjach przemysłowych i wszędzie tam, gdzie w grę wchodzi wyższe napięcie lub izolacja, to już nie jest kwestia wygody, tylko bezpieczeństwa i jakości danych.
W praktyce najlepszy efekt daje prosta zasada: dla prostych projektów wystarczy dobrze policzony dzielnik i kalibracja, a tam, gdzie liczy się dokładność lub bezpieczeństwo, warto wyjść poza samą płytkę i dobrać lepszy tor pomiarowy.