Sunteți pe pagina 1din 18

Laborator Sisteme cu Microprocesoare Integrate

Departamentul de Automatic i Informatic Industrial

Lucrare 8 - Achiziia digital de date

Coninutul lucrrii pe scurt:


Prezentare protocol de comunicaie TWI I2C
Utilizarea bibliotecii software Wire
Modalitate de utilizare senzor TMP102

Echipamente necesare lucrrii:


Plac de dezvoltare Arduino Uno sau compatibil
Cablu de conectare USB
Breadboard + fire de interconectare
LCD alfanumeric 16x2 + rezistor variabil (poteniometru)
10Kohm + rezistor 220 ohm
senzor de temperatur TMP102
1 LED + rezistor 220 ohm

Seciuni lucrare:
Prezentare interfa de comunicaie I2C
Utilizarea bibliotecii software Wire
Utilizarea senzorului de temperatur TMP102
Proiect termometru TMP102 cu nregistrare
Proiect termometru TMP102 cu alarm
Referine online

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Prezentare interfa de comunicaie I2C


Magistrala I2C (IIC Inter Integrated Circuit) se poate realiza n oricare din urmtoarele
tehnologii: NMOS, CMOS sau BIPOLAR. Este o magistral serial cu dou fire (TWI - TWO WIRE
INTERFACE) care transport informaia ntre dispozitivele conectate. Cele dou linii sunt SDA
(Serial Data Line) i SCL (Seral Clock Line).
Linia SDA este linia pe care se transmit pachetele de date i comenzi. Linia SCL este linia pe care
se transmite semnalul de ceas. ntruct aceasta este o interfa de comunicaie sincron linia
de ceas este necesar pentru sincronizarea ceasurilor ntre dispozitivele legate la aceasta.
Datorit faptului c nu se pot trimite n ambele sensuri informaii n acelai timp (numai un fir
de date) aceasta este interfa de comunicaie half-duplex.
Fiecare dispozitiv conectat la magistral este identificat printr-o adres unic (fie c este
microcontroler, driver LCD, memorie sau driver tastatur) i poate funciona ca transmitor
sau receptor alternativ. Dispozitivele pot fi considerate de asemenea i master / slave. Master
este un dispozitiv ce iniiaz un transfer de date pe magistral i tot el ncheie transferul. n acel
moment, toate dispozitivele sunt considerate slave. Slave este un dispozitiv care primete o
cerere de date i rspunde la aceast cerere.
Magistrala I2C este de tip multi-master. Asta nseamn c orice dispozitiv este capabil s
controleze magistrala. n general microcontrolerul este master i perifericele sunt slave dar
uneori, anumite dispozitive ca de exemplu memoriile pot iniia transferuri ca i dispozitive
master. De asemenea exist posibilitatea de conectare a mai multe microcontrolere prin
aceast magistral ceea ce implic configurarea unora ca master i a celorlalte ca slave.
Deoarece pot aprea momente n care mai multe device-uri ce sunt configurate ca master s
iniieze transferuri n acelai timp s-a dezvoltat o procedur de arbitrare. Aceasta asigur c
numai unuia dintre cei ce iniiaz un transfer i se ofer controlul magistralei, astfel datele
neputnd s fie alterate. Legea de arbitrare folosit este lowest wins adic cei doi sau mai muli
masteri iniiaz un transfer i fiecare ncearc s genereze semnalul de ceas pe linia SCL i s
trimit datele pe linia SDA. Primul care trimite un bit 1 pe linia SDA i citete c linia a fost
schimbat de alt master care a trimis 0 pierde controlul liniei oprind generarea ceasului i
controlul liniei SDA. Astfel se asigur c numai un singur master va avea controlul la un anumit
moment. Dup ce acesta trimite datele masterul ce a pierdut negocierea poate ncerca din
nou iniierea unui transfer.
Generarea semnalului de ceas este responsabilitatea masterului. Fiecare master genereaz
propriul semnal de ceas atunci cnd se transfer date pe magistral.
2

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Frecvenele de comunicaie ce pot fi atinse pe aceast magistral depind de configurarea


dispozitivelor. Astfel se poate realiza comunicaia la frecvene de 100kHz (Standard), 400kHz
(Fast), 3.4MHz (High-speed mode vesiunea 2.0) i chiar 5Mhz (Ultra Fast-mode versiunea
4.0) . Portul TWI al plcii Arduino Uno (al microcontrolerului ATmega328) suport frecvene de
comunicaie de pn la 400kHz.

