Много датчиков температуры 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();
}

3 комментария на «“Много датчиков температуры DS18B20”»

  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);
    }
    • Да, появилось две проблемы я решил разделить на две темы.

    • Спасибо)) Такой код вообще не встречал…

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение