Asi najčastejšie vidíme u „pokročilých“ Arduino užívateľov meranie teploty. No a najčastejšie sa používa digitálny teplomer DS18B20 v puzdre TO-92 od Dallas. Je dobrý, je presný – ale je (relatívne) veľký (aj SO-8 je veľké!) a (relatívne) drahý – ak si ho nenecháte zaslať zdarma ako „engineering sample“.
Hľadal som alternatívu – digitálny, lacný, aspoň trochu presný, a hlavne malý. Digitálny = OneWire alebo I2C, aspoň trochu presný je 0.25°C a malý je SOT-23, napájanie 3.3V, s toleranciou 5V na I2C pinoch, nízky odber. Našiel som v ponuke Farnell – EMC1001, dokonca aj lacný (0,79€/kus), čo je 3,5x lacnejšie ako DS18B20. Píše sa, že je určený pre zbernicu SMBus, čo je vlastne len podskupina I2C. Keďže mám celkom rád I2C, potešil som sa 🙂 Okrem merania teploty obsahuje aj funkcionalitu termostatu, to mi ale netreba. Pre viac info si treba pozrieť datasheet na stránke výrobcu. Ešte na porovnanie:
- DS18B20 – kľudový odber 0.75μA, pri meraní 1mA (meranie trvá 187.5 ms pri presnosti 0.25°C)
- EMC1001 – kľudový odber 4.8μA, pri meraní 36μAUkážkový kód nižšie, inšpiráciu som hľadal na bildr.org . Knižnica i2cmaster (stiahni).
#include <i2cmaster.h> void setup(){ Serial.begin(9600); Serial.println("EMC1001 test"); i2c_init(); PORTC = (1 << PORTC4) | (1 << PORTC5); // zapni I2C pull-up } void loop(){ byte dev = 0x49 << 1; // default slave adresa, da sa zmenit rezistorom na pin-e 1 byte data_low = 0; byte data_high = 0; i2c_start_wait(dev+I2C_WRITE); i2c_write(0x00); // register 0x00 i2c_rep_start(dev+I2C_READ); data_high = i2c_readAck(); // precitaj jeden byte i2c_readNak(); i2c_stop(); i2c_start_wait(dev+I2C_WRITE); i2c_write(0x02); // register 0x02 i2c_rep_start(dev+I2C_READ); data_low = i2c_readAck(); // precitaj jeden byte i2c_readNak(); i2c_stop(); int data = ((data_high << 8) | data_low) >> 6; // konverzia Serial.println(data * 0.25, 2); delay(1000); }
Pridaj komentár