Страница 1 из 1
Опрос ds18b20 по уникальному коду?
Добавлено: Вт май 12, 2015 18:51:54
dima81
Добрый день!
Подскажите как опросить конкретный датчик температуры ds18b20 для которого известен 64 разрядный код в 16-м формате типа 0x28FE41C0015020801
Проект делается в CVAVR 2.12
Справку всю пересмотрел, но видимо чего то недопонимаю, в программировании совсем не силён.
Сейчас опрашиваю следующим образом.
Спойлер
#include <mega16a.h>
#include <alcd.h>
#include <stdio.h>
#include <delay.h>
#include <1wire.h>
#include <ds18b20.h>
unsigned char ds18b20_devices;
unsigned char ds18b20_rom_codes[4][9];
char lcd_buf_0[33];
void main(void)
{
float temper_f0;
float temper_f1;
float temper_f2;
float temper_f3;
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
ds18b20_init( &ds18b20_rom_codes[0][0], -25, 110, DS18B20_10BIT_RES );
ds18b20_init( &ds18b20_rom_codes[1][0], -25, 110, DS18B20_10BIT_RES );
ds18b20_init( &ds18b20_rom_codes[2][0], -25, 110, DS18B20_10BIT_RES );
ds18b20_init( &ds18b20_rom_codes[3][0], -25, 110, DS18B20_10BIT_RES );
lcd_init(16);
lcd_clear();
while (1)
{
temper_f0=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temper_f1=ds18b20_temperature(&ds18b20_rom_codes[1][0]);
temper_f2=ds18b20_temperature(&ds18b20_rom_codes[2][0]);
temper_f3=ds18b20_temperature(&ds18b20_rom_codes[3][0]);
sprintf( lcd_buf_0,"%.0f\'C",temper_f0);
lcd_gotoxy(0,0);
lcd_puts( lcd_buf_0 );
sprintf( lcd_buf_0,"%.0f\'C",temper_f1);
lcd_gotoxy(7,0);
lcd_puts( lcd_buf_0 );
sprintf( lcd_buf_0,"%.1f\'C",temper_f2);
lcd_gotoxy(0,1);
lcd_puts( lcd_buf_0 );
sprintf( lcd_buf_0,"%.1f\'C",temper_f3);
lcd_gotoxy(7,1);
lcd_puts( lcd_buf_0 );
delay_ms(1000);
}
}
Re: Опрос ds18b20 по уникальному коду?
Добавлено: Вт май 12, 2015 19:56:44
Аlex
Код: Выделить всё
ds18b20_init( &ds18b20_rom_codes[0][0], -25, 110, DS18B20_10BIT_RES );
ds18b20_init( &ds18b20_rom_codes[1][0], -25, 110, DS18B20_10BIT_RES );
ds18b20_init( &ds18b20_rom_codes[2][0], -25, 110, DS18B20_10BIT_RES );
ds18b20_init( &ds18b20_rom_codes[3][0], -25, 110, DS18B20_10BIT_RES );
............
............
temper_f0=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temper_f1=ds18b20_temperature(&ds18b20_rom_codes[1][0]);
temper_f2=ds18b20_temperature(&ds18b20_rom_codes[2][0]);
temper_f3=ds18b20_temperature(&ds18b20_rom_codes[3][0]);
А если найдётся 3 датчика ? Или совсем ни одного ?
Подскажите как опросить конкретный датчик температуры ds18b20 для которого известен 64 разрядный код в 16-м формате типа 0x28FE41C0015020801
Вы в функции их (ROM-коды) передаёте.
ds18b20_rom_codes который. Это и есть массив, в котором хранятся найденные коды датчиков.
Подставляйте туда свой код и будет Вам счастье.
Re: Опрос ds18b20 по уникальному коду?
Добавлено: Вт май 12, 2015 20:19:50
diafour
Дополню, ds18b20_rom_codes тут как массив массивов 4 по 9 байт — для хранения идентификаторов 4-ёх 1wire устройств.
Если нужно одно устройство, можно только его и объявить
Код: Выделить всё
unsigned char ds18b20_rom[9] = {0x28, 0xFE, 0x41, 0xC0, 0x01, 0x50, 0x20 0x80}; // В приведённом коде 0x28 FE 41 C0 01 50 20 80 1 что-то много цифр! И за порядок не ручаюсь, возможно в обратном порядке нужны байты.
Дальше его инициализировать и брать температуру, а опрос 4 датчиков выкинуть:
Код: Выделить всё
ds18b20_init( ds18b20_rom, -25, 110, DS18B20_10BIT_RES );
...
temper=ds18b20_temperature(ds18b20_rom);
Re: Опрос ds18b20 по уникальному коду?
Добавлено: Вт май 12, 2015 21:13:03
dima81
Не совсем понял.
Если сделать так
Спойлер
#include <mega16a.h>
#include <alcd.h>
#include <stdio.h>
#include <delay.h>
#include <1wire.h>
#include <ds18b20.h>
unsigned char ds18b20_rom[9] = {0x28, 0xFF, 0xB7, 0x8, 0x0, 0x15, 0x2, 0xE5};
char lcd_buf_0[33];
void main(void)
{
float temper_f0;
ds18b20_init( ds18b20_rom, -25, 110, DS18B20_10BIT_RES );
lcd_init(16);
lcd_clear();
while (1)
{
temper_f0=ds18b20_temperature(ds18b20_rom);
sprintf( lcd_buf_0,"%.0f\'C",temper_f0);
lcd_gotoxy(0,0);
lcd_puts( lcd_buf_0 );
delay_ms(1000);
}
}
то в массив я записываю адрес только одного датчика, а их всего 8 шт. периодически к ним надо обращаться, но именно по адресам.
Alex, я вас не понял

