помогите опросить ds1821

Dmitry K
Offline
Зарегистрирован: 11.08.2011

добрый день, нашел у себя под матрасом 2 ds1821, по своей сути является термостатом в который вшиваются контрольные точки TH и TL соответсвенно TH верхний температурный режим TL нижний, но имеет функцию термодатчика, но его нужно перевести из одного режима в другой, отсюда и вопрос: по умолчанию какой режим работы установлен? термометр или термостат?, как простыми аппаратными стрествами можно изменить режим работы? Для изменения режима работы, по даташиту нужно:

OPERATING MODES
The DS1821 has two operating modes: 1-Wire mode and thermostat mode. The power-up operating
mode is determined by the user-programmable T/R¯ bit in the status/configuration register: if T/R¯ = 0

Режимы работы
DS1821 имеет два режима работы: 1-Wire режиме и термостат режиме.Питания операционных
Режим определяется программируемых пользователем T / R ¯ бит в состояние / Конфигурация регистрации: если T / R = 0, ¯
Устройство держав в 1-Wire режиме, и если T / R = 1 ¯ устройства держав в термостат режиме.T / R ¯=0

помогите разобраться с вопросом, и получить данные о температуре, библиотека 1-wire не поддерживает эти датчики, т.к они не имеют уникальных адресов, и адресация для них невозможна

leshak
Offline
Зарегистрирован: 29.09.2011

 А загуглить "ds1821 arduino" в даташите запрещенно? На первой же странице hobby.msdatabase.ru/project-updates/theresultsofoursurvey/arduino-programmator-termostat . И еще куча ссылок на обсуждения (можете фильтрануть "результаты только на русском).

>т.к они не имеют уникальных адресов, и адресация для них невозможна

Это не означает что библиотекой нельзя пользовать. Это значит что на линии должен висеть только один термостат. "Адресация" это когда библиотека говорит "вот ТЫ - слушай мои команды". А этот датчик указание "ТЫ" - игнориует. Все что услышал на линии - принимает на свой счет. Поэтому и "должен быть один". Потому как "по какому адресу к нему обращатся" - роли не играет (ну по крайней мере я так понял).

Dmitry K
Offline
Зарегистрирован: 11.08.2011

изначально разница в командах конвертации и опроса, с командами разобрался, ответы идут, но ответы не похожи на температуру, может ли быть такое что процидура вычисления у ds18b20 отличается от процедуры вычисления у ds1821, вот код

#include <OneWire.h>

int nc; 
OneWire ds(10); // Первый датчик
OneWire ds2(11); // Второй датчик

void setup(void)
{
Serial.begin(9600);
}

void loop(void)
{
byte i;
byte present = 0;
byte data[12];
int Temp;
int znak;

if (Serial.available() > 0) {
nc = Serial.read(); 
if (nc==49) { 
ds.reset();
ds.write(0xEE); 
present = ds.reset(); 
ds.write(0xAA);

for ( i = 0; i < 9; i++) { 
data[i] = ds.read();
}

Temp=(data[1]<<8)+data[0];
Temp=Temp;
znak=((Temp%16)*100)/16;
if (znak<0){
znak=znak*-1;
}
Serial.print(Temp/16);
Serial.print(".");
Serial.print(znak);
Serial.println();
}

if (nc==50) { 
ds2.reset();
ds2.write(0xEE); 
present = ds2.reset(); 
ds2.write(0xAA);

for ( i = 0; i < 9; i++) { 
data[i] = ds2.read();
}
Temp=(data[1]<<8)+data[0];
Temp=Temp;
znak=((Temp%16)*100)/16;
if (znak<0){
znak=znak*-1;
}
Serial.print(Temp/16);
Serial.print(".");
Serial.print(znak);
Serial.println();
}
}
} 

 

уарт выдает: 

1.50
1.50
1.50
1.50
1.68
1.75
1.75
1.75
1.81
 

что повидимому чтото нетак в поцедуре вычисления температуры в градусах цельсия, подскажите что может быть не так?

leshak
Offline
Зарегистрирован: 29.09.2011

 >может ли быть такое что процидура вычисления у ds18b20 отличается от процедуры вычисления у ds1821

Конечно может. Узнать это можно прочитав и сравнив даташиты на эти датчики. Как минимум ваш датчик имеет 8 битную точность, а ds18b20 от 9 до 12 бит.

А зачем вас вообще понятнуло на ds1820?

Я же вам дал ссылку на более родственное устройство. Можно конечно, разобратся с двигателем машины изучая устройство мотоциклетного двигателя, но imho проще "машину" понять на примере "машины".

Ну а если хочется, все-таки, ds1820, то посмотрите библиотеку DallasTemperatureControl она является оберткой, для более удобной работы именно с ds1820 серией. Напрямую она, возможно и не заработает (у нее есть проверка типа датчика), но подсмотреть "как конвертировать" - можно.

 

Dmitry K
Offline
Зарегистрирован: 11.08.2011

ds1821 только потому что они были в количестве 2х штук и хочется пустить их в дело, ссылка то что вы дали, повествует отом как програмно при помощи ардуино перевести ds1821 в режим термостата и прошить в его память точки контроля, у меня же задача совсем иная мне нужно всеголиш снимаит показания датчиков (температуру) и отправлять ее в уарт для дальнейшей обработки

leshak
Offline
Зарегистрирован: 29.09.2011

 

>повествует отом как програмно при помощи ардуино перевести ds1821 в режим термостата

Да ну? А при этом разве не видно как читаются/устанавливаются регистр? Как происходит инициализация?

А код типа 

 

 ts = ds1620_read_register (RD_TEMP, 9);
Serial.print("Temperature register is "); Serial.println(ts);

if (ts > 0xFF) // if negative
ts |= 0xFF00; // extend sign bits

tenths = (ts*5) % 10;

Serial.print("Temperature Celsium is "); Serial.print(ts/2);Serial.print(".");Serial.println(tenths);

 Никаких мыслей не вызывает?

Dmitry K
Offline
Зарегистрирован: 11.08.2011

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

#include <OneWire.h>

int nc;
OneWire ds(10); // Первый датчик
OneWire ds2(11); // Второй датчик

void setup(void)
{
Serial.begin(9600);
}

void loop(void)
{
byte i;
byte present = 0;
byte data[12];
int Temp;
int znak;

if (Serial.available() > 0) {
nc = Serial.read();
if (nc==49) {
ds.reset();
ds.write(0xEE);
present = ds.reset();
ds.write(0xAA);

for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}

Temp=(data[1]<<8)+data[0];
Serial.print(Temp);
Serial.println();
}
}
}

