LM75-ös I2C hőmérő Arduinoval

Tegnap este kinéztem, ma délután megvettem, estére pedig már össze is építettem az LM75-ös I2C-s hőmérőmet. A cucc egyébként a pneumobilhoz kell, ki kell majd mérjük, érdemes-e hőcserélőt használnunk.

Az LM75 itthon könnyen beszerezhető, közepes árfekvésű (kb. 400 Ft) IC, SOIC8 tokozású. (Ez azt jelenti, hogy azért kell hozzá némi kézügyesség meg egy jó páka, de azért távolról sem lehetetlen.) Szeretem az SMD-t, olcsóbb, kisebb, de kísérletezésnél jobb a DIP.

Így hát készítettem neki (még régebben, és nem kimondottan ehhez a típushoz, csak tudtam, hogy kelleni fog) egy SOIC-DIP breakout nyákot, amit balga módon túl szélesre terveztem, nem gondoltam arra, hogy ennek el is kell férnie a próbapanelen. Viszont van hely a lábaknál a feliratoknak! 🙂 

Breakout boardok

SOIC8 és TSSOP16 -> DIP breakout boardok

Azért némi hajlított alkatrészlábbal kivezettem a panel alól a cuccot és rákötöttem az arduino hardveres I2C (TWI) interfészére.

LM75 hőmérő próba

LM75 az Arduino Mega-val I2C buszon összekötve

A programozás egy rövid Arduino reference manual olvasgatásból, az adatlap fölötti fejvakarásból és sok bináris számokon gondolkodós fejvakarásból állt, de kb. 1 óra alatt megvolt nulláról.

Most van egy függvényem, ami egy előjeles integert ad vissza, ami a celsius-fokban mért  hőmérséklet tízszeresét tartalmazza. Ez azért volt szükséges, mert az LM75 fél fok pontosságú kimenettel rendelkezik. Sikertelen olvasás esetén -32768 a jutalmunk. (direkt)

A readTemp(byte address) függvény paraméterként egy hárombites számot vár (0-7) ami a keresett LM75 felhasználó által beállított címe. (Ez az A0, A1, A2 lábak tápra vagy testre kötögetésével állítható be.)

A mintaprogram másodpercenként kiköpi magából a mért hőmérsékletet a virtuális soros (USB) porton.

Remélem hasznosra, érthetőre sikerült. A sketchbook letölthető innen: lm75_test-1. Használjátok egészséggel!

UPDATE: hibásan kezelte a negatív hőmérsékletet (kipróbáltam a fagyasztóban), de javítva! Forráskód:

#include  // I2C library

// written by Pal BOLE
// http://astech.hu
// source: LM75's datasheet

void setup() {
Serial.begin(115200);
Wire.begin();
// initializing TWI hardware as I2C-master

// print out some fancy welcome message
Serial.println("AStech thermometer initializing...");
}

signed int readTemp(byte address) {
// address is user defined
// via LM75's A0, A1 and A2 pins

// 0b1001??? 7-bit I2C address -
// the first 4 bits are programmed in factory
#define ADDR 0b1001000

signed int temperature = 0;
byte data = 0;

Wire.requestFrom((ADDR | address), 2);
// OR-ing the two half-address together

while ((Wire.available() != 2) && (data < 0xff)) {     // do not wait more, than 0.5 msec     delayMicroseconds(2);     data ++; // this has nothing to do with data!   }   if (Wire.available()) { // if we've received any data     data = Wire.receive(); // 8 high bits     byte negative = false; // default     if (data >> 7) { // if negative <- (MSB == 1)       negative = true;       data &= 0b01111111; // masking out the negative value     }     temperature = data;     if (negative) {       temperature |= 0xff80;       // OR-ing to get the negative integer value     }     // multiply it with ten     temperature = 10 * temperature;     // read the second byte: only one interesting bit     data = Wire.receive(); // LSB     data = data >> 7;

// multiply it with 5 and add to temperature
temperature += 5 * data; // adding it

}
else {
temperature = 0x8000; // indicate an error
}

return temperature;
}

void loop() {
delay(1000);

Serial.println(readTemp(0b000), DEC);

// That's all.
}
This entry was posted in experiments and tagged , , , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *