DS18B20 два и более на duino…


Давно не могу найти пример обращения к датчику DS18B20 по идентификационному номеру (если датчиков несколько)
Хотелось бы посмотреть пример кода с несколькими датчиками. Как определить идентификационный номер датчика?
Вот пример проги которая работает с несколькими датчиками опрашивая их по порядку. На экран выводит вот что:
«первый датчик»
R=28 D8 3 64 2 0 0 E4 P=1 AC 1 4B 46 7F FF 4 10 86 T=26.75 CRC=865
«второй датчик»
R=28 91 F8 9F 2 0 0 34 P=1 AB 1 4B 46 7F FF 5 10 92 T=26.68 CRC=9210
Может где то тут и есть идентификационный номер датчика?

#include <OneWire.h>
OneWire  ds(12);  // on pin 3
void setup(void) 
{
pinMode(13, OUTPUT);  //we'll use the debug LED to output a heartbeat
Serial.begin(9600);
}
void loop(void) 
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int Temp;
  if ( !ds.search(addr)) {
	//Serial.print("No more addresses.\n");
	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(" ");
  }
  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(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

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

12 комментариев на «“DS18B20 два и более на duino…”»

    • Да возможно… у меня тоже был такой вариант… Только вот какие функции использовать для чтения с дачика по индетификатору таких наверно в библе OneWire нет… а самому библу дописать не получится…

    • а если при длительной эксплуатации контроллера вдруг, где то какая ни будь ошибка и ли временно пропадет контакт, то номер линии изменится, и другие датчики будут давать ошибочные показания… или не так?
      По идентификационному номеру надёжнее…

    • слушай… ну есть куча функций типа
      // returns true if address is valid
      bool validAddress(uint8_t*);
      // attempt to determine if the device at the given address is connected to the bus
      // also allows for updating the read scratchpad
      bool isConnected(uint8_t*, uint8_t*);
      // sends command for one device to perform a temperature conversion by address
      bool requestTemperaturesByAddress(uint8_t*);

      может посмотреть с их сторону?

    • pdfserv.maxim-ic.com/en/ds/DS18B20.pdf

      на стр. 6 читаем

      64-BIT LASERED ROM CODE
      Each DS18B20 contains a unique 64–bit code (see Figure 6) stored in ROM. The least significant 8 bits
      of the ROM code contain the DS18B20’s 1-Wire family code: 28h. The next 48 bits contain a unique
      serial number. The most significant 8 bits contain a cyclic redundancy check (CRC) byte that is
      calculated from the first 56 bits of the ROM code. A detailed explanation of the CRC bits is provided in
      the CRC Generation section. The 64-bit ROM code and associated ROM function control logic allow the
      DS18B20 to operate as a 1-Wire device using the protocol detailed in the 1-Wire Bus System section.
      

      вольный перевод:

      у ds18d20 есть уникальный 64 битный код. начинается с 28h
      следующие 48 бит содержат уникальный номер, последние 8 бит — crc

      из первого коммента

      28 =id
      D8 3 64 2 0 0 =номер
      E4=crc

    • из первого коммента

      28 =id
      D8 3 64 2 0 0 =номер
      E4=crc

      А почему у меня id обоих датчиков 28 когда они подключены вместе?

    • это не id, это код семейства iButton, у всех таблеток он одинаковый, а уникальным будет только номер

    • Кстатии 0x28 это перевод в какую систему шестнацатиричную? или что это?

    • это не перевод, это и есть шестнадцатеричная. а 0x28 это код семейства iButton

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

Arduino

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

Разделы

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

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

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

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