воскресенье, 5 мая 2013 г.

Работа с несколькими датчиками DS18B20

Отпишусь, как я подключил несколько датчиков температуры DS18B20 на один пин BlockDuino.
Для удобства я спаял маленький полублок с разъемом 'мама' размером 8х3, т.е. с возможностью подключения до 8ми датчиков и разъемом 'папа' размером 7х2, в качестве коммутатора, т.е. можно перекинуть вход датчиков на любой пин. 
Для наглядности, этот полублок я подключил не напрямую, а через кабель. Ну чтоб было точно видно, что используется всего один провод для данных (ну и два для подвода питания), к тому же у меня занят разъем 'мама' на основной плате подключенным экранчиком JM164A. К полублоку подключил два выносных датчика, а один вставил сразу в разъем.
Подключение нескольких датчиков DS18B20 Подключение нескольких датчиков DS18B20 к BlockDuino
 Один запихнул под пиво, один окунул в чай, ну и еще один оставил как есть - типа комнатная температура.

UPDATE!!!


Подключение нескольких датчиков DS18B20 к BlockDuino
Вывод температуры датчиков DS18B20 на LCD ЖКИ
На счет кода: код писался больше года тому, поэтому не помню на чем он основывается, и что там лишнего есть. Код далеко не идеален, так - для демонстрации. Из плюсов: определяет сколько датчиков присоединено и выводит по ним данные на COMовскую шину (т.е. в компьютер), ну и заодно на LCDшку. На LCD только первые три, если датчиков больше, то там появляется бардак. Из минусов: не фиксирует последовательность датчиков, т.е. наперед нельзя определить какой именно из датчиков будет первым, и т.д., ну то что нужна доводка, так это и так ясно. В общем - просто демо-программа.
Результат вывода на компьютер с 3х датчиков DS18B20
3 датчика
5 датчиков

Код:



#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h> 

// Data wire is plugged into port 3 on the BlockDuino
#define ONE_WIRE_BUS 3
#define TEMPERATURE_PRECISION 9

OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

DeviceAddress Thermometer;

byte count;
String head[7] = {"Troom = ", "Ttea  = ", "Tbeer = ","","","",""};

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo on BlockDuino.org");
  
  // Start up the library
  sensors.begin();
  lcd.begin(16, 4);
  lcd.print("setup");

  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  count = sensors.getDeviceCount();
  Serial.print(count, DEC);
  Serial.println(" devices.");
  
  lcd.setCursor(0,2);
  lcd.print("Found ");
  lcd.print(count, DEC);
  lcd.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");

  // show the addresses we found on the 
  for (int i=0; i<count; i++){
    if (!sensors.getAddress(Thermometer, i)) {
   Serial.print("Unable to find address for Device "); 
   Serial.println(i);
 }
    Serial.println(" Device:");
    Serial.print("  Address: ");
    printAddress(Thermometer);
    Serial.println(); 
    sensors.setResolution(Thermometer, 9);// set the resolution to 9 bit 
    Serial.print("  Resolution: ");
    Serial.print(sensors.getResolution(Thermometer), DEC); 
    Serial.println();
  }
  delay(1000);
  lcd.clear();
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
}

// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
  Serial.print("Resolution: ");
  Serial.print(sensors.getResolution(deviceAddress));
  Serial.println();    
}

// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
  Serial.print("Device Address: ");
  printAddress(deviceAddress);
  Serial.print(" ");
  printTemperature(deviceAddress);
  Serial.println();
}

void loop(void)
{ 
// call sensors.requestTemperatures() to issue a global temperature 
// request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();
  Serial.println("DONE");

// print temperatures to LCD
  lcd.clear();
  lcd.print(" Temperature");
  for (int i=0; i<count; i++){
    sensors.getAddress(Thermometer, i);
    printData(Thermometer);
    lcd.setCursor(0, i+1);
    lcd.print(head[i]);
    lcd.print(sensors.getTempCByIndex(i), 1);
    lcd.print("oC");
  }
  delay(500);
}


Ну и напоследок, то же, но с питанием от батареек, чтобы подчеркнуть автономностью, так сказать ;)

UPDATE!!!