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

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();
}
  • 0
  • 9 февраля 2011, 20:52
  • xagxag

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

RSS свернуть / развернуть
+
0
думаю адреса это:
28 D8 3 64 2 0 0 E4
и
28 91 F8 9F 2 0 0 34
как раз 8 байт, подходит под 1wire
avatar

Romiks

  • 9 февраля 2011, 21:24
+
0
Да возможно… у меня тоже был такой вариант… Только вот какие функции использовать для чтения с дачика по индетификатору таких наверно в библе OneWire нет… а самому библу дописать не получится…
avatar

xagxag

  • 9 февраля 2011, 22:36
+
0
не работал с arduino, но могу предположить что:
ds.search() // поиск одного из адресов
ds.select() // выбор адреса
avatar

Romiks

  • 9 февраля 2011, 22:43
+
0
Кстатии 0x28 это перевод в какую систему шестнацатиричную? или что это?
avatar

xagxag

  • 10 февраля 2011, 00:02
+
0
это не перевод, это и есть шестнадцатеричная. а 0x28 это код семейства iButton
avatar

Romiks

  • 10 февраля 2011, 16:24
+
0
а зачем именно по идентификационному номеру? просто по номеру на линии не подходит?
вроде как то так sensors.getTempCByIndex(0);
avatar

pasha-e

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

xagxag

  • 10 февраля 2011, 16:48
+
0
слушай… ну есть куча функций типа
// 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*);


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

pasha-e

  • 10 февраля 2011, 17:19
+
0
ммм… а можно комменты по русски а то с англ… сложновато…
avatar

xagxag

  • 10 февраля 2011, 17:23
+
0
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
avatar

sh_

  • 11 февраля 2011, 10:02
+
0
из первого коммента

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


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

xagxag

  • 11 февраля 2011, 15:08
+
0
это не id, это код семейства iButton, у всех таблеток он одинаковый, а уникальным будет только номер
avatar

Romiks

  • 11 февраля 2011, 20:29

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