Documente Academic
Documente Profesional
Documente Cultură
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
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.
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).
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:
-
OS - One-Shot/Conversion Ready
R1/R0 - Converter Resolution
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.
Vom utiliza urmtoarea schem de interconectare a afiajului LCD 16x2 cu placa de dezvoltare
Arduino Uno i cu senzorul TMP102:
7
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);
}
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
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
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
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
14
15
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
Wire.write(0x03);
Wire.write(MSB);
Wire.write(LSB);
Wire.endTransmission();
}
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
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