Опрос ds18b20 по уникальному коду?

Обсуждаем контроллеры компании Atmel.
Ответить
dima81
Родился
Сообщения: 11
Зарегистрирован: Пн фев 24, 2014 22:14:48

Опрос ds18b20 по уникальному коду?

Сообщение 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);
}
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Опрос ds18b20 по уникальному коду?

Сообщение А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 который. Это и есть массив, в котором хранятся найденные коды датчиков.
Подставляйте туда свой код и будет Вам счастье.
Аватара пользователя
diafour
Встал на лапы
Сообщения: 109
Зарегистрирован: Пн янв 26, 2015 07:48:56
Откуда: Москва, Троицк

Re: Опрос ds18b20 по уникальному коду?

Сообщение 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);
dima81
Родился
Сообщения: 11
Зарегистрирован: Пн фев 24, 2014 22:14:48

Re: Опрос ds18b20 по уникальному коду?

Сообщение 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, я вас не понял :oops: Если вместо в ds18b20_rom_codes подставляю код {0x28, 0xFF, 0xB7, 0x8, 0x0, 0x15, 0x2, 0xE5}, то получаю ошибку в этой стоке: invalid expression
Аватара пользователя
diafour
Встал на лапы
Сообщения: 109
Зарегистрирован: Пн янв 26, 2015 07:48:56
Откуда: Москва, Троицк

Re: Опрос ds18b20 по уникальному коду?

Сообщение 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} в качестве аргумента функции нельзя подставить, это - синтаксис инициализации массива.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Опрос ds18b20 по уникальному коду?

Сообщение pyzhman »

Этой функцией

Код: Выделить всё

ds18b20_devices=w1_search

в памяти сохраняются коды обнаруженных датчиков, в массиве.
Функцией

Код: Выделить всё

ds18b20_temperature(

считываются показания адресуемого датчика.
У вас есть уникальный код. Вот его и подкиньте в качестве аргумента функции.
Docendo discimus
dima81
Родился
Сообщения: 11
Зарегистрирован: Пн фев 24, 2014 22:14:48

Re: Опрос ds18b20 по уникальному коду?

Сообщение 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];

затем значения переменных выводились на экран
Ответить

Вернуться в «AVR»