Отрицательные температуры и ds18b20

Thorn
Offline
Зарегистрирован: 07.11.2014

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

Итак собрал на дааавно валявшейся 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 град. Выручайте братцы - холодает и нужны точные показания :)

Thorn
Offline
Зарегистрирован: 07.11.2014

Сама железяка сделана на коленке и впоследствии затянута в термоусадку, usb делал намеренно дабы была возможность в случае чего перепрошить, поменять точку доступа и прочее. Работае тпросто проснулась от deep.sleep сняла показания и отправила в пару мест, заснула на 5 мин. По замерам (неточным так как сам тестер тоже чтото потребляет) за сутки ровно 31мА\час потребление, тоесть на месяц мне хватает одной батареи (мелкого повербанка) на 18650.

Август-сентябрь отработало изумительнол, правда интернет 4Г и невсегда стабилен потому иной раз перерывы в передачи, потом поменял вре11 - эта падла давала разницу за 10 минут от 35% до 75%, но что было то и попробовал. А вчера первые морозцы и беда.

P.S. если кому лениво читать с самого начала и смотреть данный сериал машина времени тут и перенесёт вас к решению :) http://arduino.ru/forum/programmirovanie/otritsatelnye-temperatury-i-ds1... - заключительный.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

У вас в обоих примерах нет обработки отрицательных температур. Не обрабатывается бит знака. Не учитывается выбранная разрядность (незначащие биты). Для помещения или аквариума самое то, для улицы не годится.

Примерно так должно быть

При положительном значении ( S=0 бит знака равен 0) код перевести в десятичный и умножить на 0,0625 °C.

При отрицательном значении ( S=1 бит знака равен 1) сначала необходимо перевести дополнительный код в прямой. Для этого надо инвертировать каждый разряд двоичного кода и прибавить 1. А затем перевести в десятичный и умножить на 0,0625 °C.

bwn
Offline
Зарегистрирован: 25.08.2014

Thorn, привет. Возможно Penni и прав, но попробуй сперва float вместо int-ов. Здесь поизящней сделано на WDT, в 47 посту на миллис.

UPD, сейчас в город уеду, попробую вечером собрать. Отрицательные не нужны были, но когда игрался с датчиками, точно помню в морозилке -16гр без ухищрений.

Thorn
Offline
Зарегистрирован: 07.11.2014

Ятак понял нужно понять сторку 35 второго кода и далее приводить к вашему примеру? Так.

Thorn
Offline
Зарегистрирован: 07.11.2014

bwn пишет:

Thorn, привет. Возможно Penni и прав, но попробуй сперва float вместо int-ов. Здесь поизящней сделано на WDT, в 47 посту на миллис......

Ух невидел эту тему когда поисками пользовался, кстати первый скетчик тоже ваш, только чуточку подправил и влепил ненавистный delay ( все равно код работал один раз и засыпал, паралельно ничего ненужно было делать). Именно ваш код помог поднять "нерабочие" далласы что выдавали разрешение всего в 0,5 град, с вашим кодо стали давать положенные 0,06 град.

Тему ууказанную обязательно погоняю сегодня

bwn
Offline
Зарегистрирован: 25.08.2014

Полностью функцию поменять. Засунул датчик от ректификатора в морозилку, показывает все корректно. Функция на миллисе из 47 поста. (на три датчика)

Thorn
Offline
Зарегистрирован: 07.11.2014

Всё уже как раз дошёл до второй странички - вурнулся назад - счас в свой попробую вставить.

bwn
Offline
Зарегистрирован: 25.08.2014

Thorn пишет:

Всё уже как раз дошёл до второй странички - вурнулся назад - счас в свой попробую вставить.

Там то ли на второй то ли на третьей, как модифицировать на один датчик и как переменные объявлять.

Все, уехал.))))

Thorn
Offline
Зарегистрирован: 07.11.2014

Помойму разобрался, компилятор неругается. Завтра на работе (остался там cp2104) прошью esp и в при любом раскладе выложу кусочек с далласом и весь код для самого датчика мониторинга, классная штука может кому понравится и пригодится, на зиму такойже спаяю за небольшой доработкой курочкам (помимо измерений свет включать и ИК лампу на обогрев зимой).

sadman41
Offline
Зарегистрирован: 19.10.2016

Почему вы так DallasTemperature не любите? Там уже и минусы и корректировки и проверки. Да, код там блокирующий, но я понимаю, если бы делали какой-то самогонный агрегат, а не домашний термометр... На 9 бит переключите термометр и будет вам задержка в районе ~100мс.  Или DHT21 возьмите - точность будет не хуже (и явно лучше DHT11), но температура/влажность в одном корпусе и исполнение радует.

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

Почему вы так DallasTemperature не любите? Там уже и минусы и корректировки и проверки. Да, код там блокирующий, но я понимаю, если бы делали какой-то самогонный агрегат, а не домашний термометр... На 9 бит переключите термометр и будет вам задержка в районе ~100мс.  Или DHT21 возьмите - точность будет не хуже (и явно лучше DHT11), но температура/влажность в одном корпусе и исполнение радует.

Да честно говоря, 2К жалко не пойми на что выкидывать. Отрицательная температура корректно работает на OneWire. Не знаю откуда эта лажа про нее полезла. Проверки тоже в OneWire все есть, смысл в этой надстройке?

sadman41
Offline
Зарегистрирован: 19.10.2016

bwn пишет:

Да честно говоря, 2К жалко не пойми на что выкидывать. Отрицательная температура корректно работает на OneWire. Не знаю откуда эта лажа про нее полезла. Проверки тоже в OneWire все есть, смысл в этой надстройке?

Нет, я не против, когда человек прочитал даташит и правильно входящие данные с 1W обработал врукопашную.

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

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

Нет, я не против, когда человек прочитал даташит и правильно входящие данные с 1W обработал врукопашную.

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

Ну, ТС, он упорный. За полтора месяца сам написал акваконтроллер (ему год-полтора пророчили). С OneWire связался с моей подачи, каюсь. Не срослось у меня с DT, буквей в нем много, а аглицкого у меня мало, OneWire  оказалось проще, о чем не жалею.
У Вас скилл программирования на пару порядков выше моего, но здесь ведь форум не мэтров, а любителей. Как сказал один из бывавших здесь программистов: если программа делает то, что требуется и без косяков, то какая х... разница в каком стиле она написана?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

bwn пишет:

У Вас скилл программирования на пару порядков выше моего, но здесь ведь форум не мэтров, а любителей. Как сказал один из бывавших здесь программистов: если программа делает то, что требуется и без косяков, то какая х... разница в каком стиле она написана?

Думаю, это как раз был не программист, а любитель. Профессионал должен понимать, что токое поддержка программного продукта, и что значит придерживаться единого стиля в условиях текучести кадров и возможности переброски исполнителей с одного проекта н другой (не говоря даже о том, что разработкой обычно занимаются одни люди, а поддержкой - другие).

bwn
Offline
Зарегистрирован: 25.08.2014

andriano пишет:

bwn пишет:

У Вас скилл программирования на пару порядков выше моего, но здесь ведь форум не мэтров, а любителей. Как сказал один из бывавших здесь программистов: если программа делает то, что требуется и без косяков, то какая х... разница в каком стиле она написана?

Думаю, это как раз был не программист, а любитель. Профессионал должен понимать, что токое поддержка программного продукта, и что значит придерживаться единого стиля в условиях текучести кадров и возможности переброски исполнителей с одного проекта н другой (не говоря даже о том, что разработкой обычно занимаются одни люди, а поддержкой - другие).

Я снова упираю на слово любителей. И сказано было именно в этом контексте, когда кому то из великих программистов  захотелось поплювать в говнокод новичка. Там нет поддержки, нет кадров, а есть единственный исполнитель и конкретный проект , который либо работает, либо нет. И как подсказывает мой опыт (достаточный), ты либо достиг результата, либо нет. После его достижения, всем похрен как ты это сделал, как и похрен, почему ты это не сделал. Соответственно, конечен результат и оценка деятельности осуществляется именно по нему. ИМХО.

 

Thorn
Offline
Зарегистрирован: 07.11.2014

Итак господа чего вышло :)ВОт такой накопипастил кодик для получения температур и размещения их на web-страничке:

#include <OneWire.h>                  //Подключаем библиотеку для температурного датчика DS18B20
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

//=====Termo_Sensor ds18b20*
int tempPin=12;                      //Определяем порт шины OneWire (IC) для температурного датчика DS18B20, Gpio12
OneWire ds(tempPin);                 //Создаем объект для работы с термометром
byte data[12];
byte addr[8]={0x28,0xFF,0x00,0x79,0xC4,0x16,0x04,0x99};    //адрес датчика DS18B20_тестового 8266-12e
unsigned int raw;                   //Если экранированный кабель, можно подключать до 32 термо-датчиков DS18B20
unsigned long flagDallRead=0;
//float Temp[3];                      //Температура на уличке с точностью 0,06 градС
float Temp;                         //Температура на уличке с точностью 0,06 градС

//=====Wi-Fi setup*
const char* ssid="ИмяСети";
const char* password="паролик";

ESP8266WebServer server(80);

IPAddress device_ip   (10,32,10,35);                          //IP eso8266-12e test DeepNet
//IPAddress device_ip   (10,32,10,34);                          //IP eso8266-03m master DeepNet
IPAddress dns_ip      (8,8,8,8);
//IPAddress gateway_ip  (10,32,10,3);                           //DNS Sep
IPAddress gateway_ip  (10,32,10,1);                           //DNS DeepNet
IPAddress subnet_mask (255,255,255,0);
    
void setup() {
  Serial.begin(115200);                               //Serial монитор порта
  ds.write(0x7F);                                     //Разрядность 0,5гр=1F; 0,25гр=3F; 0,125гр=5F; 0,0625гр=7F
    delay(10);
  WiFi.mode(WIFI_AP_STA);                             //Создаём точечку доступа
  WiFi.begin(ssid, password);                         //Connect to WiFi network, имя сети и пароль применяем
  WiFi.config(device_ip, gateway_ip, subnet_mask);    //Setup WiFi network, присваиваем IP, маску и шлюз
//    Serial.print("\n\r \n\rWorking to connect");
      while (WiFi.status() != WL_CONNECTED){          //Wait for connection
    delay(10);}
//          Serial.print(".");}
  server.on ("/",HTTP);
  server.onNotFound (HTTP);
  server.begin();
}

//=========== Считывание и Обработка температур
void tempDallas(unsigned long interval){
  static unsigned long prevTime = 0;
  if (millis() - prevTime > interval) {                   //Проверка заданного интервала
  static boolean flagDall = 0;                            //Признак операции
  prevTime = millis();
  flagDall =! flagDall;                                   //Инверсия признака
  if (flagDall) {
    ds.reset();
    ds.write(0xCC);                                       //Обращение ко всем датчикам
    ds.write(0x44);                                       //Команда на конвертацию
    flagDallRead = 1;                                     //Время возврата в секундах
  }
  else {
    byte i;
     int temp;
//    for (i = 0; i < 3; i++){                            //Перебор количества датчиков
     ds.reset();
//     ds.select(addr[i]);
     ds.select(addr);
     ds.write(0xBE);                                      //Считывание значения с датчика
     temp = (ds.read() | ds.read()<<8);                   //Принимаем два байта температуры
//     Temp[i] = (float)temp / 16.0;
     Temp = (float)temp / 16.0;  
     flagDallRead = 2;                                    //Время возврата в секундах
  Serial.print("Temp: ");
  Serial.println(Temp); 
     }
   }
//  }
}

//=========== Оработчик главной страницы сервера
void HTTP() {
  String website="";
  website =
    "<html>\
  <head>\
    <meta charset=\"UTF8\" />\
      <meta http-equiv='refresh' content='7'/>\                     
        <title>WiFi_temp</title>\
    <style>\
      body {background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: blue;}\
    </style>\
  </head>\
  <body>\
    <h1 style=\"color: black;\">Градусник</h1>\
    <h3>Температура: \n";
    website += Temp;
    website += "°С";
    website += "\</h3>\n";
    website += "\
  </body>\
</html>";
  server.send (200,"text/html",website);
}

void loop() { 
  server.handleClient();
  tempDallas(flagDallRead*1000);                       //Далее к коде выводим данные из переменной Temp
}

Резистор smd - мелкий припаян прямо под корпусом далласа. Платку пока взял поболше и попроще с ней 8266-12е а мелкую 8266-03 как готовыйвариант пока нетрогаю, получится на большой в мелкую залью.

Вобщем невыходи у меня каменный цветок. Для начало огорчило что ни одно значение дискретности неменяет показаний, они все гда кратны 0,5град.

Потом положил в морозилочку макет и стал ждать, ждать долго непришлось :( показания при минусах равны показаниям на солнце. Видимо я всёравно чт ото делаю нетак. Скрины макетки и кринов прилагаю.

И да, ели подключиться к модулю 8266-12е напрямую по wifi (не к сети в которую он входит) получаеш IP-адрес вида 192.168.4.х однако это немешает нормально получать показания с его вебстранички ибо мы насильственно жестко указали ему и маску и шлюз и адрес.

скрин до морозилки :)

и после :(

Thorn
Offline
Зарегистрирован: 07.11.2014

Строка 30 в setup() походу неработает вообсче, тоесть счас залил это скетчик в дргую esp-шку и там где далласы прекрасно по умолчанию без танцев с разрядностью выдают 0,06  и там прекрасно скетчик от bwn работает. Мало того изменяя её (строку 30) - показания неменяются разрядность остается 0,06 и при   ds.write(0x1F); и при   ds.write(0x7F);

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Как минимум бкз ds.reset() нет никакого обмена на шине. Ваш байт уходит в никуда. По умолчанию, стоит 12 бит разрешение. Ну и минусы опять не обрабатываете и не значащие биты... Если принципиально не хотите брать библиотеку далласа и не хотите читать даташит, то хотя бы откройте библиотеку далласа и посмотрите как это делается.

bwn
Offline
Зарегистрирован: 25.08.2014

Thorn пишет:

Строка 30 в setup() походу неработает вообсче, тоесть счас залил это скетчик в дргую esp-шку и там где далласы прекрасно по умолчанию без танцев с разрядностью выдают 0,06  и там прекрасно скетчик от bwn работает. Мало того изменяя её (строку 30) - показания неменяются разрядность остается 0,06 и при   ds.write(0x1F); и при   ds.write(0x7F);

Она и не должна работать, там должна быть полная последовательность, посмотрите у Dimax в самом начале (4 пост). Раскомментировать, запустить и снова закомментить, не надо дырку в ROM протирать.
По отрицательным - ищите косяк на стороне приема-передачи. Сейчас запустил Ваш код:

#include <OneWire.h>                  //Подключаем библиотеку для температурного датчика DS18B20
//#include <ESP8266WiFi.h>
//#include <ESP8266WebServer.h>

//=====Termo_Sensor ds18b20*
int tempPin=12;                      //Определяем порт шины OneWire (IC) для температурного датчика DS18B20, Gpio12
OneWire ds(tempPin);                 //Создаем объект для работы с термометром
byte data[12];
//byte addr[8]={0x28,0xFF,0x00,0x79,0xC4,0x16,0x04,0x99};    //адрес датчика DS18B20_тестового 8266-12e
byte addr[8]={0x28,0xFF,0x13,0x56,0x3D,0x04,0x00,0x5E};
unsigned int raw;                   //Если экранированный кабель, можно подключать до 32 термо-датчиков DS18B20
unsigned long flagDallRead=0;
//float Temp[3];                      //Температура на уличке с точностью 0,06 градС
float Temp;                         //Температура на уличке с точностью 0,06 градС

//=====Wi-Fi setup*
//const char* ssid="ИмяСети";
//const char* password="паролик";

//ESP8266WebServer server(80);

//IPAddress device_ip   (10,32,10,35);                          //IP eso8266-12e test DeepNet
//IPAddress device_ip   (10,32,10,34);                          //IP eso8266-03m master DeepNet
//IPAddress dns_ip      (8,8,8,8);
//IPAddress gateway_ip  (10,32,10,3);                           //DNS Sep
//IPAddress gateway_ip  (10,32,10,1);                           //DNS DeepNet
//IPAddress subnet_mask (255,255,255,0);
    
void setup() {
  Serial.begin(115200);                               //Serial монитор порта
  //ds.write(0x7F);                                     //Разрядность 0,5гр=1F; 0,25гр=3F; 0,125гр=5F; 0,0625гр=7F
    //delay(10);
  //WiFi.mode(WIFI_AP_STA);                             //Создаём точечку доступа
  //WiFi.begin(ssid, password);                         //Connect to WiFi network, имя сети и пароль применяем
  //WiFi.config(device_ip, gateway_ip, subnet_mask);    //Setup WiFi network, присваиваем IP, маску и шлюз
//    Serial.print("\n\r \n\rWorking to connect");
     // while (WiFi.status() != WL_CONNECTED){          //Wait for connection
    //delay(10);}
//          Serial.print(".");}
  //server.on ("/",HTTP);
  //server.onNotFound (HTTP);
  //server.begin();
}

//=========== Считывание и Обработка температур
void tempDallas(unsigned long interval){
  static unsigned long prevTime = 0;
  if (millis() - prevTime > interval) {                   //Проверка заданного интервала
  static boolean flagDall = 0;                            //Признак операции
  prevTime = millis();
  flagDall =! flagDall;                                   //Инверсия признака
  if (flagDall) {
    ds.reset();
    ds.write(0xCC);                                       //Обращение ко всем датчикам
    ds.write(0x44);                                       //Команда на конвертацию
    flagDallRead = 1;                                     //Время возврата в секундах
  }
  else {
 //   byte i;
     int temp;
//    for (i = 0; i < 3; i++){                            //Перебор количества датчиков
     ds.reset();
//     ds.select(addr[i]);
     ds.select(addr);
     ds.write(0xBE);                                      //Считывание значения с датчика
     temp = (ds.read() | ds.read()<<8);                   //Принимаем два байта температуры
//     Temp[i] = (float)temp / 16.0;
     Temp = (float)temp / 16.0;  
     flagDallRead = 2;                                    //Время возврата в секундах
  Serial.print("Temp: ");
  Serial.println(Temp); 
     }
   }
//  }
}

/*
//=========== Оработчик главной страницы сервера
void HTTP() {
  String website="";
  website =
    "<html>\
  <head>\
    <meta charset=\"UTF8\" />\
      <meta http-equiv='refresh' content='7'/>\                     
        <title>WiFi_temp</title>\
    <style>\
      body {background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: blue;}\
    </style>\
  </head>\
  <body>\
    <h1 style=\"color: black;\">Градусник</h1>\
    <h3>Температура: \n";
    website += Temp;
    website += "°С";
    website += "\</h3>\n";
    website += "\
  </body>\
</html>";
  server.send (200,"text/html",website);
}
*/

void loop() { 
  //server.handleClient();
  tempDallas(flagDallRead*1000);                       //Далее к коде выводим данные из переменной Temp
}

Скрин из морозилки:

Thorn
Offline
Зарегистрирован: 07.11.2014

с разрядностью - отложу пока, потом докурю. С выводом - приёмом. Снова зашил в 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 проделать подобное.

bwn
Offline
Зарегистрирован: 25.08.2014

Чет мне подсказывает, что он float не понимает. Такой игрушки не было, здесь, пас. 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

в некотором роде спасало то, что использовали int который в ардуино -32...+32 поэтому разряды знака худо бедно отрабатывались и в морозилке работало. А как это все компилируется под ноде надо смотреть. Там может и тип инт от 0 до 65. Поэтому если в даташите сказано два байта, то их и надо рассматривать как два байта. 0 и 1 они везде 0 и 1 и при правильном переводе код будет работать везде. Все остальное это костыли чтобы доковылять от одного проекта к другому и снова начать наступать на теже грабли.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

И еще раньше было две версии прошивки ноде под инт и флот. Давно с ними не работал поэтому не знаю может сейчас уже одна универсальная прошивка если нет, то надо прошиваться флоат прошивкой.

bwn
Offline
Зарегистрирован: 25.08.2014

Penni пишет:

в некотором роде спасало то, что использовали int который в ардуино -32...+32 поэтому разряды знака худо бедно отрабатывались и в морозилке работало. А как это все компилируется под ноде надо смотреть. Там может и тип инт от 0 до 65. Поэтому если в даташите сказано два байта, то их и надо рассматривать как два байта. 0 и 1 они везде 0 и 1 и при правильном переводе код будет работать везде. Все остальное это костыли чтобы доковылять от одного проекта к другому и снова начать наступать на теже грабли.

Так напишите кодом, как. Я в этой математике лапоть, вряд ли умное предложу.

Thorn
Offline
Зарегистрирован: 07.11.2014

bwn пишет:

Чет мне подсказывает, что он float не понимает. Такой игрушки не было, здесь, пас. 

Нене, погодите чуточку. Вы меня снова натолкнули на мысль. Счас быстренько всёже решил попробовать с остандартным примером библиотеки #include <DallasTemperature.h>

#include <OneWire.h>                  //Подключаем библиотеку для температурного датчика DS18B20
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DallasTemperature.h>

//=====Termo_Sensor ds18b20*
int tempPin=12;                      //Определяем порт шины OneWire (IC) для температурного датчика DS18B20, Gpio12
OneWire ds(tempPin);                 //Создаем объект для работы с термометром
byte Temp;

DallasTemperature sensors(&ds);

    
void setup() {
  Serial.begin(115200);                               //Serial монитор порта
  sensors.begin();
}

void tempDallasliba(){
  unsigned long prevTime=0;
  Temp = sensors.getTempCByIndex(0); 
    if (millis() - prevTime > 1000) {                   //Проверка заданного интервала
  prevTime = millis();
  sensors.requestTemperatures();
  Serial.print("Temp: ");
  Serial.println(Temp); 
  }
}

void loop() { 
  tempDallasliba();
}

В итоге как и ожидал температура стала целочисленной, ну да для примера сойдёт а вот с минусами стало иначе, также заморозил потом добежал до 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
Может мы уже гдето на грани истины?

Thorn
Offline
Зарегистрирован: 07.11.2014

Penni пишет:

И еще раньше было две версии прошивки ноде под инт и флот. Давно с ними не работал поэтому не знаю может сейчас уже одна универсальная прошивка если нет, то надо прошиваться флоат прошивкой.

И тут я кстаи начинаю вспоминать, пробовал я БЕЗ библиотек далласа измерять температуру и выводить на дисплей ili9363c, так вот толкьо в setupe стоило запустить tft.begin(); - то всё туши свет, температура 255 и никуда далее. Так и бросил эту затею стал меню делать в web - чтобы хоть както настроить терморегулятор или релюшку. И это именно на 8266 было, теже скетчики на любой ардуинке как часики. На сообществе 8266 вяло отреагировали на мою беду - там народ более возвышенный, беспроводной 6)