но, заметил интересный момент(положил датчик в морозилку холодильника), когда датчик достигает тепературы в 0 градусов и температура понижается после 0 он показывает 255, а не -1, подскажите как преоразовать 255 в -1 т.к после 0 данные идут 255, 254,253 что по сути должно быть -1,-2,-3

leshak
Offline
Зарегистрирован: 29.09.2011

 > подскажите как преоразовать 255 в -1

отнять 254 и умножить  на -1

leshak
Offline
Зарегистрирован: 29.09.2011

 >отнять 254 и умножить на -1

Не, че-то лопухнулся я. Нужно просто от числа отнять 256.

Или сделать как в куске скетча выше, на который я показывал "ts |= 0xFF00;

Что вообщем-то одно и тоже. Просто вычитание реализованное битовой маской.

Правда с проверкой, когда это нужно делать они лопухнулись

Вместо if (ts > 0xFF) дожно быть if (ts >= 0x80) 

 

 

Dmitry K
Offline
Зарегистрирован: 11.08.2011

большое спасибо за помощь, вопрос решил вот так:

#include <OneWire.h>

int nc;
OneWire ds(10); // Первый датчик "улица" digital pin 10
OneWire ds2(11); // Второй датчик "дом" digital pin 11

void setup(void)
{
Serial.begin(9600); // настройка порта на скорость 9600
}
void loop(void)
{
byte i;
byte present = 0;
byte data[8];
int Temp; // переменная для передачи результата в порт

if (Serial.available() > 0) { // проверяем пришла ли 1 в порт
nc = Serial.read(); // сохраняем в nc
if (nc==49) { // проверяем 49 байт цифры 1
ds.reset(); // сбрасываем шину 1-wire
ds.write(0xEE); // пишим EEh датчику (запус процесса

определения температуры)

present = ds.reset();
ds.write(0xAA); // отправляем AAh для получения результата

замеренной температуры

for ( i = 0; i < 9; i++) { // читаем 9 бит температуры
data[i] = ds.read();
}

Temp=data[0]; // передаем данные температуры в Temp
if (Temp>=128){ // выполняем преобразование
Temp=Temp-256; // определяющее отрицательное значение

температуры
}
Serial.print("out: "); // указываем какой датчик показывает нам

температуры (улица)
Serial.print(Temp);
Serial.println();
}

if (nc==50) { // проверяем что в порт пришла 2 и аналагичные

действия см ^
ds2.reset();
ds2.write(0xEE);

present = ds2.reset();
ds2.write(0xAA);

for ( i = 0; i < 9; i++) {
data[i] = ds2.read();
}
Temp=data[0];
if (Temp>=128){
Temp=Temp-256;
}
Serial.print("in: ");
Serial.print(Temp);
Serial.println();
}
}

Dmitry K
Offline
Зарегистрирован: 11.08.2011

заметил странный глюк как только отключаю ардуину от усб, и вновь включаю, начинаю опрашивать и первый раз она вместо результата отдает 0 (оба датчика), потом отдает нормальные результаты почему так происходит?
и еще вопрос:
READ TEMPERATURE [AAh]
Provides read access to the 1-byte temperature register.
START CONVERT T [EEh]
Initiates temperature conversions. If the part is in one-shot mode (1SHOT = 1), only one conversion will
be performed. If it is in continuous mode (1SHOT = 0), continuous conversions will be performed until a
Stop Convert T command is received.
STOP CONVERT T [22h]
Stops temperature conversions when the device is in continuous conversion mode (1SHOT = 0). This
opcode has no function if the device is in one-shot mode (1SHOT = 1).
кусок из даташита, перед получением результата мы запускаем START CONVERT T [EEh] затем выполняем READ TEMPERATURE [AAh], вопрос нада ли выполнить STOP CONVERT T [22h] после приема температуры?

наглядно в куске кода:

if (nc==50) {
ds2.reset();
ds2.write(0xEE); // старт конвертации
present = ds2.reset();
ds2.write(0xAA); // прием байта температуры