V predchádzajúcom článku sme si predstavili zbernicu 1-wire, po ktorej mnohé zariadenia komunikujú. Dnes si pripojíme snímač teploty DS18B20. V tomto príklade použijeme len jeden snímač, ale pripojiť ich možme hneď niekoľko bez väčších zmien v kóde. Datasheet a popis pinov DS18B20 nájdete tu. V jednoduchosti nám stačí pripojiť pin 1 na ZEM (-), pin 2 na Arduino pin 6, pin 3 na +5V. Ešte je potrebné doplniť 4.7k rezistor medzi pin 2 a 3 snímača.
Ako prvý nasleduje kód, ktorý nám vyhladá všetky 1-wire zariadenia pripojené na zbernici. Následne vypíše ich unikátne adresy, ktoré si poznačíme a použijeme ich v ďalšom kóde ako identifikátor nášho teplotného čidla. Nezabudnite si doplniť knižnice pre 1-wire zbernicu:
// Zdroj: http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html #include <OneWire.h> OneWire ds(6); // DS18B20 pripojime na pin 6 void setup(void) { Serial.begin(9600); discoverOneWireDevices(); } void discoverOneWireDevices(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; Serial.print("Hladam 1-Wire zariadenia...\n\r"); while(ds.search(addr)) { Serial.print("\n\rNajdene \'1-Wire\' zariadenia a ich adresa:\n\r"); for( i = 0; i < 8; i++) { Serial.print("0x"); if (addr[i] < 16) { Serial.print('0'); } Serial.print(addr[i], HEX); if (i < 7) { Serial.print(", "); } } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC nieje spravne!\n"); return; } } Serial.print("\n\r\n\rKoniec.\r\n"); ds.reset_search(); return; } void loop(void) { // nothing to see here }
Tu už nasleduje samotný kód teplomeru, ktorý vypisuje aktuálnu teplotu na seriálovú konzolu (ako je zobrazené na prvom obrázku).
// Zdroj: http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 6 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress insideThermometer = { 0x28, 0xAA, 0x08, 0x03, 0x03, 0x00, 0x00, 0xDF }; DeviceAddress outsideThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 }; DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F }; void setup(void) { // teplota sa bude zobrazovat na seriovej konzole Serial.begin(9600); // Start kniznice sensors.begin(); // Nastavenie rozlisenia na 10 bitov sensors.setResolution(insideThermometer, 10); sensors.setResolution(outsideThermometer, 10); sensors.setResolution(dogHouseThermometer, 10); } void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); if (tempC == -127.00) { Serial.print("Chyba, senzor neodpoveda"); } else { Serial.print("C: "); Serial.print(tempC); } } void loop(void) { delay(2000); Serial.print("Zistujem teplotu...\n\r"); sensors.requestTemperatures(); Serial.print("Vnutorna teplota: "); printTemperature(insideThermometer); Serial.print("\n\r"); /*Serial.print("vonkajsia: "); printTemperature(outsideThermometer); Serial.print("\n\r"); Serial.print("Pivnica: "); printTemperature(dogHouseThermometer); Serial.print("\n\r\n\r");*/ }