Utilizarea bibliotecii software Wire


Mediul Arduino IDE pune la dispoziie funcii pentru utilizarea interfeei de comunicaie prin 2
fire (TWI) prin intermediul unei biblioteci suplimentare. Aceasta se numete Wire [1] i este
necesar includerea fiierului Wire.h pentru folosirea urmtoarelor funcii.
Pentru verificarea strii dar i configurarea comunicaiei putem accesa direct 4 registre:
Registru
TWCR
TWSR
TWDR
TWBR

Nume

Funcie
Registru ce controleaz comenzile ce se dau prin
Two Wire Control Register
interfaa TWI.
Registru de status pentru aciunile ce se
Two Wire Status Register
realizeaz prin interfaa TWI.
Registru ce conine datele ce trebuie transmise /
Two Wire Data/Address Register
primite
Registru ce conine frecvena la care are loc
Two Wire Bit Rate Register
comunicaia (n Hz)

Wire.begin() este necesar i trebuie apelat naintea folosirii oricrei alte funcii a
bibliotecii ntruct iniializeaz buferele necesare comunicaiei. De asemenea, apeleaz funcia
twi.init(), funcie ce configureaz porturile ce vor fi folosite pentru comunicaia TWI
(configureaz cu valori implicite pinii PC4 pentru SDA i PC5 pentru PLC), seteaz implicit rata
de transfer la 100 kHz i activeaz comunicaia prin interfaa TWI. Pentru iniializarea
comunicaiei la o alt frecven trebuie setat registrul TWBR naintea apelrii acestei funcii
(exemplu TWBR=400000L pentru o frecven de 400kHz).
Wire.begin(adres) seteaz registrul TWAR cu adresa primit ca parametru. Aceast
funcie configureaz microcontrolerul ca slave, astfel trebuie apelate funciile onRequest()
sau onReceive() nainte de apelarea acestei funcii.

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Wire.beginTransmission(adres) funcie ce seteaz variabile interne n biblioteca


Wire pentru pregtirea transmisiei ctre o anumit adres folosit cnd microntrolerul va fi
configurat ca master. Precede o funcie write().
Wire.write(valoare)
sau
Wire.write(ir
de
caractere)
sau
Wire.write(date, lungime date) pune datele primite n lista de argumente n
bufferul de date. Aceast funcie nu realizeaz aciunea de transmitere a datelor. Doar
configureaz n bufferul TWDR datele primite ca parametru. n cazul n care parametrul primit
este valoare (de tip byte sau uint_8) doar un singur byte se configureaz n registrul TWDR.
Dac se trimite ca parametru un ir de caractere se va apela de fapt funcia
Wire.write(date, lungime date) cu parametrul lungime date de fapt lungimea
irului de caractere. n cazul apelrii funciei Wire.write(date, lungime date), n
bufferul TWDR sunt puse datele din parametrul date pn la lungimea maxim
BUFFER_LENGTH (de 32 bytes). Ce depete aceast valoare este ignorat.
Wire.endTransmission() apeleaz rutina ce realizeaz de fapt aciunea de transmitere
a datelor dac microntrolerul este configurat ca master. Funcia returneaz:
- 0 transmiterea datelor a avut loc cu succes;
- 1 bufferul de transmitere date este prea mare;
- 2 dup trimiterea adresei s-a citit un NACK. A aprut o eroare i masterul trebuie s
trimit o comand de STOP;
- 3 dup trimiterea datelor s-a citit un NACK. Slave-ul cu adresa respectiv nu are date
de trimis i masterul trebuie s trimit o comand STOP sau START n mod repetat;
- 4 alt eroare.
Wire.requestFrom(adres, lungime) dac microcontrolerul este configurat ca
master funcia solicit slave-ului cu adresa adres un numr de octei egal cu lungime.
Apelarea acestei funcii reseteaz bufferul TWDT. Dac se trimite ca parametru o lungime mai
mare de lungimea registrului interogat, se scriu n registrul TWDT numai numrul de octei
corespunztori lungimii registrului interogat ignorndu-se parametrul lungime.
Wire.read() returneaz urmtorul octet din registrul TWDT eliminndu-l din bufer.
Wire.onReceive(handler) seteaz ca funcia handler s fie apelat n momentul n
care sunt transmise date pe interfaa TWI dac micocontrolerul va fi setat ca slave. Funcia
handler trebuie s fie definit astfel: void handler(int byteCount), singurul
parametru byteCount trebuie s fie un integer ce reprezint numrul de octei primii.
Wire.onRequest(handler) seteaz ca funcia handler s fie apelat n momentul
n care sunt cerute date pe interfaa TWI dac micocontrolerul va fi setat ca slave. Funcia
4

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