bwn
Offline
Зарегистрирован: 25.08.2014

Thorn пишет:

Нене, погодите чуточку. Вы меня снова натолкнули на мысль. Счас быстренько всёже решил попробовать с остандартным примером библиотеки #include <DallasTemperature.h>

#include <OneWire.h>                  //Подключаем библиотеку для температурного датчика DS18B20
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DallasTemperature.h>

//=====Termo_Sensor ds18b20*
int tempPin=12;                      //Определяем порт шины OneWire (IC) для температурного датчика DS18B20, Gpio12
OneWire ds(tempPin);                 //Создаем объект для работы с термометром
byte Temp;

DallasTemperature sensors(&ds);

    
void setup() {
  Serial.begin(115200);                               //Serial монитор порта
  sensors.begin();
}

void tempDallasliba(){
  unsigned long prevTime=0;
  Temp = sensors.getTempCByIndex(0); 
    if (millis() - prevTime > 1000) {                   //Проверка заданного интервала
  prevTime = millis();
  sensors.requestTemperatures();
  Serial.print("Temp: ");
  Serial.println(Temp); 
  }
}

void loop() { 
  tempDallasliba();
}

В итоге как и ожидал температура стала целочисленной, ну да для примера сойдёт а вот с минусами стало иначе, также заморозил потом добежал до 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 напишет как это сделать правильно, то и функцию подредактируем.

temp = (ds.read() | ds.read()<<8); //Принимаем два байта температуры
Temp = (float)temp / 16.0;

Фактически надо преобразовать вторую строку с верным алгоритмом.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Я ж там выше писал, примерно вот так для 12 бит

unsigned int from18B20 = 0xFC90;
float temp;
if(bitRead(from18B20, 15))
{
  from18B20 = ~from18B20+1;
  temp = from18B20*-0.0625;
}
else
{
  temp = from18B20*0.0625;
};
Serial.println(temp);

 

Thorn
Offline
Зарегистрирован: 07.11.2014

