1. februarja, 2020

ATTINY85 voltmeter

Slike LOGOTIPI Svet elektronike color 300x92 - ATTINY85 voltmeterAvtor: Arne Zimšek
E-pošta: zrimsek.arne@gmail.com
2020_282_55

Voltmeter je merilna priprava za merjenje električne napetosti. Pogosto deluje na osnovi magnetnih učinkov električnega toka tako, da kotvico merilnega instrumenta zavrti električni tok, ki steče skozi tuljavo kotvice. Sodobni voltmetri običajno delujejo na principu kompenzacije. Poznamo digitalne in tudi drugačne voltmetre. Tokrat vam bom predstavil enostaven voltmeter, ki ga lahko uporabite kot dodatek vašemu napajalniku, ki nima svojega voltmetra.

Voltmeter vežemo v električno vezje vzporedno med točki, med katerima želimo izmeriti električno napetost.

Attiny85
Attiny85 je mikrokontroler družine mikrokontrolerjev AVR podjetja Atmel oz. zdaj Microchip. Vsebuje 8k bajtov Flash polnilnika ter 512 bajten EEPROMa in 512 bajtov RAMa. Na voljo ima 5 priključkov na PORTB.

OLED displej
OLED displej se uporablja za prikaz naše merjene napetosti. V našem primeru uporabljamo OLED displej z ločljivostjo 128 x 64. Ker imamo omejeno število priključkov na Attiny85 mikrokontrolerju, smo za krmiljenje OLED uporabili I2C komunikacijo. Za to vrsto komunikacije smo na OLED-u morali premakniti upor iz pozicije SPI na IIC. Pri našem OLED displeju smo morali vezati Reset priključek na +5V ter DC in CS na GND.

Želel sem torej, da naredim voltmeter, ki bi nam preko OLED displeja prikazal napetost na priključnih sponkah, preko katerih bi se tudi voltmeter napajal. Za ta namen sem tudi ustvaril primerno električno shemo in tiskano vezje.

Opis delovanja vezja
Voltmeter se napaja preko priključnih sponk, na katerih meri tudi napetost. Vezje vsebuje jumper, preko katerega lahko nastavimo napajanje preko baterije (to nam omogoča merjenje nižjih napetosti). Za regulacijo napetosti uporabimo čip TLV76050DBZT. Preko napetostnega delilnika smo zmanjšali vhodno napetost za faktor 8, se pravi pri maksimalni vhodni napetosti 20V je izhod iz napetostnega delilnika 2,5V. To smo naredili, ker Attiny85 mikrokontroler ni zmožen prenašati višjih napetosti od 5V.

TIV
Naš voltmeter je narejen na dvostranskem tiskanem vezju.

Opis programa
Kodo sem napisal v programskem okolju Arduino IDE (C++). Za testiranje delovanja kode sem uporabil Arduino Nano. Na začetku sem imel probleme z knjižnico »Tiny4Koled.H«, ker je bila knjižnica namenjena za OLED displeja s krmilnikom SSD1306, jaz sem pa imel displej s krmilnikom SH1106. Na sliki 8 lahko vidite, kako so se zaradi nekompatibilnosti pojavile črte ob strani OLED displeja.

Za popravilo nekompatibilnosti, sem moral spremeniti parametre OLED displeja v knjižnici.
Za izpis podatkov na OLED displeju sem uporabil knjižnico »Tiny4kOLED.h«.

V področju »void setup« sem uporabil različne ukaze za inicializacijo OLED displeja ter za izpis začetnega sporočila.

Znotraj področja »void loop« sem za zaznavanje oz. merjenje napetosti na analognem priključku, uporabil funkcijo »analogRead«, ter s pomočjo enačbe sem kalibriral izmerjeno vrednost.

Za izpis vrednost ter za izpis teksta sem uporabil ukaze z začetno frazo »oled.«. V tej knjižnici imamo na voljo dva »fonta« oz. dve velikosti črk, to sta 6×8 in 8×16.

Zaključek
Tiskano vezje za voltmeter kot tudi ustrezen OLED sta na voljo v uredništvu revije Svet elektronike. Imam namen dodati vezju še možnost merjenja toka. Za to funkcijo bi potreboval dodati vezju čip, kot je npr. ACS712, ter napisati ustrezno kodo za pravilen izpis toka in napetosti.

Viri:

Program 1 – Celotna koda

#include <Tiny4kOLED.h>
void setup() {
oled.begin(); 
oled.clear(); 
oled.switchFrame();
oled.on();
oled.switchRenderFrame();
oled.setFont(FONT8X16);
oled.setCursor(38, 0);
oled.print(» SVET »);
oled.setCursor(22, 2);
oled.print(»ELEKTRONIKE«);
oled.switchFrame();
delay(1000);

}
void loop() {
int sensorValue = analogRead(A2);
float voltage = sensorValue * (61.0 / 1023.0);

oled.clear();
oled.setFont(FONT8X16);
oled.setCursor(40, 0);
oled.print(»VOLTAGE«);

oled.setFont(FONT8X16);
oled.setCursor(46, 2);
oled.print(voltage);
oled.print(»V«);

oled.switchFrame();
}
Tags: