1 (2011-09-19 14:19:59 отредактировано rxtstorm)

Тема: Вопрос:одновременная работа 2-х,3-х DS18b20

Доброго дня товарищи.Суть вопроса такова:необходимо снимать показания с 2-х, 3-х и более датчиков температуры.В наличии имеются 4 шт. Dallas  ds18b20.Кусок программы который обнаруживает датчики и их адреса есть (при практическом подключении 2-х датчиков их адреса опознались).Кусок программы который общается с датчиком подключенным через шину onewire при паразитном питании есть (ниже).

#include <OneWire.h>
 
//init the one wire interface on pin 10
OneWire  ow(10);
 
//write here the address you receive from the other program
byte sensor[8] = {0x10, 0x1D, 0x30, 0xF9, 0x01, 0x08, 0x00, 0x51};
 
void setup(void) {
  Serial.begin(9600);
}
 
void writeTimeToScratchpad(byte* address){
  //reset the bus
  ow.reset();
  //select our sensor
  ow.select(address);
  //CONVERT T function call (44h) which puts the temperature into the
scratchpad
  ow.write(0x44,1);
  //sleep a second for the write to take place
  delay(1000);
}
 
void readTimeFromScratchpad(byte* address, byte* data){
  //reset the bus
  ow.reset();
  //select our sensor
  ow.select(address);
  //read the scratchpad (BEh)
  ow.write(0xBE);
  for (byte i=0;i<9;i++){
    data[i] = ow.read();
  }
}
 
float getTemperature(byte* address){
  int tr;
  byte data[12];
 
  writeTimeToScratchpad(address);
 
  readTimeFromScratchpad(address,data);
 
  //put in temp all the 8 bits of LSB (least significant byte)
  tr = data[0];
 
  //check for negative temperature
  if (data[1] > 0x80){
    tr = !tr + 1; //two's complement adjustment
    tr = tr * -1; //flip value negative.
  }
 
  //COUNT PER Celsius degree (10h)
  int cpc = data[7];
  //COUNT REMAIN (0Ch)
  int cr = data[6];
 
  //drop bit 0
  tr = tr >> 1;
 
  //calculate the temperature based on this formula :
  //TEMPERATURE = TEMP READ - 0.25 + (COUNT PER Celsius Degree - COUNT REMAIN)
/ (COUNT PER Celsius Degree)
 
  return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}
 
//fahrenheit to celsius conversion
float f2c(float val){
  float aux = val - 32;
  return (aux * 5 / 9);
}
 
//celsius to fahrenheit conversion
float c2f(float val){
  float aux = (val * 9 / 5);
  return (aux + 32);
}
 
void loop(void) {
  float temp;
  float tmp2;
  tmp2 = getTemperature(sensor);
  temp = c2f(tmp2);
 
  Serial.print("Temp = ");
  Serial.print(temp);
  Serial.print(" F or ");
  Serial.print(tmp2);
  Serial.println(" C");
  //wait 30 seconds
  delay(30000);
}

Собственно прошу вас пояснить и прокомментировать строки программы (дабы понимать что тут написано) и как привязать еще один или более датчиков к этой программе.
СПАСИБО!!!!!

2

Re: Вопрос:одновременная работа 2-х,3-х DS18b20

а что собственно не понятно? могу дать кусок своей программы, для опроса 4 датчиков)
кстати, надо обрабатывать исключения, у меня они (0.00, -1.25 и 85.00)

3

Re: Вопрос:одновременная работа 2-х,3-х DS18b20

Собственно на данный момент найдено:
1.кусок кода для определения адресов датчиков.
2.кусок кода для снятия температуры.
Вопрос: как заставить программу самостоятельно определять количество датчиков,присваивать им имена (например sensor1,sensor2...) и печатать в порт информацию о температуре каждого конкретного датчика?Ну и допустим если поступит запрос о состоянии датчика, например 3-го, то дать ответ только о его состоянии (температуре).
Очень хочется унифицировать программу.