handler trebuie s fie definit astfel: void handler(void). Trebuie apelat funcia
write() pentru a se configura registrul TWDT cu valoarea cerut dup care trebuie apelat
funcia twi_reply(1) pentru a se realiza transmiterea datelor i transmitere ACK (prin
valoarea 1 transmis ca parametru).

Utilizarea senzorului de temperatur TMP102


TPM102 [2] este un senzor de temperatur cu o ieire compatibil TWI. Rezoluia de citire a
temperaturii este de 0.0625 grade Celsius i poate msura temperaturi pe o plaj de la -40 la
+145 grade Celsius.
Configuraia pinilor este urmtoarea:
-

V+ - alimentarea ntre 0.5 i 3.6 V nominal 3.3V


GND legtura la mas
SCL legtur la interfaa TWI, SCL (Serial Clock Line)
SDA legtur la interfaa TWI, SDA (Serial Data Line)
ALERT pin pe care se poate configura o ieire de tip
treapta pentru emiterea unei alerte la ieirea dintr-un
interval de temperatur TLOW i THIGH
ADD0 pin pentru configurarea adresei senzorul n
protocolul TWI.

Se pot nseria 4 astfel de senzori ntruct configuraia lor este de slave. Pentru a se distinge
adresa la care vor rspunde fiecare prin protocolul TWI, se va configura adresa fiecruia cu
ajutorul pinului ADD0. Dac acest pin este legat la GND atunci senzorul rspunde la adresa 0x48
adic 72, dac acesta este conectat la 3.3V
adresa la care rspunde senzorul este 0x49
adic 73. Dac facem conexiunea pinului ADD0
la SDA senzorul va rspunde la adresa 0x4A
adic 74. Ultima posibilitate este de conectare
a pinului la SCL caz n care senzorul va
rspunde la adresa 0x4B.
Senzorul dispune de 5 registre configurabile:
-

Pointer register registru ce poate fi


folosit ca pointer pentru celelalte 4
registre.
5

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Temperature Register registru ce conine temperatura msurat de senzor.


Configuration Register registru de configurare a modului de funcionare a senzorului.
TLOW Register registru de configurare a unei temperaturi minime mai jos de care se
poate configura o alert.
THIGH Register registru de configurare a unei temperaturi maxime mai sus de care se
poate configura o alert.

Registru pointer are urmtoarea configurare:

Bii P1 i P0 se pot configura astfel:


Acest registru trebuie configurat nainte
de primirea unei comenzi de citire sau
scriere prin comanda respectiv fiind
scris sau citit o valoare din registrul
ctre care pointeaz Pointer Register.
Valoarea implicit a acestui registru este 00 fiind astfel selectat pentru orice operaie registrul
Temperature Register.
Registrul Temperature Register este un
registru pe 16 bii (2 octei) de la care se
poate citi valoarea temperaturii msurate.
Acesta este configurat implicit ca un registru
de 12 bii dar se poate folosi i varianta
extins de 13 bii prin setarea valorii bitului
EM (Extended Mode) pe 1; acesta face parte
din Configuration Register. Configurarea extins este folositoare la msurarea temperaturilor
peste 1240 Celsius (pn la limita de 1450 Celsius).
Registrul Configuration Register este
utilizat pentru configurarea senzorului
prin configurarea urmtorilor bii:
-

OS - One-Shot/Conversion Ready
R1/R0 - Converter Resolution

F1/F0 - Fault Queue


POL - Polarity

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

TM - Thermostat Mode
SD - Shutdown Mode
CR1/CR2 - Conversion Rate
AL - Alert
EM - Extended Mode

Registrele THIGH i TLOW sunt registre tot pe 16 bii i configurai pe 12 sau 13 bii n funcie de
bitul EM. n cazul n care se seteaz bitul TM pe 0 (Comparator mode) pinul ALERT al senzorului
va fi activat la ieirea temperaturii din intervalul THIGH ,TLOW.