Господа всёже с либрари далласа завелось на nodeMCU - в последнем коде ошибку допустил :( в строке 09 и 21 соответственно. Минусы показывает. Как говорится "..ложечка нашлась но осадочек остался...." Теперь бы без даллас-библиотек

Thorn
Offline
Зарегистрирован: 07.11.2014

Penni пишет:

Я ж там выше писал, примерно вот так для 12 бит

unsigned int from18B20 = 0xFC90;

Вот чего получилось:

#include <OneWire.h>                  //Подключаем библиотеку для температурного датчика DS18B20
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

//=====Termo_Sensor ds18b20*
int tempPin=12;                      //Определяем порт шины OneWire (IC) для температурного датчика DS18B20, Gpio12
OneWire ds(tempPin);                 //Создаем объект для работы с термометром
byte data[12];
byte addr[8]={0x28,0xFF,0x00,0x79,0xC4,0x16,0x04,0x99};    //адрес датчика DS18B20_тестового 8266-12e
unsigned int raw;                   //Если экранированный кабель, можно подключать до 32 термо-датчиков DS18B20
unsigned long flagDallRead=0;

void setup(){
  Serial.begin(115200);
  razrDall(0x60); //Здесь требуемая разрядность
}

//=========== Считывание и Обработка температур
void tempDallas(unsigned long interval){
  static unsigned long prevTime = 0;
  if (millis() - prevTime > interval) {                   //Проверка заданного интервала
  static boolean flagDall = 0;                            //Признак операции
  prevTime = millis();
  flagDall =! flagDall;                                   //Инверсия признака
  if (flagDall) {
    ds.reset();
    ds.write(0xCC);                                       //Обращение ко всем датчикам
    ds.write(0x44);                                       //Команда на конвертацию
    flagDallRead = 1;                                     //Время возврата в секундах
      }else{
//   byte i;
//     int temp;
     ds.reset();
     ds.select(addr);
     ds.write(0xBE);                                      //Считывание значения с датчика
//     temp = (ds.read() | ds.read()<<8);                 //Принимаем два байта температуры
//     Temp = (float)temp / 16.0;  
  unsigned int from18B20 = 0xFC90;
  float temp;
  if(bitRead(from18B20, 15)){
    from18B20 = ~from18B20+1;
    temp = from18B20*-0.0625;
      }else{
  temp = from18B20*0.0625;};
    flagDallRead=2;                                       //Время возврата в секундах
  Serial.print("Temp: ");
  Serial.println(temp); 
     }
   }
}

//===========Функция изменения разрядности Даллас
void razrDall(byte raz) {
 ds.reset();                                         //Cброс шины
 ds.select(addr);                                    //выставить адрес
 ds.write(0x4E);                                     //разрешение записать конфиг
 ds.write(0x7F);                                     //Th контроль температуры макс 128грд
 ds.write(0xFF);                                     //Tl контроль температуры мин -128грд
 ds.write(0x60);                                     //0x60 12-бит разрешение, 0x00 -9бит разрешение
}

void loop() { 
  tempDallas(flagDallRead*1000);                       //Далее к коде выводим данные из переменной Temp
}

в serial льётся нечто

Temp: -268431408.00
Temp: -268431408.00
Temp: -268431408.00
Temp: -268431408.00
Temp: -268431408.00

 

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

Thorn, зачем вы перекладываете из одной переменной в другую по нескольку раз? Одна путаница. Всё делается одной строчкой.

float celsius =  (ds.read() | (ds.read()<<8))/16.0;

и всё, этот вариант 100% даст отрицательные температуры.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

У Вас нодемку прошита прошивкой int а не float. Либо перепрошить на флот либо вручную его сделать для отображения

Thorn
Offline
Зарегистрирован: 07.11.2014

dimax пишет:

Thorn, зачем вы перекладываете из одной переменной в другую по нескольку раз? Одна путаница. Всё делается одной строчкой.

float celsius =  (ds.read() | (ds.read()<<8))/16.0;

и всё, этот вариант 100% даст отрицательные температуры.

Попробовал и вашу строчку:

void tempDallas(unsigned long interval){
  static unsigned long prevTime = 0;
  if (millis() - prevTime > interval) {                   //Проверка заданного интервала
  static boolean flagDall = 0;                            //Признак операции
  prevTime = millis();
  flagDall =! flagDall;                                   //Инверсия признака
  if (flagDall) {
    ds.reset();
    ds.write(0xCC);                                       //Обращение ко всем датчикам
    ds.write(0x44);                                       //Команда на конвертацию
    flagDallRead = 1;                                     //Время возврата в секундах
      }else{
   byte i;
//     int temp;
//    for (i = 0; i < 3; i++){                            //Перебор количества датчиков
     ds.reset();
//     ds.select(addr[i]);
     ds.select(addr);
     ds.write(0xBE);                                      //Считывание значения с датчика
//     temp = (ds.read() | ds.read()<<8);                 //Принимаем два байта температуры
//     Temp[i] = (float)temp / 16.0;
//     Temp = (float)temp / 16.0;  
float celsius =  (ds.read() | (ds.read()<<8))/16.0;
//  unsigned int from18B20 = 0xFC90;
//  float temp;
//  if(bitRead(from18B20, 15)){
//    from18B20 = ~from18B20+1;
//    temp = from18B20*-0.0625;
//      }else{
//  temp = from18B20*0.0625;};
    flagDallRead=2;                                       //Время возврата в секундах
  Serial.print("Temp: ");
  Serial.println(celsius); 
     }
   }
}

всё одно четырёхтысячные значения при минусах. Прав видимо ув. Penni дело было не в бобине, сам модуль таков, буду искать "прошивку" на него пока но самое главное нужно будет на 8266-03 найти она су...ко мелкая такая но удобная этим. Вобщем пока неполучистя на большой на мелкой нет смысла ничего дергать :(

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Да можно самому сделать на инт прошивке если у вас там тоьлко один датчик например. Если 0,0625 умножить на 10000 потом ваше значение умножить на 625 получится целое число, а потом уже запятую при выводе воткнуть и все.

Thorn
Offline
Зарегистрирован: 07.11.2014

Вобщем быстренько зашёл сюда http://nodemcu-build.com/faq.php#supportи сюда https://github.com/nodemcu/nodemcu-firmware/releases

Скачалось, прошил ESPEasy_v2.0.0-dev11 тузлочкой.

Указал именно float (не integer) - далее скетчик а по итогу всё как и было. Как то всё раком с этой 8266 у меня с с амого начала

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

Thorn, может у вас ds18S20 ?

sadman41
Offline
Зарегистрирован: 19.10.2016

dimax пишет:

Thorn, может у вас ds18S20 ?

У S20 нулевой байт 0x10, а ТС пишет, что 0x28. Так что B20. 

С далласом у него все работает, но он продолжает есть кактус :(

bwn
Offline
Зарегистрирован: 25.08.2014

Thorn, тут варианта два, либо ставьте DT и с ней работайте (если действительно все корректно), либо потрошите ее и смотрите как там сделано преобразование, дальше по образу и подобию. ИМХО.

Thorn
Offline
Зарегистрирован: 07.11.2014

dimax пишет:

Thorn, может у вас ds18S20 ?

точно B20 - про S20 читал давно както при покупке ориентировался на B, вот от на node распаян

Thorn
Offline
Зарегистрирован: 07.11.2014

sadman41 пишет:

У 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)

 

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

Thorn, а просто отрицательные числа, пробовали вывести?

float a= -5.25 ;

Serial.println(a);

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

unsigned temp = (ds.read() | (ds.read()<<8));

Если вот это (без 16) вывести в порт в HEX. Просто любопытно посмотреть что там все же идет без всяких преобразований.

Thorn
Offline
Зарегистрирован: 07.11.2014

dimax пишет:

Thorn, а просто отрицательные числа, пробовали вывести?

float a= -5.25 ;

Serial.println(a);

В глобальных объявил: float a= -5.25 ;

В  функции вывел: Serial.println(a); (в конце вывода температуры, в рабочем коде)

В serial все отличненько выводится и с минусом даже :) Значит float плонимает отрицательный?

Thorn
Offline
Зарегистрирован: 07.11.2014

Penni пишет:

unsigned temp = (ds.read() | (ds.read()<<8));

Если вот это (без 16) вывести в порт в HEX. Просто любопытно посмотреть что там все же идет без всяких преобразований.

Угу, при варианте когда плюсовая температура:

//=========== Считывание и Обработка температур
void tempDallas(unsigned long interval){
  static unsigned long prevTime = 0;
  if (millis() - prevTime > interval) {                   //Проверка заданного интервала
  static boolean flagDall = 0;                            //Признак операции
  prevTime = millis();
  flagDall =! flagDall;                                   //Инверсия признака
  if (flagDall) {
    ds.reset();
    ds.write(0xCC);                                       //Обращение ко всем датчикам
    ds.write(0x44);                                       //Команда на конвертацию
    flagDallRead = 1;                                     //Время возврата в секундах
      }else{
     ds.reset();
     ds.select(addr);
     ds.write(0xBE);                                      //Считывание значения с датчика
float celsius =  (ds.read() | (ds.read()<<8));
Temp = (float) celsius; 
    flagDallRead=2;                                       //Время возврата в секундах
  Serial.print("Temp: ");
  Serial.println(Temp);
    Serial.println(a);
     }
   }
}

Serial:

Temp: 496.00
-5.25
Temp: 496.00
-5.25
Temp: 496.00
-5.25
Temp: 496.00

(-5.25 несмотрите это переменная\постоянная флоат :)

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

А вот так что выдаст в сериал и если есть возможность попробовать при небольшом минусе.

//=========== Считывание и Обработка температур
void tempDallas(unsigned long interval){
  static unsigned long prevTime = 0;
  if (millis() - prevTime > interval) {                   //Проверка заданного интервала
  static boolean flagDall = 0;                            //Признак операции
  prevTime = millis();
  flagDall =! flagDall;                                   //Инверсия признака
  if (flagDall) {
    ds.reset();
    ds.write(0xCC);                                       //Обращение ко всем датчикам
    ds.write(0x44);                                       //Команда на конвертацию
    flagDallRead = 1;                                     //Время возврата в секундах
      }else{
     ds.reset();
     ds.select(addr);
     ds.write(0xBE);                                      //Считывание значения с датчика
//float celsius =  (ds.read() | (ds.read()<<8));
unsigned int celsius =  (ds.read() | (ds.read()<<8));
//Temp = (float) celsius; 
    flagDallRead=2;                                       //Время возврата в секундах
  Serial.print("Temp: ");
  //Serial.println(Temp);
    Serial.println(celsius, HEX);
    Serial.println(a);
     }
   }
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Как ни интересно смотреть этот сериал, но нужно завязывать. ;)

В ЕСП int 32-х разрядный. Используйте везде для температуры short или int16_t, это синонимы.  Тогда минус будет минусом, а не 4096. ;)

Код, который работает верно на ардуиноне работает на esp8266, без понимания деталей.

Пока я добрый и трезвый поясню: в некотором смысле знак "-" это 1 в старшем разряде. Вы прочли 2 байта из датчика и сфомировали число:

temp = data0 | (data1 << 8), так? В ардуинке этого достаточно, так как вы в старший разпяд temp записали старший разряд из  data1. А в esp8266 это уже не старший разряд целого, поскольку целое там имеет 32 разряда. temp в esp должна иметь тип short, он - 16 разрядный и все будет нормально.

Thorn
Offline
Зарегистрирован: 07.11.2014

wdrakula пишет:

Как ни интересно смотреть этот сериал, но нужно завязывать. ;)

temp = data0 | (data1 << 8), так? В ардуинке этого достаточно, так как вы в старший разпяд temp записали старший разряд из  data1. А в esp8266 это уже не старший разряд целого, поскольку целое там имеет 32 разряда. temp в esp должна иметь тип short, он - 16 разрядный и все будет нормально.

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

А далее попробовал такобъявить переменную temp, была float а стала short.

//=========== Считывание и Обработка температур
void tempDallas(unsigned long interval){
  static unsigned long prevTime = 0;
  if (millis() - prevTime > interval) {                   //Проверка заданного интервала
  static boolean flagDall = 0;                            //Признак операции
  prevTime = millis();
  flagDall =! flagDall;                                   //Инверсия признака
  if (flagDall) {
    ds.reset();
    ds.write(0xCC);                                       //Обращение ко всем датчикам
    ds.write(0x44);                                       //Команда на конвертацию
    flagDallRead = 1;                                     //Время возврата в секундах
      }else{
//   byte i;
//     int temp;
//    for (i = 0; i < 3; i++){                            //Перебор количества датчиков
     ds.reset();
//     ds.select(addr[i]);
     ds.select(addr);
     ds.write(0xBE);                                      //Считывание значения с датчика
//     temp = (ds.read() | ds.read()<<8);                 //Принимаем два байта температуры
//     Temp[i] = (float)temp / 16.0;
//     Temp = (float)temp / 16.0;  
    short celsius =  (ds.read() | (ds.read()<<8))/16.0;
    Temp = (short) celsius; 
//unsigned int from18B20 = 0xFC90;
//  short temp;
//  if(bitRead(from18B20, 15)){
//    from18B20 = ~from18B20+1;
//    temp = from18B20*-0.0625;
//      }else{
//  temp = from18B20*0.0625;};
    flagDallRead=2;                                       //Время возврата в секундах
  Serial.print("Temp: ");
//  Serial.println(celsius); 
  Serial.println(Temp);
     }
   }
//  }
}

