Отрицательные температуры и ds18b20
- Войдите на сайт для отправки комментариев
Приветствую форумчан. Поиском ненашол а что нашол непомогло решить проблемму вывода отрицательных температур. До сих пор ненужно было и справлялся тем что было а счас прям край.
Итак собрал на дааавно валявшейся 8266-03 + ds18b20+bmp080+dht11:) - внешний датчик для отправки на https://thingspeak.com/ и на http://narodmon.ru/
Всё бы ничего и работает прекрасно особенно нравится первый сервис, однако чуток ударили морозы и вместо заветных -0,06град я вижу 4095,5град ( ровно так ведёт себя он при обрыве связи, датчик имеется ввиду или отсутствии подтяжкит по питанию на data ножку). Вот тут собственно показания https://thingspeak.com/channels/314888 именно мои. Скетчики пробовал ув. bwn - несколько лет назад нужен был контроллер для аквариума который и до сих пор работает без нареканий - вообще без каких либо.Итак для сбора данных с ds18b20 использую только onewire без библиотек dallas - может в этом и беда.
Первый скетчик (задаётся "разрядность", я понимаю разница у нескольких датчиков ds18b20 доходит до 0,5град, но приятно видеть плавность так скажем.)
#include <ESP8266WiFi.h> #include <OneWire.h> //Подключаем библиотеку для температурного датчика DS18B20 //=====Termo_Sensor ds18b20* int tempPin=12; //Определяем порт шины OneWire (IC) для температурного датчика DS18B20, Gpio12 OneWire ds(tempPin); //Создаем объект для работы с термометром byte addr[8]={0x28,0xFF,0xFA,0x85,0x54,0x14,0x01,0x67}; //адрес датчика DS18B20_уличного 8266-03s unsigned int raw; int Temp; //Температура на уличке с точностью 0,06 градС void setup(){ // Serial.begin(115200); razrDall(0x60); //Требуемая разрядность ds18b20 } //=========== Функция изменения разрядности Даллас void razrDall(byte raz){ ds.reset(); ds.select(addr); ds.write(0x4E); ds.write(0x7F); ds.write(0xFF); ds.write(raz); } //=========== Считывание температур void dallas(){ ds.reset(); ds.write(0xCC); //Обращение ко всем датчикам ds.write(0x44); //Команда на конвертацию delay(750); int temp; ds.reset(); ds.select(addr); ds.write(0xBE); //Считывание значения с датчика temp = (ds.read() | ds.read()<<8); //Принимаем два байта температуры Temp = temp*100/4/4; //Температура в целочисленном формате *100два и знака после запятой. // Serial.print("tempDs: "); // Serial.println(Temp/100.0); } void loop(){ dallas(); }
и второй который я оооочень часто пользую но он более прожорливый как все утверждают:
#include <ESP8266WiFi.h> #include <OneWire.h> //Подключаем библиотеку для температурного датчика DS18B20 //=====Termo_Sensor ds18b20* int tempPin=12; //Определяем порт шины OneWire (IC) для температурного датчика DS18B20, Gpio12 OneWire ds(tempPin); //Создаем объект для работы с термометром byte data[12]; byte addr[8]={0x28,0xFF,0xFA,0x85,0x54,0x14,0x01,0x67}; //адрес датчика DS18B20_уличного 8266-03s unsigned int raw; float temp; //Температура на уличке с точностью 0,06 градС void setup(){ // Serial.begin(115200); } //=========== Считывание температур void dallas(){ ds.reset(); ds.write(0xCC); //Команда инициации ds.write(0x44); //Start conversion, with parasite power on at the end } //=========== Обработка температур void tempDallas(){ temp=DS18B20(addr); // Serial.print("Temp: "); // Serial.println(temp); } float DS18B20(byte*adres){ ds.reset(); ds.select(adres); ds.write(0xBE); //Read Scratchpad for (byte i=0;i<12;i++)data[i]=ds.read(); //We need 9 bytes (разрядность) int raw=(data[1]<<8)|data[0]; //Переводим в температуру float celsius=(float)raw/16.0; //Для ds18b20 делим на "16", для ds18s20 на "2" return celsius; } void loop(){ dallas(); delay(750); tempDallas(); }
Выкладываю не весь скетчик для мониторинга и отправки а лиш температуру, если кому нужно выложу полный, просто чтобы ели решитте помочь - немешало лишнее.
Второй бедой стало непонятное поведение некоторых далласво при работе со вторым вариантом скетча - чтобы я неделал разрядность при показаниях 0,5град, если этиже далласы со скетчем первым то все пучком разрядность 0,06 град. Выручайте братцы - холодает и нужны точные показания :)
Сама железяка сделана на коленке и впоследствии затянута в термоусадку, usb делал намеренно дабы была возможность в случае чего перепрошить, поменять точку доступа и прочее. Работае тпросто проснулась от deep.sleep сняла показания и отправила в пару мест, заснула на 5 мин. По замерам (неточным так как сам тестер тоже чтото потребляет) за сутки ровно 31мА\час потребление, тоесть на месяц мне хватает одной батареи (мелкого повербанка) на 18650.
Август-сентябрь отработало изумительнол, правда интернет 4Г и невсегда стабилен потому иной раз перерывы в передачи, потом поменял вре11 - эта падла давала разницу за 10 минут от 35% до 75%, но что было то и попробовал. А вчера первые морозцы и беда.
P.S. если кому лениво читать с самого начала и смотреть данный сериал машина времени тут и перенесёт вас к решению :) http://arduino.ru/forum/programmirovanie/otritsatelnye-temperatury-i-ds1... - заключительный.
У вас в обоих примерах нет обработки отрицательных температур. Не обрабатывается бит знака. Не учитывается выбранная разрядность (незначащие биты). Для помещения или аквариума самое то, для улицы не годится.
Примерно так должно быть
При положительном значении ( S=0 бит знака равен 0) код перевести в десятичный и умножить на 0,0625 °C.
При отрицательном значении ( S=1 бит знака равен 1) сначала необходимо перевести дополнительный код в прямой. Для этого надо инвертировать каждый разряд двоичного кода и прибавить 1. А затем перевести в десятичный и умножить на 0,0625 °C.
Thorn, привет. Возможно Penni и прав, но попробуй сперва float вместо int-ов. Здесь поизящней сделано на WDT, в 47 посту на миллис.
UPD, сейчас в город уеду, попробую вечером собрать. Отрицательные не нужны были, но когда игрался с датчиками, точно помню в морозилке -16гр без ухищрений.
Ятак понял нужно понять сторку 35 второго кода и далее приводить к вашему примеру? Так.
Thorn, привет. Возможно Penni и прав, но попробуй сперва float вместо int-ов. Здесь поизящней сделано на WDT, в 47 посту на миллис......
Ух невидел эту тему когда поисками пользовался, кстати первый скетчик тоже ваш, только чуточку подправил и влепил ненавистный delay ( все равно код работал один раз и засыпал, паралельно ничего ненужно было делать). Именно ваш код помог поднять "нерабочие" далласы что выдавали разрешение всего в 0,5 град, с вашим кодо стали давать положенные 0,06 град.
Тему ууказанную обязательно погоняю сегодня
Полностью функцию поменять. Засунул датчик от ректификатора в морозилку, показывает все корректно. Функция на миллисе из 47 поста. (на три датчика)
Всё уже как раз дошёл до второй странички - вурнулся назад - счас в свой попробую вставить.
Всё уже как раз дошёл до второй странички - вурнулся назад - счас в свой попробую вставить.
Там то ли на второй то ли на третьей, как модифицировать на один датчик и как переменные объявлять.
Все, уехал.))))
Помойму разобрался, компилятор неругается. Завтра на работе (остался там cp2104) прошью esp и в при любом раскладе выложу кусочек с далласом и весь код для самого датчика мониторинга, классная штука может кому понравится и пригодится, на зиму такойже спаяю за небольшой доработкой курочкам (помимо измерений свет включать и ИК лампу на обогрев зимой).
Почему вы так DallasTemperature не любите? Там уже и минусы и корректировки и проверки. Да, код там блокирующий, но я понимаю, если бы делали какой-то самогонный агрегат, а не домашний термометр... На 9 бит переключите термометр и будет вам задержка в районе ~100мс. Или DHT21 возьмите - точность будет не хуже (и явно лучше DHT11), но температура/влажность в одном корпусе и исполнение радует.
Почему вы так DallasTemperature не любите? Там уже и минусы и корректировки и проверки. Да, код там блокирующий, но я понимаю, если бы делали какой-то самогонный агрегат, а не домашний термометр... На 9 бит переключите термометр и будет вам задержка в районе ~100мс. Или DHT21 возьмите - точность будет не хуже (и явно лучше DHT11), но температура/влажность в одном корпусе и исполнение радует.
Да честно говоря, 2К жалко не пойми на что выкидывать. Отрицательная температура корректно работает на OneWire. Не знаю откуда эта лажа про нее полезла. Проверки тоже в OneWire все есть, смысл в этой надстройке?
Да честно говоря, 2К жалко не пойми на что выкидывать. Отрицательная температура корректно работает на OneWire. Не знаю откуда эта лажа про нее полезла. Проверки тоже в OneWire все есть, смысл в этой надстройке?
Нет, я не против, когда человек прочитал даташит и правильно входящие данные с 1W обработал врукопашную.
Однако, исходя из вопроса и скетча в первом посте, лучше бы ТС взять готовую библиотеку и начать получать удовольствие от жизни. Тем более, как я понимаю, в ресурсах он пока что не испытывает недостатка.
Нет, я не против, когда человек прочитал даташит и правильно входящие данные с 1W обработал врукопашную.
Однако, исходя из вопроса и скетча в первом посте, лучше бы ТС взять готовую библиотеку и начать получать удовольствие от жизни. Тем более, как я понимаю, в ресурсах он пока что не испытывает недостатка.
Ну, ТС, он упорный. За полтора месяца сам написал акваконтроллер (ему год-полтора пророчили). С OneWire связался с моей подачи, каюсь. Не срослось у меня с DT, буквей в нем много, а аглицкого у меня мало, OneWire оказалось проще, о чем не жалею.
У Вас скилл программирования на пару порядков выше моего, но здесь ведь форум не мэтров, а любителей. Как сказал один из бывавших здесь программистов: если программа делает то, что требуется и без косяков, то какая х... разница в каком стиле она написана?
У Вас скилл программирования на пару порядков выше моего, но здесь ведь форум не мэтров, а любителей. Как сказал один из бывавших здесь программистов: если программа делает то, что требуется и без косяков, то какая х... разница в каком стиле она написана?
Думаю, это как раз был не программист, а любитель. Профессионал должен понимать, что токое поддержка программного продукта, и что значит придерживаться единого стиля в условиях текучести кадров и возможности переброски исполнителей с одного проекта н другой (не говоря даже о том, что разработкой обычно занимаются одни люди, а поддержкой - другие).
У Вас скилл программирования на пару порядков выше моего, но здесь ведь форум не мэтров, а любителей. Как сказал один из бывавших здесь программистов: если программа делает то, что требуется и без косяков, то какая х... разница в каком стиле она написана?
Думаю, это как раз был не программист, а любитель. Профессионал должен понимать, что токое поддержка программного продукта, и что значит придерживаться единого стиля в условиях текучести кадров и возможности переброски исполнителей с одного проекта н другой (не говоря даже о том, что разработкой обычно занимаются одни люди, а поддержкой - другие).
Я снова упираю на слово любителей. И сказано было именно в этом контексте, когда кому то из великих программистов захотелось поплювать в говнокод новичка. Там нет поддержки, нет кадров, а есть единственный исполнитель и конкретный проект , который либо работает, либо нет. И как подсказывает мой опыт (достаточный), ты либо достиг результата, либо нет. После его достижения, всем похрен как ты это сделал, как и похрен, почему ты это не сделал. Соответственно, конечен результат и оценка деятельности осуществляется именно по нему. ИМХО.
Итак господа чего вышло :)ВОт такой накопипастил кодик для получения температур и размещения их на web-страничке:
Резистор smd - мелкий припаян прямо под корпусом далласа. Платку пока взял поболше и попроще с ней 8266-12е а мелкую 8266-03 как готовыйвариант пока нетрогаю, получится на большой в мелкую залью.
Вобщем невыходи у меня каменный цветок. Для начало огорчило что ни одно значение дискретности неменяет показаний, они все гда кратны 0,5град.
Потом положил в морозилочку макет и стал ждать, ждать долго непришлось :( показания при минусах равны показаниям на солнце. Видимо я всёравно чт ото делаю нетак. Скрины макетки и кринов прилагаю.
И да, ели подключиться к модулю 8266-12е напрямую по wifi (не к сети в которую он входит) получаеш IP-адрес вида 192.168.4.х однако это немешает нормально получать показания с его вебстранички ибо мы насильственно жестко указали ему и маску и шлюз и адрес.
скрин до морозилки :)
и после :(
Строка 30 в setup() походу неработает вообсче, тоесть счас залил это скетчик в дргую esp-шку и там где далласы прекрасно по умолчанию без танцев с разрядностью выдают 0,06 и там прекрасно скетчик от bwn работает. Мало того изменяя её (строку 30) - показания неменяются разрядность остается 0,06 и при ds.write(0x1F); и при ds.write(0x7F);
Как минимум бкз ds.reset() нет никакого обмена на шине. Ваш байт уходит в никуда. По умолчанию, стоит 12 бит разрешение. Ну и минусы опять не обрабатываете и не значащие биты... Если принципиально не хотите брать библиотеку далласа и не хотите читать даташит, то хотя бы откройте библиотеку далласа и посмотрите как это делается.
Строка 30 в setup() походу неработает вообсче, тоесть счас залил это скетчик в дргую esp-шку и там где далласы прекрасно по умолчанию без танцев с разрядностью выдают 0,06 и там прекрасно скетчик от bwn работает. Мало того изменяя её (строку 30) - показания неменяются разрядность остается 0,06 и при ds.write(0x1F); и при ds.write(0x7F);
Она и не должна работать, там должна быть полная последовательность, посмотрите у Dimax в самом начале (4 пост). Раскомментировать, запустить и снова закомментить, не надо дырку в ROM протирать.
По отрицательным - ищите косяк на стороне приема-передачи. Сейчас запустил Ваш код:
Скрин из морозилки:
с разрядностью - отложу пока, потом докурю. С выводом - приёмом. Снова зашил в nodeMCU скетчи, отнёс в морозилку- снова ри минусе неверные показания, ну ладно wifi и сам модуль может что даёт, надо в Seral посмотретьт, закутываю в тряпочку :) и лечу соединять шнурком. В итоге в Serial вот такое пришло...
Temp: 4090.50
Temp: 4091.00
Temp: 4091.00
Temp: 4091.00
Temp: 4092.00
Temp: 4094.00
Temp: 4095.50
Temp: 1.00
Temp: 2.50
Temp: 3.00
Temp: 4.00
Temp: 4.50
Temp: 6.00
Temp: 6.50
Temp: 7.50
Temp: 8.50
Я в печали - у вас код работает у меня нет, чудес небывает а значит виноват сам контрорллер, попробую сейчас на Nano проделать подобное.
Чет мне подсказывает, что он float не понимает. Такой игрушки не было, здесь, пас.
в некотором роде спасало то, что использовали int который в ардуино -32...+32 поэтому разряды знака худо бедно отрабатывались и в морозилке работало. А как это все компилируется под ноде надо смотреть. Там может и тип инт от 0 до 65. Поэтому если в даташите сказано два байта, то их и надо рассматривать как два байта. 0 и 1 они везде 0 и 1 и при правильном переводе код будет работать везде. Все остальное это костыли чтобы доковылять от одного проекта к другому и снова начать наступать на теже грабли.
И еще раньше было две версии прошивки ноде под инт и флот. Давно с ними не работал поэтому не знаю может сейчас уже одна универсальная прошивка если нет, то надо прошиваться флоат прошивкой.
в некотором роде спасало то, что использовали int который в ардуино -32...+32 поэтому разряды знака худо бедно отрабатывались и в морозилке работало. А как это все компилируется под ноде надо смотреть. Там может и тип инт от 0 до 65. Поэтому если в даташите сказано два байта, то их и надо рассматривать как два байта. 0 и 1 они везде 0 и 1 и при правильном переводе код будет работать везде. Все остальное это костыли чтобы доковылять от одного проекта к другому и снова начать наступать на теже грабли.
Так напишите кодом, как. Я в этой математике лапоть, вряд ли умное предложу.
Чет мне подсказывает, что он float не понимает. Такой игрушки не было, здесь, пас.
Нене, погодите чуточку. Вы меня снова натолкнули на мысль. Счас быстренько всёже решил попробовать с остандартным примером библиотеки #include <DallasTemperature.h>
В итоге как и ожидал температура стала целочисленной, ну да для примера сойдёт а вот с минусами стало иначе, также заморозил потом добежал до serial и вот что выходит из него :)
Temp: 248
Temp: 248
Temp: 249
Temp: 251
Temp: 254
Temp: 0
Temp: 0
Temp: 1
Temp: 2
Temp: 2
Temp: 2
Temp: 3
Temp: 4
Может мы уже гдето на грани истины?
И еще раньше было две версии прошивки ноде под инт и флот. Давно с ними не работал поэтому не знаю может сейчас уже одна универсальная прошивка если нет, то надо прошиваться флоат прошивкой.
И тут я кстаи начинаю вспоминать, пробовал я БЕЗ библиотек далласа измерять температуру и выводить на дисплей ili9363c, так вот толкьо в setupe стоило запустить tft.begin(); - то всё туши свет, температура 255 и никуда далее. Так и бросил эту затею стал меню делать в web - чтобы хоть както настроить терморегулятор или релюшку. И это именно на 8266 было, теже скетчики на любой ардуинке как часики. На сообществе 8266 вяло отреагировали на мою беду - там народ более возвышенный, беспроводной 6)
Нене, погодите чуточку. Вы меня снова натолкнули на мысль. Счас быстренько всёже решил попробовать с остандартным примером библиотеки #include <DallasTemperature.h>
В итоге как и ожидал температура стала целочисленной, ну да для примера сойдёт а вот с минусами стало иначе, также заморозил потом добежал до serial и вот что выходит из него :)
Temp: 248
Temp: 248
Temp: 249
Temp: 251
Temp: 254
Temp: 0
Temp: 0
Temp: 1
Temp: 2
Temp: 2
Temp: 2
Temp: 3
Temp: 4
Может мы уже гдето на грани истины?
Так истина понятна, некорректно преобразуются типы. Если Penni напишет как это сделать правильно, то и функцию подредактируем.
Фактически надо преобразовать вторую строку с верным алгоритмом.
Я ж там выше писал, примерно вот так для 12 бит
Господа всёже с либрари далласа завелось на nodeMCU - в последнем коде ошибку допустил :( в строке 09 и 21 соответственно. Минусы показывает. Как говорится "..ложечка нашлась но осадочек остался...." Теперь бы без даллас-библиотек
Я ж там выше писал, примерно вот так для 12 бит
Вот чего получилось:
в serial льётся нечто
Temp: -268431408.00
Temp: -268431408.00
Temp: -268431408.00
Temp: -268431408.00
Temp: -268431408.00
Thorn, зачем вы перекладываете из одной переменной в другую по нескольку раз? Одна путаница. Всё делается одной строчкой.
и всё, этот вариант 100% даст отрицательные температуры.
У Вас нодемку прошита прошивкой int а не float. Либо перепрошить на флот либо вручную его сделать для отображения
Thorn, зачем вы перекладываете из одной переменной в другую по нескольку раз? Одна путаница. Всё делается одной строчкой.
и всё, этот вариант 100% даст отрицательные температуры.
Попробовал и вашу строчку:
всё одно четырёхтысячные значения при минусах. Прав видимо ув. Penni дело было не в бобине, сам модуль таков, буду искать "прошивку" на него пока но самое главное нужно будет на 8266-03 найти она су...ко мелкая такая но удобная этим. Вобщем пока неполучистя на большой на мелкой нет смысла ничего дергать :(
Да можно самому сделать на инт прошивке если у вас там тоьлко один датчик например. Если 0,0625 умножить на 10000 потом ваше значение умножить на 625 получится целое число, а потом уже запятую при выводе воткнуть и все.
Вобщем быстренько зашёл сюда http://nodemcu-build.com/faq.php#supportи сюда https://github.com/nodemcu/nodemcu-firmware/releases
Скачалось, прошил ESPEasy_v2.0.0-dev11 тузлочкой.
Указал именно float (не integer) - далее скетчик а по итогу всё как и было. Как то всё раком с этой 8266 у меня с с амого начала
Thorn, может у вас ds18S20 ?
Thorn, может у вас ds18S20 ?
У S20 нулевой байт 0x10, а ТС пишет, что 0x28. Так что B20.
С далласом у него все работает, но он продолжает есть кактус :(
Thorn, тут варианта два, либо ставьте DT и с ней работайте (если действительно все корректно), либо потрошите ее и смотрите как там сделано преобразование, дальше по образу и подобию. ИМХО.
Thorn, может у вас ds18S20 ?
точно B20 - про S20 читал давно както при покупке ориентировался на B, вот от на node распаян
У S20 нулевой байт 0x10, а ТС пишет, что 0x28. Так что B20.
С далласом у него все работает, но он продолжает есть кактус :(
согласен с библами работает, и да это будет самый простой путь. И даже не смотря что памяти дохрена в esp и хватит на сотню библиотек таких - но вот хочется и всё тут, да сам немогу и многого непонимаю но вот хочется на onewire. Возможно трачу время форумчан даже- комуто важнее есть нужда помочь, - необессудьте.
p.s. прошился нормлаьно имеено float при старте модуль выдавал в serial:
NodeMCU custom build by frightanic.com
branch: master
commit: 443e8219527f5b2190324a969a4586f9d3d731bf
SSL: false
modules: dht,ds18b20,file,gpio,mdns,net,node,rtctime,tmr,uart,wifi
build built on: 2017-10-23 11:07
powered by Lua 5.1.4 on SDK 2.1.0(116b762)
Thorn, а просто отрицательные числа, пробовали вывести?
float a= -5.25 ;
Serial.println(a);
unsigned temp = (ds.read() | (ds.read()<<8));
Если вот это (без 16) вывести в порт в HEX. Просто любопытно посмотреть что там все же идет без всяких преобразований.
Thorn, а просто отрицательные числа, пробовали вывести?
float a= -5.25 ;
Serial.println(a);
В глобальных объявил: float a= -5.25 ;
В функции вывел: Serial.println(a); (в конце вывода температуры, в рабочем коде)
В serial все отличненько выводится и с минусом даже :) Значит float плонимает отрицательный?
unsigned temp = (ds.read() | (ds.read()<<8));
Если вот это (без 16) вывести в порт в HEX. Просто любопытно посмотреть что там все же идет без всяких преобразований.
Угу, при варианте когда плюсовая температура:
Serial:
Temp: 496.00
-5.25
Temp: 496.00
-5.25
Temp: 496.00
-5.25
Temp: 496.00
(-5.25 несмотрите это переменная\постоянная флоат :)
А вот так что выдаст в сериал и если есть возможность попробовать при небольшом минусе.
Как ни интересно смотреть этот сериал, но нужно завязывать. ;)
В ЕСП int 32-х разрядный. Используйте везде для температуры short или int16_t, это синонимы. Тогда минус будет минусом, а не 4096. ;)
Код, который работает верно на ардуиноне работает на esp8266, без понимания деталей.
Пока я добрый и трезвый поясню: в некотором смысле знак "-" это 1 в старшем разряде. Вы прочли 2 байта из датчика и сфомировали число:
temp = data0 | (data1 << 8), так? В ардуинке этого достаточно, так как вы в старший разпяд temp записали старший разряд из data1. А в esp8266 это уже не старший разряд целого, поскольку целое там имеет 32 разряда. temp в esp должна иметь тип short, он - 16 разрядный и все будет нормально.
Как ни интересно смотреть этот сериал, но нужно завязывать. ;)
temp = data0 | (data1 << 8), так? В ардуинке этого достаточно, так как вы в старший разпяд temp записали старший разряд из data1. А в esp8266 это уже не старший разряд целого, поскольку целое там имеет 32 разряда. temp в esp должна иметь тип short, он - 16 разрядный и все будет нормально.
C первого ржал аки конь, с утра прям что нужно было для настроя.
А далее попробовал такобъявить переменную temp, была float а стала short.
Плюсовые показывает тольк оцелую часть без запятой :) а минус остался как и был тоже бездробной части 4095.... Или снова нето сделал? Посмотрим есчо чутку сериал :)
Проверьте через sizeof размер типов данных для ESP а то так гадать только сидеть.
Thorn, не получилось потому, что внутри (ds.read() | (ds.read()<<8))/16.0; все вычисления происходят в 32-битной переменной. Тут два варианта , либо попробовать все операции вогнать в нужные рамки, типа int16_t temp= (byte)ds.read() | (int16_t)(ds.read()<<8); Либо сразу полученные два байта задвинуть в самый в старшую часть переменной, а потом вернуть назад. Тогда знак должен сохранится :) float temp = ((ds.read()<<16 | (ds.read()<<24))>>16) / 16.0 ;
Thorn, не получилось потому, что внутри (ds.read() | (ds.read()<<8))/16.0; все вычисления происходят в 32-битной переменной. ....
Попробовал так:
В Serial льётся при плюсовой интересная уже картинка, уже ближе к тому чего нужно:
****Temp: 30.19
****temp: -8.06
****Temp: 30.25
****temp: -8.06
****Temp: 30.25
****temp: -8.06
****Temp: 30.31
****temp: -8.06
****Temp: 30.37
****temp: -8.06
****Temp: 30.31