Proiect termometru TMP102 cu nregistrare


Dorim s realizm un sistem ce preia temperatura msurat de senzorul TMP102, o afieaz pe
un LCD alfanumeric, o transmite serial ctre PC pentru a fi nregistrat ntr-un tabel Excel i
realizeaz un grafic cu evoluia valorilor nregistrate obinnd ceva similar imaginii urmtoare.

Vom utiliza urmtoarea schem de interconectare a afiajului LCD 16x2 cu placa de dezvoltare
Arduino Uno i cu senzorul TMP102:
7

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Programul ce va rula pe placa Arduino va avea nevoie de urmtoarea parte de iniializri:


#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(12, NULL, 11, 9,8,7,6);
const int tmp102Address = 0x48;
float temperatura;

Funcia setup() a programului va trebui s iniializeze comunicaia prin interfaa TWI, LCD-ul
cu 16 coloane i 2 linii i comunicaia serial cu PC-ul.
void setup() {
lcd.begin(16, 2);
lcd.noCursor();
Wire.begin();
Serial.begin(9600);
}

Funcia principal loop() va implementa funcia de afiare a temperaturii pe LCD. Astfel vom
prelua temperatura de la TMP102 prin funcia getTemperature(), dup care vom poziiona
cursorul pe poziia 0 , 1 coloana 0, linia 1 i o vom afia. n cazul n care temperatura este mai
mic de 10 grade vom aduga un spaiu pentru a pstra poziia pe ecran. La fiecare achiziie
vom transmite valoarea msurat i ctre PC. Parametrul funciei delay() de la sfritul
codului ne va da temporizarea de nregistrare a valorilor pe PC.
void loop(){
temperatura = getTemperature();
lcd.setCursor(0, 1);
if (temperatura >= 0) lcd.print(" ");
else
{
lcd.print("-");
temperatura = - temperatura;
}
if (temperatura < 10) lcd.print(" ");
lcd.print(temperatura);
Serial.println(temperatura);
delay(5000);
}

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Funcia de preluare a temperaturii va realiza conexiunea la senzor i solicitarea temperaturii