Плюсовые показывает тольк оцелую часть без запятой :) а минус остался как и был тоже бездробной части 4095.... Или снова нето сделал? Посмотрим есчо чутку сериал :)

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Проверьте через sizeof размер типов данных для ESP а то так гадать только сидеть.

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

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
Offline
Зарегистрирован: 07.11.2014

dimax пишет:

Thorn, не получилось потому, что внутри  (ds.read() | (ds.read()<<8))/16.0;  все вычисления происходят в 32-битной переменной. ....

Попробовал так:

//=========== Считывание и Обработка температур
void tempDallas(unsigned long interval){
  static unsigned long prevTime = 0;
  if (millis() - prevTime > interval) {                   //Проверка заданного интервала
  static boolean flagDall = 0;                            //Признак операции
  prevTime = millis();
  flagDall =! flagDall;                                   //Инверсия признака
  if (flagDall) {
    ds.reset();
    ds.write(0xCC);                                       //Обращение ко всем датчикам
    ds.write(0x44);                                       //Команда на конвертацию
    flagDallRead = 1;                                     //Время возврата в секундах
      }else{
//   byte i;
//     int temp;
//    for (i = 0; i < 3; i++){                            //Перебор количества датчиков
     ds.reset();
//     ds.select(addr[i]);
     ds.select(addr);
     ds.write(0xBE);                                      //Считывание значения с датчика
//     temp = (ds.read() | ds.read()<<8);                 //Принимаем два байта температуры
//     Temp[i] = (float)temp / 16.0;
//     Temp = (float)temp / 16.0;  
    float celsius =  (ds.read() | (ds.read()<<8))/16.0;
    float temp =  ((ds.read()<<16 | (ds.read()<<24))>>16) / 16.0 ;
    Temp = (float) celsius; 
    temp = (float) temp; 
//unsigned int from18B20 = 0xFC90;
//  short temp;
//  if(bitRead(from18B20, 15)){
//    from18B20 = ~from18B20+1;
//    temp = from18B20*-0.0625;
//      }else{
//  temp = from18B20*0.0625;};
    flagDallRead=2;                                       //Время возврата в секундах
  Serial.print("temp: ");
  Serial.println(temp);
    Serial.print("****");
  Serial.print("Temp: ");
  Serial.println(Temp);
    Serial.print("****");
     }
   }
//  }
}

В 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