реклама:

Температурные датчики DS18B20. Часть 12.

Температурные датчики DS18B20

Подключили почти все самое важное кроме температурных датчиков. Куда же нам без них! В проекте используются цифровые датчики DS18B20. Цифровые – для нас это означает, что они обеспечивают достаточно хорошую точность и дальность подключения. Длина провода может составлять до 100м. Для подключения я использовал экранированный сигнализационный провод 4х0.22 Для тех, кто не умеет паять есть вариант купить готовый датчик в гильзе из нержавейки и с готовым проводом. Для тех, кто не ищет легких путей можно приобрести сам датчик в корпусе TO-92 и припаять к нему провода самостоятельно. Могу сказать, что заказать на aliexpress 5 готовых датчиков обычно выходит дешевле, чем купить по месту голые датчики и возиться с пайкой. Тут все зависит от вашего желания и времени.

ЭДатчик DS18B20 для Arduino в гильзе

Датчик DS18B20 в гильзе

На самом деле, все датчики можно посадить на один «общий» провод, но для надежности я использовал отдельный кабель для каждого датчика. Датчик подключается довольно просто. На него надо подать +5В, минус, и выходной сигнал подключить ко входу arduino. Но так датчик работать не будет. Для правильно работы надо еще «закоротить» выход датчика, через резистор 4.7кОм на питание +5В.

Вот таблица соответсвия контактов DS18B20 и платы arduino:

Датчик T3, DS18B20 Контакты Arduino
GNDGND
S8
VCC5V

Схема подключения одного датчика T3:

Датчик DS18B20 для Arduino

Подключение одного датчика DS18B20

Все остальные датчики подключатся таким же образом.

ЭДатчик DS18B20 для Arduino

Подключение четырех датчиков DS18B20

Схема может показаться сложной, на самом деле все просто – мы все контакты VCC подключили к +5V, все контакты GND подключили к GND, выходы из датчиков подключили на 8, 7, 6 и 5 контакты Arduino, при этом, между каждым выходом и +5V поставили по резистору 4.7К

Пример реального подключения:

Датчик DS18B20 для Arduino

Подключение одного датчика DS18B20

Датчик DS18B20 для Arduino

Подключение датчика DS18B20 без пайки

Датчик DS18B20 для Arduino

Подключение резистора 4.7К без пайки

Самое время загрузить тестовый скетч, и проверить, что датчик температуры для arduino подключен корректно! Сначала пример найдет датчик, затем начнет выводить на наш LCD дисплей его показания.

// include the library code:
#include <LiquidCrystal.h>
#include <OneWire.h>

// LCD пин управления яркостью
#define PWM_LED_PIN 3 
// LCD пин управления контрастом
#define PWM_LED_CONTRAST 4 
// LCD другие пины
#define PIN_LCD_RS 39
#define PIN_LCD_EN 41
#define PIN_LCD_D4 43
#define PIN_LCD_D5 45
#define PIN_LCD_D6 47
#define PIN_LCD_D7 49
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd( PIN_LCD_RS, PIN_LCD_EN, PIN_LCD_D4, PIN_LCD_D5, PIN_LCD_D6, PIN_LCD_D7 );
OneWire  ds(5);

byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
  
void setup() {   
  analogWrite( PWM_LED_PIN, 255 );
  analogWrite( PWM_LED_CONTRAST, 50 );  
  lcd.begin(16, 2); //настройка дисплея - 16x02
  lcd.print("House4u sol.proj"); //выводим приветсвие  
  lcd.setCursor(0, 1); //перевод курсора на 2 строку
  
  if ( !ds.search(addr)) 
  {
    lcd.print("No more addr...");   
    ds.reset_search();
    delay(1000);
    return;
  }
  
  if (OneWire::crc8(addr, 7) != addr[7]) 
  {    
      lcd.print("CRC error!");
      delay( 1000 );
      return;
  }
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      lcd.print("Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      lcd.print("Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      lcd.print("Chip = DS1822");
      type_s = 0;
      break;
    default:
      lcd.print("Unknown device.");
      return;
  } 
  delay( 2000 );
  lcd.setCursor(0, 1); //перевод курсора на 2 строку
  lcd.print("                ");
}

void loop() 
{     
  lcd.setCursor(0, 1); //перевод курсора на 2 строку      
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
    
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad
  
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();    
  }
  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
 
  lcd.print("T=");
  lcd.print(celsius);
  lcd.print("C");
}

Если мы все подключили верно, то должны увидеть температуру:

Результат выполнения на дисплее

Результат выполнения на дисплее


<< НазадДальше >>


Поделиться с друзьями:

Поддержка проекта