KKM: Kako koristiti DS18B20 s parazitnim napajanjem

Početnik si s Croduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala e-radionice na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Croduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.

UVOD

U našem tutorijalu o DS18B20 digitalnom termometru, kojeg možete pročitati ovdje, spomenuli smo parazitno napajanje, a sada je red da objasnimo o čemu se radi i zbog čega nam je korisno.

KAKO RADI?

Kako bismo omogućili parazitno napajanje potrebno je spojiti Vdd priključnicu senzora s GND priključnicom. Pogledajmo zatim sljedeću sliku iz koje se vidi način funkcioniranja parazitnog napajanja.

Ako smo prethodno spojili Vdd i GND, dioda D2 nikad neće provesti i senzor može detektirati da je u parazitnom načinu rada. Kako bi se senzor napajao potrebno mu je dovesti napajanje preko podatkovne linije, ali ne smijemo direktno spojiti podatkovnu liniju na napajanje jer se onda neće moći odvijati komunikacija između senzora i mikrokontrolera. kako bi mogli upravljati napajanjem koje je spojeno na podatkovnu liniju spojit ćemo +5 V preko PNP tranzistora te ćemo bazu toga tranzistora spojiti na jedan pin mikrokontrolera kako bi u određenim trenucima mogli dovoditi +5 V na podatkovnu liniju. Kada se ne odvija komunikacija senzor se napaja preko tranzistora, te se odmah i „puni“ kondenzator Cpp. Kada odspojimo napajanje s podatkovne linije kondenzator se prazni i tako napaja senzor. Dok traje proces pretvorbe temperature u senzoru trebamo napajati senzor sa +5 V jer mu je onda potrebno više struje, ali kada se odvija komunikacija senzor ne troši toliko puno pa je dovoljan unutarnji kondenzator koji se prethodno napunio.

KAKO POVEZATI?

Da bi senzor mogao raditi s parazitskim napajanjem potrebno je spojiti GND i VDD priključnice na GND. Podatkovnu liniju potrebno je spojiti na jedan pin mikrokontrolera. te na podatkovnu liniju i napajanje (+5V) moramo povezati otpornik od 4,7k Ohm kako bi se mogla odvijati komunikacija. Na podatkovnu liniju spajamo i PNP tranzistor (npr. BC327) kako je prikazano na shemi.

ARDUINO KOD

Kao i u prethodnom DS18B20 tutorijalu koristit ćemo dvije biblioteke OneWire i DallasTemperature. Ako ne znate kako instalirati biblioteku pročitajte naš tutorijal.
Kod koji je prikazan koristi se kada imamo parazitno napajanje. Na pin 10 spojen nam je senzor, a na pin 2 spojena je baza tranzistora. Kada senzoru pošaljemo naredbu za pretvorbu temperature onda upalimo tranzistor da bi napajali senzor dok vrši pretvorbu, te kada prođe određeno vrijeme gasimo tranzistor i čitamo podatke.

//Uključujemo OneWire biblioteku koja nam omogućuje komunikaciju sa senzorom
#include<OneWire.h>
//konstruktor za OneWire biblioteku(predajemo mu pin na koji spajamo senzor)
OneWire ds(10);
byte addr[8]; //spremamo adresu senzora(ili više njih ako imamo)
byte data[12]; //spremamo podatke sa senzora
float celsius; //varijabla u koju spremamo temperaturu koju dobijemo iz podataka sa senzora
void setup()
{
//započinjemo serijsku komunikaciju(9600 bauda)
Serial.begin(9600);
//postavljamo pin 2 kao izlaz jer na njega spajamo bazu tranzistora
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
}
void loop()
{
//provjeravamo dali je spojen senzor te ako nije ostajemo zauvijek u ovom if uvjetu dok se mikrokontroler ne resetira ručno
byte rollcall = ds.reset();
if (rollcall != 0x01)
{
Serial.println("DS18B20 is not present!");
HERE: goto HERE;
}
Serial.println("DS18B20 is present");
//prikupljamo adrese od senzora, te ih u petlji ispisujemo(max 8 senzora)
ds.search(addr);
for(int i = 0; i<8; i++)
{
Serial.print(addr[i], HEX);
}
Serial.println();
ds.reset();
ds.select(addr);
//šaljemo senzoru naredbu da započne konverziju temperature
ds.write(0x44, 0);
digitalWrite(2, HIGH); //palimo tranzistor i spajamo napajanje na podatkovnu liniju
delay(1000); //čekamo jednu sekundu dok završi konverzija
digitalWrite(2, LOW); //gasimo napajanje na podatkovnoj liniji
//čitamo podatke sa senzora
ds.reset();
ds.select(addr);
ds.write(0xBE);
for (int i = 0; i<9; i++)
{
data[i] = ds.read();
}
//iz dobivenih podataka računamo temperaturu
int16_t raw = (data[1] << 8) | data[0];
celsius = (float)raw / 16.0;
//Ispisujemo temperaturu na Serial monitor
Serial.print("Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius ");
Serial.println();
delay(2000);
Serial.println();
}
Leave a Reply