Работа Arduino с датчиком DS18B20
Рассмотрим как при помощи Arduino считывать показания с цифрового датчика температуры DS18B20. В настоящий момент м/с DS18B20 фирмы Dallas является наиболее распространенным и доступным цифровым датчиком температуры. Работает он по шине 1-wire.
Датчик может запитываться двумя способами - внешним питанием (3 провода) или паразитным (питание от шины, 2 провода). Расписывать эти режимы не буду, все есть в документации. Отмечу лишь то, что в данном проекте мы будем использовать нормальное питание датчика.
Схема подключения датчика DS18B20 к Arduino приведена ниже. Резистор номиналом 4.7 кОм.
Рабочий скетч представлен ниже. Он взят из интернета, я лишь закомментировал лишние строки, чтобы на serial monitor выводилась только текущая температура.
#include/* * получаем температуру от DS18S20 */ OneWire ds(10); // линия 1-Wire будет на pin 10 void setup(void) { Serial.begin(9600); } void loop(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //Serial.print("No more addresses.n"); ds.reset_search(); return; } /*Serial.print("R="); for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); }*/ if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!n"); return; } if ( addr[0] != 0x10) { Serial.print("Device is not a DS18S20 family device.n"); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // запускаем конвертацию delay(5000); // скорее всего достаточно 750ms // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // считываем ОЗУ датчика /*Serial.print("P="); Serial.print(present,HEX); Serial.print(" ");*/ for ( i = 0; i < 9; i++) { // обрабатываем 9 байт data[i] = ds.read(); //Serial.print(data[i], HEX); //Serial.print(" "); } /*Serial.print(" CRC="); Serial.print( OneWire::crc8( data, 8), HEX); Serial.println();*/ // высчитываем температуру :) int HighByte, LowByte, TReading, Tc_100; LowByte = data[0]; //Serial.print("LB= ");Serial.print(LowByte,HEX); HighByte = data[1]; //Serial.print(" HB= ");Serial.print(HighByte,HEX); TReading = (HighByte << 8) + LowByte; Tc_100 = TReading/2; Serial.print(" T = ");Serial.print(Tc_100); Serial.println(); }
Скачать библиотеку OneWire и скетч в формате PDE
Автор: taliban