Практична робота №4

Тема: Робота з температурним датчиком

 

         Розглянемо як за допомогою Arduino знімати покази температурного датчика. Температурний датчик можна використати в роботі поршневого дозатора, наприклад для запаковування пастоподібної сировини необхідно нагріти сировину до температури 90ºС, перед подачею сировини в упаковку, датчик буде показувати дійсну температуру в бункері.

 

Необхідне обладнання:

·       Arduino;

·       Макетна плата;

·       Датчик температури DS18B20 або DS18S20;

·       Резистор на 4,7кОм;

·       Дроти.

Датчик може живитися двома способами - зовнішнім живленням (3 дроти) або паразтним (живлення від шини, 2 дроти). Зазначу те, що в даному проекті ми будемо використовувати нормальне (зовнішнє) живлення датчика.

Схема підключення датчика DS18B20 до Arduino приведена нижче. Підтягаючий Pull-Up резистор номіналом 4.7 кОм (5 кОм) включається між виводом DQ (Data) і живленням датчика Vdd.

Данные с датчика через Serial Monitor

Код:

#include "OneWire.h" //підключаємо бібліотеку

OneWire  ds(10);  // на пін 10 необхідно резистор 4.7кОм

 

void setup(void) {

  Serial.begin(9600);

}

 

void loop(void) {

  byte i;

  byte present = 0;

  byte type_s;

  byte data[12];

  byte addr[8];

  float celsius, fahrenheit;

  

  if ( !ds.search(addr)) {

    Serial.println("No more addresses.");

    Serial.println();

    ds.reset_search();

    delay(250);

    return;

  }

  

  Serial.print("ROM =");

  for( i = 0; i < 8; i++) {

    Serial.write(' ');

    Serial.print(addr[i], HEX);

  }

 

  if (OneWire::crc8(addr, 7) != addr[7]) {

      Serial.println("CRC is not valid!");

      return;

  }

  Serial.println();

 

  // Перший ROM байт вибирається з чіпу датчику

  switch (addr[0]) {

    case 0x10:

      Serial.println("  Chip = DS18S20");  // or old DS1820

      type_s = 1;

      break;

    case 0x28:

      Serial.println("  Chip = DS18B20");

      type_s = 0;

      break;

    case 0x22:

      Serial.println("  Chip = DS1822");

      type_s = 0;

      break;

    default:

      Serial.println("Device is not a DS18x20 family device.");

      return;

  }

 

  ds.reset();

  ds.select(addr);

  ds.write(0x44, 1);        // починаємо конвертацію даних

  

  delay(1000);     // ставимо затримку в 1 секунду

    

  present = ds.reset();

  ds.select(addr);   

  ds.write(0xBE);         // Зчитуємо дані

 

  Serial.print("  Data = ");

  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();

 

  // конвертуємо дані до нормального представлення температури

  int16_t raw = (data[1] << 8) | data[0];

  if (type_s) {

    raw = raw << 3; // 9 розмірність біт за замовчуванням

    if (data[7] == 0x10) {

      // перерахунок дає повні 12 біт;

      raw = (raw & 0xFFF0) + 12 - data[6];

    }

  } else {

    byte cfg = (data[4] & 0x60);

    // при більш низьких значеннях, низькі біти не визначені, так що давайте прирівняємо їх нулю

    if (cfg == 0x00) raw = raw & ~7;  // 9 розмірність біт, 93.75 ms

    else if (cfg == 0x20) raw = raw & ~3; // 10 біт, 187.5 ms

    else if (cfg == 0x40) raw = raw & ~1; // 11 біт, 375 ms

    //// за замовчуванням розмірність 12 біт, 750 ms час конвертації

  }

  celsius = (float)raw / 16.0;

  fahrenheit = celsius * 1.8 + 32.0;

  Serial.print("  Temperature = ");

  Serial.print(celsius);

  Serial.print(" Celsius, ");

  Serial.print(fahrenheit);

  Serial.println(" Fahrenheit");

}