msurate. Dup iniializarea variabilelor se va realiza un apel de tip general call (0x00) ctre
toate perifericele pentru stabilirea masterului i nceputul comunicaiei. Dup primirea ACK se
va solicita un request ctre senzor pentru 2 octei. Deoarece Pointer register este implicit pe
0x00 se va solicita de fapt valoarea temperaturii de la senzor. Dup primirea unui al doilea ACK
se pot prelua cei doi octei primii din registrul TWDT. Deoarece temperatura este pe 12 bii
valoarea este shift-at cu 4 locaii la stnga. De asemenea ordinul de mrime ntre valoarea
primit i cea real este diferit astfel trebuie s nmulim rezultatul cu 0.0625 (rezoluia). Astfel
obinem valoarea temperaturii n grade Celsius.
float getTemperature()
{
byte MSB = 0x00;
byte LSB = 0x00;
int TempCitita = 0;
float TempCelsius = 0.0;
Wire.beginTransmission(tmp102Address);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(tmp102Address,2);
Wire.endTransmission();
MSB = Wire.read();
LSB = Wire.read();
//temperatura este pe 12
//shift-ata la stanga cu
TempCitita = ((MSB << 8)
TempCelsius = TempCitita
return TempCelsius;

biti cu ultimii 4 biti 0 astfel trebuie


4 pozitii
| LSB) >> 4;
* 0.0625;

Pe PC va rula un script VBA (inclus ntr-un fiier Excel) care va prelua de la portul serial valorile
msurate i le va nregistra ntr-un worksheet. Pentru a realiza acest lucru vom implementa o
interfa de comand simpl (worksheet Control) care va conine urmtoarele repere:
Celula B2 (Port) va conine portul serial pe care este conectat placa Arduino (se
completeaz de ctre utilizator);
Celula B3 (Status) va conine statusul de conectare (not connected / connected);
Celula B5 (StartRow) va conine linia de start de la care se vor nscrie valorile primite de
la placa Arduino n worksheet-ul Data (se completeaz de ctre utilizator) permite

10

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

reluarea nregistrarea valorilor msurate fr a suprascrie valorile precedent


achiziionate;
Celula B6 (CurrentRow) va conine numrul de valori achiziionate;
Butonul Open Port va iniializa conexiunea serial cu placa Arduino;
Butonul Read va porni preluarea valorilor transmise serial pn la apsarea butonului
Stop Read;
Butonul Close Port va reseta (nchide) conexiunea serial;
Butonul Draw Chart va prelua valorile nregistrate n worksheet-ul Data i va realiza
graficul de evoluie n worksheet-ul Chart;
Butonul Clear Data va terge toate valorile nregistrate i graficul realizat.

Procedurile din spatele butoanelor Open Port, Read, Stop Read i Close Port se bazeaz pe
funciile CommOpen, CommRead i CommClose preluate din exemplul [3]. Astfel, butonul Open
Port va iniializa conexiunea serial i va activa butoanele Read, Stop Read i Close Port:
Private Sub btnOpen_Click()
Dim intPortID As Integer
11

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Dim lngStatus As Long


Dim iRet As Integer
Dim LastErr As String
intPortID = CInt(Worksheets("Control").Range("B2"))
lngStatus = CommOpen(intPortID, "\\.\COM" & CStr(intPortID), _
"baud=9600 parity=N data=8 stop=1")
If (lngStatus = 0) Then
Worksheets("Control").Range("B3") = "connected"
Worksheets("Control").btnRead.Enabled = True
Worksheets("Control").btnClose.Enabled = True
Worksheets("Control").btnOpen.Enabled = False
startrow = CInt(Worksheets("Control").Range("B5").Value)
Else
Worksheets("Control").Range("B3") = "not connected"
Worksheets("Control").btnRead.Enabled = False
Worksheets("Control").btnClose.Enabled = False
Worksheets("Control").btnOpen.Enabled = True
iRet = CommGetError(LastErr)
Call MsgBox(LastErr, vbCritical)
End If
End Sub

Butonul Read va prelua valorile venite pe conexiunea serial i le va nscrie n worksheet-ul Data
mpreun cu ora exact la care s-a efectuat msurtoarea pn la apsarea butonului Stop
Read. Variabila status este declarat global la fel ca i startrow i currentrow.
Private Sub btnRead_Click()
Dim intPortID As Integer
Dim lngStatus As Long
Dim temp As String
Dim strData As String
status = "read"
Worksheets("Control").btnStop.Enabled = True
Worksheets("Control").btnRead.Enabled = False
Worksheets("Control").btnDraw.Enabled = False
Worksheets("Control").btnClear.Enabled = False
currentrow = startrow
strData = ""
intPortID = CInt(Worksheets("Control").Range("B2").Value)
While (status = "read")
DoEvents
lngStatus = CommRead(intPortID, temp, 10)
temp = Replace(temp, vbCrLf, Chr(13))
temp = Replace(temp, Chr(10), "")
12

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

While (Len(temp) > 0)


DoEvents
If InStr(1, temp, Chr(13)) > 0 Then
strData = strData + Left(temp, InStr(1, temp,_
Chr(13)) - 1)
temp = Right(temp, Len(temp) - InStr(1, temp,_
Chr(13)))
Worksheets("Data").Range("B" & currentrow).Value =
strData
Worksheets("Data").Range("A" & currentrow).Value =
Time
Worksheets("Control").Range("B6").Value = currentrow
currentrow = currentrow + 1
strData = ""
Else
strData = strData + temp
temp = ""
End If
Wend
Wend
End Sub
Private Sub btnStop_Click()
Worksheets("Control").btnRead.Enabled = True
Worksheets("Control").btnStop.Enabled = False
Worksheets("Control").btnDraw.Enabled = True
Worksheets("Control").btnClear.Enabled = True
status = "stop"
End Sub

Butonul Close Port va opri (nchide) conexiunea serial.


Private Sub btnClose_Click()
Dim intPortID As Integer
Dim lngStatus As Long
Dim iRet As Integer
Dim LastErr As String
intPortID = CInt(Worksheets("Control").Range("B2").Value)
lngStatus = CommClose(intPortID)
If (lngStatus = 0) Then
Worksheets("Control").Range("B3") = "not connected"
Worksheets("Control").btnRead.Enabled = False
Worksheets("Control").btnStop.Enabled = False
Worksheets("Control").btnClose.Enabled = False
13

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Worksheets("Control").btnOpen.Enabled = True
Else
iRet = CommGetError(LastErr)
Call MsgBox(LastErr, vbCritical)
End If
lngStatus = CommSetLine(intPortID, LINE_RTS, False)
lngStatus = CommSetLine(intPortID, LINE_DTR, False)
End Sub

Proiect termometru TMP102 cu alarm


n cel de al doilea proiect al acestei lucrri vom utiliza facilitatea de alarm automat a
senzorului TMP102. Pinul ALERT al circuitului TMP102 se va activa de fiecare dat cnd
temperatura msurat va depi valoarea THIGH stocat n registrul intern corespondent.
Dezactivarea pinului ALERT se va face
cnd temperatura msurat va scdea
sub pragul TLOW. Prin activarea pinului
ALERT se nelege trecerea din 1 logic
n 0 logic dac bitul POL din registrul
de configurare este 0 i viceversa dac
bitul POL este 1. n funcie de modul de
funcionare a senzorului (comparator
TM=0 sau ntrerupere TM=1) pinul
poate avea un comportament de nivel
(rmne activ pe toat durata
evenimentului)
sau
ntrerupere
(genereaz un impuls la activarea /
dezactivarea alarmei de temperatur)
comportament ilustrat de diagrama
alturat. Proiectul de fa va ilustra
declanarea alarmei de temperatur
prin conectarea unui LED pe pinul
ALERT, LED ce va rmne aprins pe toat durata alarmei de temperatur schem de
interconectare prezentat pe pagina urmtoare. Alarma va fi semnalizat suplimentar pe
afiajul LCD prin apariia ALARMA pe linia a doua
a afiajului acest comportament va fi dictat de
programul care va rula pe placa Arduino.

14

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

15

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Partea de iniializare a programului va conine bibliotecile necesare, declararea obiectului de tip


LiquidCrystal, constantele de adres i interval alarm i variabila de citire temperatur:
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(12, NULL, 11, 9,8,7,6);
const int tmp102Address = 0x48;
const float TLOW = 25;
const float THIGH = 26;
byte alarma = 0;

Funcia setup() va iniializa obiectul ataat afiajului LCD, comunicaia I2C i va seta limitele
de temperatur a intervalului de alarm prin intermediul funciei setLimit(TLOW,THIGH):
void setup() {
lcd.begin(16, 2);
lcd.noCursor();
Wire.begin();
setLimit(TLOW,THIGH);
}
void setLimit(float low, float high)
{
byte MSB;
byte LSB;
int Temp;
Temp = low / 0.0625;
Temp = Temp << 4;
LSB = (byte) (Temp & 0xff);
MSB = (byte) ((Temp >> 8) & 0xff);
Wire.beginTransmission(tmp102Address);
Wire.write(0x02);
Wire.write(MSB);
Wire.write(LSB);
Wire.endTransmission();
Temp = high / 0.0625;
Temp = Temp << 4;
LSB = (byte) (Temp & 0xff);
MSB = (byte) ((Temp >> 8) & 0xff);
Wire.beginTransmission(tmp102Address);
16

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Wire.write(0x03);
Wire.write(MSB);
Wire.write(LSB);
Wire.endTransmission();
}

Funcia loop() se va ocupa cu afiarea temperaturii pe afiajul LCD (achiziia temperaturii se


face prin intermediul funciei getTemperature() - identic cu cea din proiectul anterior),
cu verificarea depirii pragului de alarm i afiarea ALARMA dac este cazul. Comanda LEDului nu se face prin intermediul programului ce ruleaz pe placa Arduino ci direct de ctre
ieirea ALERT a senzorului TMP102.

void loop(){
float temperatura = 0.0;
temperatura = getTemperature();
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.setCursor(5,0);
if (temperatura >= 0) lcd.print(" ");
else
{
lcd.print("-");
temperatura = - temperatura;
}
if (temperatura < 10) lcd.print(" ");
lcd.print(temperatura);
if (temperatura > THIGH) {
lcd.setCursor(0,1);
lcd.print("ALARMA");
alarma=1;
}
else {
if (alarma==0) {
lcd.setCursor(0,1);
lcd.print("
");
}
else {
if (temperatura<TLOW) alarma = 0;
}
}
delay(1000);
}
17

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Referine online
[1] Wire Library http://arduino.cc/en/Reference/Wire
[2] Local Temperature Sensors - Digital Output - TMP102 http://www.ti.com/product/tmp102
[3] Serial Port Communication in Excel (VBA)
http://dev.emcelettronica.com/serial-port-communication-excel-vba

18

S-ar putea să vă placă și