DS18B20 цифровой термометр (лайт версия)

[cryout-multi][cryout-column width=»1/4″]ds18b20_ds1820_ds18s20_pic_2 [/cryout-column] [cryout-column width=»3.4″]Рассмотрим как при помощи Arduino считывать показания с цифрового датчика температуры DS18B20. В настоящий момент м/с DS18B20 фирмы Dallas является наиболее распространенным и доступным цифровым датчиком температуры. Работает он по шине 1-wire. Даташит датчика: DS18B20[/cryout-column] [/cryout-multi]

Датчик может запитываться двумя способами — внешним питанием (3 провода) или паразитным (питание от шины, 2 провода). Расписывать эти режимы не буду, все есть в документации. Отмечу лишь то, что в данном проекте мы будем использовать нормальное питание датчика.

Схема подключения датчика DS18B20 к Arduino приведена ниже. Резистор номиналом 4.7 кОм. (На самом деле не только,  но за  подробностями по ссылке выше).

ds18b20_arduino_ile_kullanimi_baglanti_sema

Для  работы с протоколом OneWire установим библиотеку (скачать OneWire)

#include <OneWire.h>

/*
* получаем температуру от 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();
}

Результат:
arduino17-3
По материалам сайта: схем.нет
Метки: , , , , , , , , , , . Закладка Постоянная ссылка.

Комментарии запрещены.