CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Много датчиков температуры DS18B20

Здравствуйте, подключив 10 датчиков температуры DS18B20 контроллер считывал данные только с трех. Отключив эти три датчика у меня заработали другие 5 шт. Такое чувство что некоторые датчики перебивают сигнал других. В чем проблема, почему они работают не правильно?
Подключал так:


Вот код:
#include <OneWire.h>
OneWire  ds(12);  // датчики на порте
void setup(void) 
{
Serial.begin(9600);
pinMode(9, OUTPUT); 
}
void loop(void) 
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int Temp;
  if ( !ds.search(addr)) 
  {
	ds.reset_search();
	return;
  }
  Serial.print("R=");  //R=28 Not sure what this is
  for( i = 0; i < 8; i++) {
    Serial.print(addr[i], HEX);
    Serial.print(" ");
    sensor=sensor+addr[i];
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
	Serial.print("CRC is not valid!\n");
	return;
  }
  if ( addr[0] != 0x28) {
	Serial.print("Device is not a DS18S20 family device.\n");
	return;
  }
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);	   // start conversion, with parasite power on at the end
  delay(5000);     // maybe 750ms is enough, maybe not
  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);	   // Read Scratchpad
  Serial.print("p=");
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {	     // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print("  ");
  }
  Temp=(data[1]<<8)+data[0];//take the two bytes from the response relating to temperature

  Temp=Temp;//divide by 16 to get pure celcius readout
  Serial.print("T=");//output the temperature to serial port
  Serial.print(Temp/16);
  Serial.print(".");
  Serial.print(((Temp%16)*100)/16);
  Serial.print("  ");
  Serial.print(" CRC=");
  Serial.print( OneWire::crc8( data, 8), HEX);
  Serial.println();
}
  • 0
  • 12 апреля 2012, 22:54
  • xagxag

Комментарии (3)

RSS свернуть / развернуть
+
+1
Интересно!!! Была потребность опрашивать 2 датчика ds18b20/ нашёл немного другой код в интернете. Выложу. Может и пригодится.
// DS18B20_1 - Arduino
//
// Continually measures temperatures at three points using the Dallas DS18B20 on three
// separate Arduino pins.
//
// Uses the parasitic power mode
//
// Displays to a serial LCD operating at 9600 baud.
//
// Arduino Board            DS18B20
//
//                    +5 VDC
//                    |
//                   4.7K
// 8 ---------------- |----- 2 (DQ)  Note that terms 1 and 3 are grounded.
//
// 7 ---- same as above
// 6 ---- same as above
//
// Tx ---------------------------- To Serial LCD (LCD #117)
//
// copyright, Peter H Anderson, Baltimore, MD, May 5, '07


void setup()
{
  int n, dev_channel[2] = {15, 16}, _1W_Pin;

  for (n=0; n<2; n++)
  {
    _1W_Pin = dev_channel[n];
    digitalWrite(_1W_Pin, LOW);
    pinMode(_1W_Pin, INPUT);     
  }
  Serial.begin(9600);
}

void loop()
{
  int n, dev_channel[2] = {15, 16}, _1W_Pin;
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;

  for (n=0; n<2; n++)
  {
     _1W_Pin = dev_channel[n];
     OneWireReset(_1W_Pin);
     OneWireOutByte(_1W_Pin, 0xcc, 0);
     OneWireOutByte(_1W_Pin, 0x44, 1); 

     OneWireReset(_1W_Pin);
     OneWireOutByte(_1W_Pin, 0xcc, 0);
     OneWireOutByte(_1W_Pin, 0xbe, 0);

     LowByte = OneWireInByte(_1W_Pin);
     HighByte = OneWireInByte(_1W_Pin);
     TReading = (HighByte << 8) + LowByte;
     SignBit = TReading & 0x8000;  
     if (SignBit) 
     {
         TReading = (TReading ^ 0xffff) + 1; 
     }
     Tc_100 = (6 * TReading) + TReading / 4;  

     Whole = Tc_100 / 100;  
     Fract = Tc_100 % 100;


     Serial.print(Whole);
     Serial.print(".");
     if (Fract < 10)
     {
        Serial.print("0");
     }
     Serial.println(Fract);
delay(1000);
  }
  
}

void OneWireReset(int _1W_Pin) 
{
     digitalWrite(_1W_Pin, LOW);
     pinMode(_1W_Pin, OUTPUT);
     delayMicroseconds(500);
     pinMode(_1W_Pin, INPUT);
     delayMicroseconds(500);
}

void OneWireOutByte(int _1W_Pin, byte d, byte strong) 
{
   byte n;

   for(n=8; n!=0; n--)
   {
      if ((d & 0x01) == 1) 
      {
         digitalWrite(_1W_Pin, LOW);
         pinMode(_1W_Pin, OUTPUT);
         delayMicroseconds(5);
         pinMode(_1W_Pin, INPUT);
         delayMicroseconds(60);
      }
      else
      {
         digitalWrite(_1W_Pin, LOW);
         pinMode(_1W_Pin, OUTPUT);
         delayMicroseconds(60);
         pinMode(_1W_Pin, INPUT);
      }

      d=d>>1; 
   }
   if(strong)
   {
       digitalWrite(_1W_Pin, HIGH); 
       pinMode(_1W_Pin, OUTPUT);
       //delay(1000);
       pinMode(_1W_Pin, INPUT);
       digitalWrite(_1W_Pin, LOW);
   }
}

byte OneWireInByte(int _1W_Pin) 
{
    byte d, n, b;

    for (n=0; n<8; n++)
    {
        digitalWrite(_1W_Pin, LOW);
        pinMode(_1W_Pin, OUTPUT);
        delayMicroseconds(5);
        pinMode(_1W_Pin, INPUT);
        delayMicroseconds(5);
        b = digitalRead(_1W_Pin);
        delayMicroseconds(50);
        d = (d >> 1) | (b<<7);
    }
    return(d);
}
avatar

LEVVARRR

  • 13 апреля 2012, 07:18
+
0
Да, появилось две проблемы я решил разделить на две темы.
avatar

xagxag

  • 13 апреля 2012, 09:37
+
0
Спасибо)) Такой код вообще не встречал…
avatar

xagxag

  • 13 апреля 2012, 09:42

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.