Kontrola napětí

 

 

Kontrola napětí

Princip měření napětí Arduinem byl popsán v kapitole "Měření napětí". Zde uvedený příklad je zaměřen na kontrolu stavu akumulátoru 12V. Rozsah měření byl zvolen 20 V. Referenční napětí procesoru bylo nastaveno na "INTERNAL", tj. 1,1V (viz kapitola "Měření napětí"). Vstup měření byl vybaven odporovým děličem a na analogový pin Arduina (A0) bylo přivedeno napětí 1,1 V při maximálním měření napětí 20V. Zvolené referenční napětí je vhodné předem proměřit na pinu "REF" a naměřenou hodnotu poté nastavit na odporovém děliči na vstupu Arduina. Např. bylo ověřeno, že referenční napětí parametru INTERNAL (1,1V) bylo u deseti desek (UNO, NANO) jiné a pohybovalo se v rozmezí 1,073 - 1,108 V. 

 

 

 Mezní varovná úroveň vybité baterie byla nastavena na hodnotu 10,5 V (napětí vybitého Pb akumulátoru). Byla použita deska Arduino NANO a displej LCD1602 i2c. Zapojení a oživení displeje je uvedeno v kapitole  "LCD Displej". Připojení displeje k desce NANO je stejné jako u desky UNO, tj. piny NANO:   A4/SDA, A5/SCL. 

Napětí 1,1 V z jezdce trimru bude v systému Adruina vracet hodnotu 1023 jako horní hranici měřeného rozsahu 20 V. Hodnotu 1023 algebraicky upravíme ve skeči podle zvoleného měřeného rozsahu (popsáno v kapitole "Měření napětí" ). Pro kontrolu vybitého akumulátoru připojíme LED diodu přes odpor R na pin D13 a do skeče naprogramujeme blikání ledky po podkročení napětí 10,5 V. Byla použita ledka L831 (1,85 V/20mA) přes odpor 120 ohmů.

 

 

Do IDE nahrajeme kód "Lcd_kontrola_napeti"(otevřeme a "klipbordem" přeneseme na pracovní plochu IDE ...) :

 

Skeč "Lcd_kontrola_napeti.ino" :

#include <Wire.h>                                          	// knihovna (případně zde použijeme knihovnu "LCD.h")    
#include <LiquidCrystal_I2C.h>                             	// knihovna     
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3,POSITIVE);    	// nastavení adresy 0x3F displeje
float H=0;                                                      // deklarace proměnných H, T  
float U=0;

void setup()   
{Serial.begin(9600);                                          	// zahájení sériové komunikace
analogReference(INTERNAL);					//  nastavení interního referenčního napětí procesoru na hodnotu 1,1 V	
lcd.begin(16,2);                                               	// nastavení 16 písmen a 2 řádky displeje
pinMode(13, OUTPUT);                                            // iniciace pinu 13 jako výstupu
}                                              

void loop()                                                     
{lcd.setCursor(0,0);                                        	// nastavení pozice kursoru   
lcd.print("Napeti:");                                           //  tisk textu  „Napeti“
lcd.setCursor(15,0);                                            //  nastavení pozice kursoru
lcd.print("V");                                                	//  tisk textu  „V“
lcd.setCursor(9,0);                                             //  nastavení pozice kursoru
H=analogRead(14);                                              	//  načtení analogové hodnoty pinu A0, "v Arduinu 14"
U=((H*20)/1023);                                              	//  úprava načtené hodnoty na rozsah měření 20V 
lcd.print(U);                                                  	// tisk hodnoty měřeného napětí ve voltech                                                    
delay(500);                                                     //  ceká 0,5 s
if (U<10.5)                                                     //  podmínka - když je napětí méně než 10.5 V pak:(Poz.: ARDUINO používá v číselných hodnotách desetinnou tečku)
{lcd.setCursor(0,1);                                            //  nastavení pozice kursoru
lcd.print("Baterie vybita!!");                                  //  tisk textu "Baterie vybitá !!"
digitalWrite(13, HIGH);                                        	//  rozsvícení ledky na pinu 13
delay(1000);}                                                   // čeká 1 s 
lcd.clear();                                                    //  vynulování displeje
digitalWrite(13, LOW);}                                        	//  zhasnutí ledky na pinu 13
    
 

Měřící rozsah (zde 20 V) nastavíme algebraickou úpravou hodnoty "H" snímané pinem "A0" (ve skeči pin 14):

U=((H*20)/1023) 

"Desetibitovou" hodnotu snímanou na pinu A0, zde "H=analogRead(14)" násobíme rozsahem měření (20 V) a dělíme maximální "desetibitovou" hodnotou 1023. Výsledek algebraické úpravy, která odpovídá měřenému napětí ve voltech, ukládáme do proměnné U a následně tiskneme na displeji "lcd.print(U)".   

Algoritmus skeče je nastaven na měření Pb akumulátoru 12 V a kontrolu jeho vybití na úrovní 10,5 V. Skeč nahrajeme do Arduina a připojíme baterii s napětím 12 V. Na displeji se zobrazí napětí baterie:

Pro simulaci vybitého akumulátoru připojíme např. baterii 9V.

 

Podmínka "if (U<10.5)" zavedena v programu aktivuje zobrazeni textu "Baterie vybita" a rozsvítí ledku. Následně příkaz čekání "delay(1000)" způsobí v opakované smyčce blikání jak nápisu "Baterie vybita", tak blikání ledky v intervalu 1s. Mezní napětí lze změnit úpravou podmínky (U<10.5).

Analogové měření napětí procesorem není v nízkých úrovních zcela přesné. Na úrovni 10 % z měřeného rozsahu bylo procesorem vyhodnoceno napětí cca o 2% nižší oproti skutečnému připojeném napětí. Na úrovní 1% z měřeného rozsahu (tj. při napětí cca 10 mV na pinu A0 při referenčním napětí 1,1 V) až o 20 % nižší.

 

Na co si dát pozor

Analogové vstupy jsou citlivé na zničení vyšším napětím než je max. napájecí napětí.  Např. 12,5 V připojené nedopatřením na analogový pin A0 poškodilo procesor. Došlo pravděpodobně k průrazu v analogové části procesoru. Vstupy A0-A5 poté vracely vždy maximální hodnotu 1023 nezávisle na připojeném napětí. Další funkce poškozeného procesoru, např. nahrávání skeče, program "blink", tlačítko" aj. zůstaly zpravidla funkční. Analogové piny je poté možné konfigurovat a používat jako funkční digitální vstupy. 

 

 

Říjen 2019, upraveno 2023 

 

Home

 

Arby

arduinohobby@email.cz