Здравствуйте, у меня возникла проблема работы с двумя и более датчиками (DS18B20) на duino. Я могу читать по порядку температуру с каждого датчика (ниже код), а вот как теперь считать данные с определенного датчика(по адресу) например с первого? Напишите пожалуйста пример кода..
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, 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 = ds.read();
Serial.print(data, 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, , HEX);
Serial.println();
}
xagxag писал(а):Я могу читать по порядку температуру с каждого датчика (ниже код), а вот как теперь считать данные с определенного датчика(по адресу) например с первого?
... а в чем отличие Я могу читать по порядку температуру с каждого датчика от считать данные с определенного датчика?
xagxag писал(а):Я могу читать по порядку температуру с каждого датчика (ниже код), а вот как теперь считать данные с определенного датчика(по адресу) например с первого?
... а в чем отличие Я могу читать по порядку температуру с каждого датчика от считать данные с определенного датчика?
xagxag писал(а):Напишите пожалуйста пример кода..
- так вроде все уже написано... раз
Я могу читать по порядку температуру
- просто подставьте в код индекс нужного датчика
Вот вот..у меня не получается подставить индекс датчика....
я как понимаю что бы вывести на экран с нужного датчика нужно прописать
const x=28 D8 3 64 2 0 0 E4; // это же индекс или???
...
Serial.print(x);
xagxag писал(а):а я думал у каждого датчика есть идентификационный номер,
.. так и есть, а индекс - это порядковый номер, который указывает на массив из 8-ми байт (ID код) и позволяет с помощью функции MATCH ROM обратиться к нужному устройству на шине .... а вообще-то все доступно описано в datasheet_е, так что лучше его почитать....
При нагревании датчика DS18B20 феном, датчик неожиданно выдал значение температуры, которое находится за границей +125 С. Может такое быть и кто с этим сталкивался?
+69,0 C +96,5 C +91,0 C +85,0 C +102,0 C+126,5 C+119,0 C+111,5 C+104,0 C+98,0 C +92,0 C +87,0 C +82,5 C +79,5 C +114,0 C+108,5 C+101,0 C+95,5 C +90,5 C +86,0 C +82,0 C +78,0 C +74,5 C +72,0 C +68,0 C +58,5 C +56,0 C +55,0 C +53,5 C
цена мл. разряда при 12-битной оцифровке 0.0625°C, таким образом +125°C - это не максимальный код (7D0), а максимальный - 7FF = 127.9375°C и датчик действительно может мерить чуть больше (проверено паяльником)
a_skr писал(а):цена мл. разряда при 12-битной оцифровке 0.0625°C, таким образом +125°C - это не максимальный код (7D0), а максимальный - 7FF = 127.9375°C и датчик действительно может мерить чуть больше (проверено паяльником)
Пытаюсь разобраться в работе с датчиком DS18B20. Пока дошел только до эмуляции в Протеусе, но уже столкнулся с проблемой. Датчик реагирует на инициализацию, но не реагирует на команды начала измерения температуры (0x44) и чтения памяти (0xBE). Микроконтроллер PIC16f877, тактовая частота 4МГц. Программа в принципе не моя и должна работать, но, видимо, что-то не так. Я уже начал думать что мне датчик в Протеусе сгоревший попался) Вот программа:
delay_7us
goto $+1 ; 7 us Pause
nop
return
delay_80us
movlw 0x19 ; 80 us warten
movwf d1
delay_80us_loop
decfsz d1, f
goto delay_80us_loop
return
write_one
bcf PORTA, 2
call delay_7us ; 7 us warten
bsf PORTA, 2
call delay_80us ; 80 us warten
return
write_zero
bcf PORTA, 2
call delay_80us ; 80 us warten
bsf PORTA, 2
call delay_7us
return
init_ds1820
bsf STATUS, RP0 ; Bank 1
bcf TRISA, 2 ; RA2 Ausgang
bcf STATUS, RP0 ; Bank 0
bcf PORTA, 2
call delay_600us ; 600 us low -> Reset
bsf PORTA, 2
bsf STATUS, RP0 ; Bank 1
bsf TRISA, 2 ; RA2 Eingang
bcf STATUS, RP0 ; Bank 0
call delay_50us ; 50 us Pause
init_ds1820_loop
btfsc PORTA, 2
goto init_ds1820_loop ; Warten bis Presence = Low
return
write_ds1820
bsf STATUS, RP0 ; Bank 1
bcf TRISA, 2 ; RA2 Ausgang
bcf STATUS, RP0 ; Bank 0
movlw 0x08
movwf KEY
write_ds1820_loop
rrf ds1820, f ; Nach rechts verschieben
nop
btfss STATUS, C
goto $+3
call write_one
goto $+2
call write_zero
decfsz KEY, f
goto write_ds1820_loop ; Weitermachen, bis alle 8 Bits gesendet
bsf STATUS, RP0 ; Bank 1
bsf TRISA, 2 ; RA2 Eingang
bcf STATUS, RP0
return
read_ds1820
clrf ds1820
bcf STATUS, C
movlw 0x08
movwf KEY
read_ds1820_loop
bsf STATUS, RP0 ; Bank 1
bcf TRISA, 2 ; RA2 Ausgang
bcf STATUS, RP0 ; Bank 0
bcf PORTA, 2 ; Low
nop
bsf STATUS, RP0 ; Bank 1
bsf TRISA, 2 ; RA2 Eingang
bcf STATUS, RP0 ; Bank 0
bsf PORTA, 2 ; High, wird nicht ausgegeben
nop
nop
nop
nop
nop
nop
bsf STATUS, C
btfss PORTA, 2 ; Bus samplen
bcf STATUS, C
rrf ds1820, f ; Nach rechts verschieben
call delay_80us ; 80 us Pause
decfsz KEY, f
goto read_ds1820_loop ; Weitermachen, bis alle 8 Bits empfangen