Если вместо в ds18b20_rom_codes подставляю код {0x28, 0xFF, 0xB7, 0x8, 0x0, 0x15, 0x2, 0xE5}, то получаю ошибку в этой стоке: invalid expression
Re: Опрос ds18b20 по уникальному коду?
Добавлено: Ср май 13, 2015 04:17:51
diafour
Вначале был "конкретный датчик", потом в исходнике - 4 штуки, а теперь их 8 =)) Что ещё скрыто от нас? Например, у каждого датчика свои пороги алармов и точность? Или может на одной шине с термометрами ещё какие-то устройства?
А вообще дальше так: если код заработал с одним датчиком, то возвращаем многомерный массив идентификаторов, только уже с инициализацией, раз всё известно, а методы инициализации и получения температуры загоняем в циклы.
Код: Выделить всё
#define SENSORS_COUNT 8
#define ROM_SIZE 9
unsigned char ds18b20_roms[SENSORS_COUNT][ROM_SIZE] = {
{0x28, 0xFF, 0xB7, 0x08, 0, 0x15, 0x02, 0xE5},
{0x28, 0xFE, 0x41, 0xC0, 0x01, 0x50, 0x20, 0x80},
{0x28, 0x02, ...},
{0x28, 0x03, ...},
{0x28, 0x04, ...},
{0x28, 0x05, ...},
{0x28, 0x06, ...},
{0x28, 0x07, ...}
};
...
for (int i=0; i<SENSORS_COUNT; i++) {
ds18b20_init( &ds18b20_roms[i][0], -25, 110, DS18B20_10BIT_RES );
}
...
while (1) {
for (int i=0; i<SENSORS_COUNT; i++) {
temper = ds18b20_temperature(&ds18b20_roms[i][0]);
// сделать что-то с показаниями одного датчика
}
...
}
{0x28, 0xFF, 0xB7, 0x8, 0x0, 0x15, 0x2, 0xE5} в качестве аргумента функции нельзя подставить, это - синтаксис инициализации массива.
Re: Опрос ds18b20 по уникальному коду?
Добавлено: Ср май 13, 2015 05:41:51
pyzhman
Этой функцией
в памяти сохраняются коды обнаруженных датчиков, в массиве.
Функцией
считываются показания адресуемого датчика.
У вас есть уникальный код. Вот его и подкиньте в качестве аргумента функции.
Re: Опрос ds18b20 по уникальному коду?
Добавлено: Ср май 13, 2015 18:11:53
dima81
diafour благодарю, очень сильно мне помогли, жаль не могу поставить "+" в репутацию, видимо ограничения форума.
PS: вдруг кому понадобится, адреса датчиков ds18b20 узнавал отдельно по каждому с выводом их на экран:
Спойлер
kod0=ds18b20_rom_codes[0][0];
kod1=ds18b20_rom_codes[0][1];
kod2=ds18b20_rom_codes[0][2];
kod3=ds18b20_rom_codes[0][3];
kod4=ds18b20_rom_codes[0][4];
kod5=ds18b20_rom_codes[0][5];
kod6=ds18b20_rom_codes[0][6];
kod7=ds18b20_rom_codes[0][7];
kod8=ds18b20_rom_codes[0][8];
затем значения переменных выводились на экран