DS18S20 не работают стандартные функции

y2056
Offline
Зарегистрирован: 27.05.2015

Всем добрый день. Интересует такой вопрос почему ардуино не работает со стандартным чтением температуры как в этом коде:

#include <OneWire.h>
OneWire ds(9);
 
void setup() {
Serial.begin(9600); 
}
 
void loop() {
 
byte data[2];
ds.reset(); 
ds.write(0xCC);
ds.write(0x44);
delay(750);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read(); 
data[1] = ds.read();
int Temp = (data[1]<< 8)+data[0];
Temp = Temp>>4;
Serial.println(Temp);
}

На асме такой принцип работает четко. Пробовал выводить сразу DATA чтоб посмотреть что там пишет FFFF.

 

Araris
Offline
Зарегистрирован: 09.11.2012

Чего-то сильно недостает этому скетчу..

Сравните с http://playground.arduino.cc/Learning/OneWire?action=sourceblock&num=1

P.S. Про асм понравилось.

y2056
Offline
Зарегистрирован: 27.05.2015

Спасибо за инфу. Это на просторах инета я видел. Просто С я только начал изучать и не все понятно. Мне не совсем ясно почему просто нелзя сбросить датчик, запустить преобразование температуры и прочитать. Если нет необходимости знать его семейство и т.д. Или библиотека работающая с датчиком к чтению этих данных обязывает. Можно даже CRC не вычислять если ошибка чтения не важна. Проскочит ошибка и шут с ней.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

y2056, вроде всё верно визуально. А зачем вы данные туда-сюда перекладываете? Можно сразу класть в темп:

 int Temp =  ds.read() | (ds.read()<<8);

 

Araris
Offline
Зарегистрирован: 09.11.2012

Ну, не знаю, мне как-то больше нравится сначала найти датчик, узнать его адрес, а потом уже ds.select(addr) и так далее. В случае нескольких датчиков весьма удобно будет опять же.

y2056
Offline
Зарегистрирован: 27.05.2015

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

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

y2056, откуда ж нам это знать? Или вы думаете мы по скетчу можем диагностировать что вы там у себя неправильно включили? Проблема не в коде, ещё раз вам говорю.

y2056
Offline
Зарегистрирован: 27.05.2015

Да но тогда почему скетч который привел ARARIS работает, а мой нет, Схема собрана правильн поверьте мне в электронике не первый год. Ардуинка подключина, и на связи. Тупо копирую скетч ARARIS, он работает, копирую свой нет. При этом я никаких других действий не выполняю кроме компиляции и заливки в ардуинку. Смотрел разными прогами в том числе и терминалом, все одно и тоже. А вы Dimax говорите это не код. Я его для этого и привел, что именно так работает а так нет.

 

y2056
Offline
Зарегистрирован: 27.05.2015

Придется посмотреть осцилом что происходит на ногах датчика. И я не говорю про какие то расчеты или еще что мне просто сейчас надо чтоб датчик выдал цифры температуры, тупо и все.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

y2056, да я подумал что у вас ds18b20, ваш код для него. Для ds18S20 немножко по другому нужно сделать.

y2056
Offline
Зарегистрирован: 27.05.2015

А что не так? Насколько я помню у этого датчика команды те же.

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

y2056, я с ним не работал, поэтому прокомментировать не могу. У вас же есть рабочий пример? Не думаю что трудно вычислить что там по-другому делают.

y2056
Offline
Зарегистрирован: 27.05.2015

Там читают его семейство, rom и т.д. А можно все это пропустить, если одно устройство и тупо надо данные по температуре. Ну ладно нет так нет. Да и просто пример примером а хочется докопаться до истины почему не работает в этом варианте, в чем причина в библиотеке ошибка, она этого не поддерживает или так в С нельзя.

y2056
Offline
Зарегистрирован: 27.05.2015

Вот кстати чел. делал примерно тоже самое но чисто на компе.

http://www.elin.ru/files/pdf/1-Wire/DS18s20_li2.pdf

Там есть описание работы:

Посылаем импульс сброса и принимаем ответ термометра.

• Посылаем команду Skip ROM [CCh].

• Посылаем команду Convert T [44h].

• Формируем задержку минимум 750мс.

• Посылаем импульс сброса и принимаем ответ термометра.

• Посылаем команду Skip ROM [CCh].

• Посылаем команду Read Scratchpad [BEh].

• Читаем данные из промежуточного ОЗУ (8 байт) и CRC.

• Проверяем CRC, и если данные считаны верно, вычисляем температуру.

y2056
Offline
Зарегистрирован: 27.05.2015

Все разобрался спасибо.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

y2056, я сейчас посмотрел в универсальный скетч в составе библы OneWire, для обычных датчиков читается так:

int16_t raw = (data[1] << 8) | data[0];

А если детекнулся датчик S, то читается уже так:

raw = (raw & 0xFFF0) + 12 - data[6];

 

y2056
Offline
Зарегистрирован: 27.05.2015

Я разобрался. Просто при чтении датчик почему то выдает весь пакет со своим семейством.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

y2056, не понял ваш ответ совершенно. Какой ещё пакет выдаётся?? Какое семейство? Читать все 9 регистров или не читать -это дело программиста. Какой у вас рабочий скетч получился в итоге?

Logik
Offline
Зарегистрирован: 05.08.2014

А это y2056 так кратко перевел следующее из мануала :))

READ SCRATCHPAD [BEh]
This command allows the master to read the contents of the scratchpad. The data transfer starts with the least significant bit of byte 0 and continues through the scratchpad until the 9th byte (byte 8 – CRC) is read.

y2056
Offline
Зарегистрирован: 27.05.2015

Добрый день. Не знаю что за проблема была но был какойто глюк. Мож что с портом может что с датчиком. Сейчас все работает отлично.

Вот скетч:

#include <OneWire.h>
OneWire ds(9);

void setup() {
Serial.begin(9600); 
}
 
void loop() {
 
ds.reset(); 
ds.write(0xCC);
ds.write(0x44);
delay(750);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
int data =  ds.read() | (ds.read()<<8);
data=data>>1;
Serial.println(data);
}

 

y2056
Offline
Зарегистрирован: 27.05.2015

Заметил еще такой глюк это уже на компе какая то из прог при закрытии ее не закрывает порт и он получается занят.

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

А вместо int  вроде  unsigned int логичнее, а?

y2056
Offline
Зарегистрирован: 27.05.2015

Возможно и так. Скетч на скорую руку, просто надо было запустить сам датчик на ардуинке.