DS18S20 не работают стандартные функции
- Войдите на сайт для отправки комментариев
Ср, 27/05/2015 - 13:23
Всем добрый день. Интересует такой вопрос почему ардуино не работает со стандартным чтением температуры как в этом коде:
#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.
Чего-то сильно недостает этому скетчу..
Сравните с http://playground.arduino.cc/Learning/OneWire?action=sourceblock&num=1
P.S. Про асм понравилось.
Спасибо за инфу. Это на просторах инета я видел. Просто С я только начал изучать и не все понятно. Мне не совсем ясно почему просто нелзя сбросить датчик, запустить преобразование температуры и прочитать. Если нет необходимости знать его семейство и т.д. Или библиотека работающая с датчиком к чтению этих данных обязывает. Можно даже CRC не вычислять если ошибка чтения не важна. Проскочит ошибка и шут с ней.
y2056, вроде всё верно визуально. А зачем вы данные туда-сюда перекладываете? Можно сразу класть в темп:
Ну, не знаю, мне как-то больше нравится сначала найти датчик, узнать его адрес, а потом уже ds.select(addr) и так далее. В случае нескольких датчиков весьма удобно будет опять же.
Я просто зделал примерно по аналогии как на асме так понятнее для меня, но я думаю это не столь важно я просто понять не могу что не так, почему датьчик не кидает данные или у него сброс проходит не корректно.
y2056, откуда ж нам это знать? Или вы думаете мы по скетчу можем диагностировать что вы там у себя неправильно включили? Проблема не в коде, ещё раз вам говорю.
Да но тогда почему скетч который привел ARARIS работает, а мой нет, Схема собрана правильн поверьте мне в электронике не первый год. Ардуинка подключина, и на связи. Тупо копирую скетч ARARIS, он работает, копирую свой нет. При этом я никаких других действий не выполняю кроме компиляции и заливки в ардуинку. Смотрел разными прогами в том числе и терминалом, все одно и тоже. А вы Dimax говорите это не код. Я его для этого и привел, что именно так работает а так нет.
Придется посмотреть осцилом что происходит на ногах датчика. И я не говорю про какие то расчеты или еще что мне просто сейчас надо чтоб датчик выдал цифры температуры, тупо и все.
y2056, да я подумал что у вас ds18b20, ваш код для него. Для ds18S20 немножко по другому нужно сделать.
А что не так? Насколько я помню у этого датчика команды те же.
y2056, я с ним не работал, поэтому прокомментировать не могу. У вас же есть рабочий пример? Не думаю что трудно вычислить что там по-другому делают.
Там читают его семейство, rom и т.д. А можно все это пропустить, если одно устройство и тупо надо данные по температуре. Ну ладно нет так нет. Да и просто пример примером а хочется докопаться до истины почему не работает в этом варианте, в чем причина в библиотеке ошибка, она этого не поддерживает или так в С нельзя.
Вот кстати чел. делал примерно тоже самое но чисто на компе.
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, я сейчас посмотрел в универсальный скетч в составе библы OneWire, для обычных датчиков читается так:
А если детекнулся датчик S, то читается уже так:
Я разобрался. Просто при чтении датчик почему то выдает весь пакет со своим семейством.
y2056, не понял ваш ответ совершенно. Какой ещё пакет выдаётся?? Какое семейство? Читать все 9 регистров или не читать -это дело программиста. Какой у вас рабочий скетч получился в итоге?
А это 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.
Добрый день. Не знаю что за проблема была но был какойто глюк. Мож что с портом может что с датчиком. Сейчас все работает отлично.
Вот скетч:
Заметил еще такой глюк это уже на компе какая то из прог при закрытии ее не закрывает порт и он получается занят.
А вместо int вроде unsigned int логичнее, а?
Возможно и так. Скетч на скорую руку, просто надо было запустить сам датчик на ардуинке.