Два DS1820, не корректные показания, помогите разобраться.
- Войдите на сайт для отправки комментариев
Добрый день, я тут новичок, да и вообще только начал изучение ардуино.
Пытаюсь вытянуть температуру с двух датчиков DS1820, по некоторым библиотекам определяется как DS18S20, что в общем то одно и тоже.
Суть проблеммы, подключил датчики к Нано, тремя проводами, с сопративлением, скетчем из Даллосовской библиотеки(мультипл) проверяю адреса датчиков, всё показывает, и адреса и корректную температуру, затем делаю другой скетч, по примерам из тем, показания отправляю на LCD и в сериалпорт. Показания идут с обоих датчиков, но не корректные, занижены в десятки раз, и даже не понятно на сколько именно.
Пробылвал смотреть показания с отключенным датчиком, на даллосовской библиотеке начинает показывать -127 градусов, это я так понимаю всё правильно. А на моём скетче показывает 4095,94 при отключенном датчике.
Прошу помощи рабобраться что не так, два вечера уже убил на поиск температуры, освоение прерываний както проще далось. Скет прилагаю.
#include <OneWire.h> #include <Wire.h> // I2C #include <LiquidCrystal_I2C.h> // LCD OneWire ds (10); byte data[12]; byte addr1[8] = {0x10, 0x40, 0xDF, 0xD7, 0x01, 0x08, 0x00, 0xE5}; // ID индивидуально для каждого датчика byte addr2[8] = {0x10, 0x3F, 0xD3, 0xD7, 0x01, 0x08, 0x00, 0x78}; unsigned int raw; float temp1, temp2; LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { Wire.begin(); lcd.init(); lcd.backlight(); // вкл. подсветку LCD (noBack-выкл) lcd.clear(); Serial.begin(9600); } void loop() { temp1 = DS18B20(addr1); temp2 = DS18B20(addr2); Serial.println(temp1); Serial.println(temp2); lcd.setCursor(6, 0); lcd.print(temp1); // отображение температуры lcd.setCursor(6, 1); lcd.print(temp2); // отображение температуры } //================================================================================== // Считывание температуры //================================================================================== float DS18B20(byte *adres){ { ds.reset(); ds.select(adres); ds.write(0x44); // start conversion, with parasite power on at the end ds.reset(); ds.select(adres); ds.write(0xBE); // Read Scratchpad for (byte s = 0; s < 9; s++) // можно увеличить точность измерения до 0.0625 *С (от 9 до 12 бит) data[s] = ds.read (); raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру float celsius = (float)raw / 16.0; return celsius; }}
А задержку на конвертацию, дядя будет ставить?
Не помогает и задержка, или не туда добавляю задержку?
Попробуйте 33 строку вставить после 64.
P/S Ессно temp1 заменить на celsius.
Вы говорите про 18S20, а скетч приводите для 18B20. У этих датчиков разное разрешение и пересчет показаний будет по разному.
Ближе к истине, не нашел другомго пересчета, не поможете.
Скетч облегчил.
Согласен с alex_r61, S-ки в руки не попадали, не обратил внимания. Открывайте пример из OneWire - DS18x20 Temperature.
Он в
Вот като так получилось, вроде корректно показывает температуру , и без паузы после запроса. ничего конечно не понял в этих строчках 44-45-46, особенно не понятно что такое data[0] и [6], и что такое int16_t.
Есть какие нибудь замечания по преобразованию?
data[0]-data[8] это 8 байт полученных от датчика. Что значит каждый, читать в даташите.
Если преобразовывает корректно, значит все верно. В битовых операциях не силен, не объясню.
Считывание без задержки, в данном случае без разницы. Если интервал опроса значительный, будете получать результат от предыдущей конвертации.
Всем спасибо за помощь.
В итоге получил температуру с двух датчиков DS1820( или DS18S20). С корректными показаниями в сериалпорт, без пауз, иначе можно было использовать Даллосовскую библиотеку, чего не хотелось.
Может кому пригодиться.
46 строка для всех датчиков. А для S-ки еще 46-47.
Для получения задержек, далласовская библиотека не нужна. Вот на миллис:
В данном случае на 3 датчика. Адреса храняться в массиве addr[], температуру читаем в массив Temp[].
Присваивая значения второму flagDallRead, можем менять требуемый интервал.
Вызов dallRead( flagDallRead*1000 );
Для вас надо добавить считывание 6 байтов от датчиков и пересчет. Для DS18B20 достаточно двух, как у меня.
Идея украдена здесь.
что-то последний пример (про миллис) я вообще не понял. Вернее идея понятна, но реализация... не будет оно работать так.
что-то последний пример (про миллис) я вообще не понял. Вернее идея понятна, но реализация... не будет оно работать так.
А что в нем не так?
... не будет оно работать так.
А что в нем не так?
Вот уважаю таких людей, из них потом депутаты классные получаются. Сказал веское мнение и в кусты. А обоснование сами придумаете.((((
Честно говоря, ожидал что вы объясните как оно работает :)
Что мне не понравилось:
1. при каждом вызове обнуляется prevTime, соответственно, интервал будет отсчитываться некорректно (по факту, он скорее всего всегда будет больше заданного интервала, т.к. расчетный будет временем от включения МК)
2. тоже самое с flagDall, соответственно, при каждом вызове будем отправлять комманду всем датчикам на конвертацию
1. prevTime - static, обнуляется только при первичной инициализации, далее работает 6 строка.
2. flagDall аналогично и потом инвертируется при каждом проходе. Соответственно true - конвертация, false - считывание.
ах ну да, этиж недоглобальные переменные. Сорри, вылетело, сам их не использую - очень код читать потом неудобно (но это глубоко ИМХО).
PS не надо сразу резко реагировать и депутатами обзываться - зашел глянул, отписался. Как в следующий раз зашел, так ответил :)
Так зашли, плюнули, причин не объяснили и удалились.)))) Абыдно, да.
хочу получать температуру для девайса 18B20 , переписал пример 1-wire
в принципе оно считывает, но кусок програмы после этого кода не работает.. :(
задача была - получить значение celsium - и оперировать в программе этим значением дальше.
так можно делать? какие ошибки я допустил?
самому разобраться будет сложновато.
Посмотрите здесь.
Там есть и с wdt и с millis.