подсобите пожалуйста с Dallas-ом DS18B20

SeaWanderer
Offline
Зарегистрирован: 05.04.2016
Господа ардуинщики, ай нид хэлп. 
Реализую для души симпатичный проект часы+температура: ОLED дисплейчик, RTC и Dallas DS18B20. Задумал плату под это дело, нарисовал уже. Корпус будет тоже хендмейд. Сделаю, если кого заинтересует, выложу результат.  Сам проект с гиктаймса, наверняка многим известный:https://geektimes.ru/post/255556/. 
Казалось бы, что может быть проще. Аффтар оставил архив с софтом, вся мат часть закуплена на ебэе. Повозился с удовольствием, всё работает. НО. 
Dallas DS18B20 отказывался показывать температуру.На экране последовательно в случайном порядке появлялись цифры 1,3, 4. И всё. Сразу скажу, что с датчиком всё ОК - скетчи-примеры из библиотек на UNO (сам
проект на NANO) он прекрасно отрабатывал.  Кусок скетча в части Dallas-а:
 
void temp() {  
  for(int x = 0; x < 10; x++){
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(350);
  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;
 
 Я, не понимая смысла, но чувствуя подвох, изменил скетч так:
 
 Temp = Temp >> 1; то есть вместо 4 поставил единицу.
 
После чего температура стала отображаться ПРЕКРАСНО, в единицах градусов (без долей) , но, ссабакка, только от 0 и выше. Минусовую не показывает. Читал даташит, пробовал самостоятельно разобраться с регистрами,вычислениями разницы после пересечения нуля, - не получается.Лазил вокруг самой темы по инету, - тоже не нашёл ответа. Дебил, наверное.
Может кто видел или сам  подскажет кусок кода, что добавить , чтобы даллас показывал и минус и температуру в ед. градусов при её отрицат.значениях ?
 
 
Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

SeaWanderer пишет:

Господа ардуинщики, ай нид хэлп. 
Реализую для души симпатичный проект часы+температура: ОLED дисплейчик, RTC и Dallas DS18B20. Задумал плату под это дело, нарисовал уже. Корпус будет тоже хендмейд. Сделаю, если кого заинтересует, выложу результат.  Сам проект с гиктаймса, наверняка многим известный:https://geektimes.ru/post/255556/. 
Казалось бы, что может быть проще. Аффтар оставил архив с софтом, вся мат часть закуплена на ебэе. Повозился с удовольствием, всё работает. НО. 
Dallas DS18B20 отказывался показывать температуру.На экране последовательно в случайном порядке появлялись цифры 1,3, 4. И всё. Сразу скажу, что с датчиком всё ОК - скетчи-примеры из библиотек на UNO (сам
проект на NANO) он прекрасно отрабатывал.  Кусок скетча в части Dallas-а:
 
void temp() {  
  for(int x = 0; x < 10; x++){
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(350);
  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;
 
 Я, не понимая смысла, но чувствуя подвох, изменил скетч так:
 
 Temp = Temp >> 1; то есть вместо 4 поставил единицу.
 
После чего температура стала отображаться ПРЕКРАСНО, в единицах градусов (без долей) , но, ссабакка, только от 0 и выше. Минусовую не показывает. Читал даташит, пробовал самостоятельно разобраться с регистрами,вычислениями разницы после пересечения нуля, - не получается.Лазил вокруг самой темы по инету, - тоже не нашёл ответа. Дебил, наверное.
Может кто видел или сам  подскажет кусок кода, что добавить , чтобы даллас показывал и минус и температуру в ед. градусов при её отрицат.значениях ?
 
Читайте мануал по датчику.
 
 
Уж не знаю, что у вас там за скетч получился. но в исходном скетче команда
Temp = Temp >> 4;

как раз и отвечает за обрезание долей градуса. 

так что с долями градуса нужен:

float x= Temp / 16.0; 

У вас чего датчик в морозилке показывает? Видима какую то жуткую жару или мороз. ))

Мой вариант на скорую руку:

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

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
Serial.print("T=");
Serial.println(temp());
delay(1000);
}

float temp() {  
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(150);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  float x=Temp/16.0; 
  return x;
  }

 

 

SeaWanderer
Offline
Зарегистрирован: 05.04.2016

Спасибо. Не работает.

контрольный скетч-пример:
 
ROM = 10 D5 5E 36 2 8 0 9B
  Chip = DS18S20
  Data = 1 37 0 4B 46 FF FF 2 10 E1  CRC=E1
  Temperature = 27.62 Celsius, 81.72 Fahrenheit
No more addresses.
 
ROM = 10 D5 5E 36 2 8 0 9B
  Chip = DS18S20
  Data = 1 37 0 4B 46 FF FF 2 10 E1  CRC=E1
  Temperature = 27.62 Celsius, 81.72 Fahrenheit
No more addresses.
 
Ваш скетч:
 
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=3.38
T=
 добавил в ваш скетч : Temp = Temp >> 1;
T=1.63
T=1.63
T=1.63
T=1.63
T=1.63
T=1.63
 

 

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

SeaWanderer, Интересно, сколько вам нужно ещё сделать экспериментов, что бы заметить что у вас датчик DS18S20, а примеры вы неизмено пробуете от DS18B20 ? :)

SeaWanderer
Offline
Зарегистрирован: 05.04.2016

Точно, идрит-пергидрит. А я смотрю в примерах вообще пишут DS18х20, ну и думаю, что разница непринципиальна. А сейчас увидел, что hex таблицы у них разные..

SeaWanderer
Offline
Зарегистрирован: 05.04.2016

Так, прикольненько. Из-за внимательного dimax в скетче Vad33 теперь если поделить флоат на 2, а не на 16, получим вполне себе температуру вместо абракадабры: 

T=28.00

T=28.00

T=28.00
T=28.00
T=27.50
T=27.50
T=27.50
T=27.50

T=27.50 

SeaWanderer
Offline
Зарегистрирован: 05.04.2016

Воистину одна голова -хорошо, а полторы- лучше :). Головам спасибо. Теперь всё-таки хочется по минусу понять, как сделать.

Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

SeaWanderer пишет:

Воистину одна голова -хорошо, а полторы- лучше :). Головам спасибо. Теперь всё-таки хочется по минусу понять, как сделать.

Дык, в морозилку то пробовали или нет? Усе должно работать. ))

У меня сейчас нет ни датчика ни морозилки, но в теории все работает.

В примере подменяю реальные данные, данными как должно быть из таблицы:

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

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
Serial.print("T= ");
Serial.println(temp());
delay(1000);
}

float temp() {  
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(150);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
 // data[0] = ds.read();
 // data[1] = ds.read();
  data[0] = 0xff;          // Подменяем 
  data[1] = 0xff;          // то что нужно 
  int Temp = (data[1] << 8) + data[0];
  float x=Temp/2.0; 
  return x;
  }
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
 
SeaWanderer
Offline
Зарегистрирован: 05.04.2016
Нет, ребята, всё профанация. Засунув датчик между кроликом и уткой, работы его в минусе я не увидел. Причем контрольный скетч из примера отрицательной температуры тоже не отработал:
 
 
ROM = 10 E7 7A 37 2 8 0 70
  Chip = DS18S20
  Data = 1 2 0 4B 46 FF FF 9 10 68  CRC=68
  Temperature = 1.19 Celsius, 34.14 Fahrenheit
No more addresses.
 
ROM = 10 E7 7A 37 2 8 0 70
  Chip = DS18S20
  Data = 1 2 0 4B 46 FF FF 10 10 36  CRC=36
  Temperature = 0.75 Celsius, 33.35 Fahrenheit
No more addresses.
 
ROM = 10 E7 7A 37 2 8 0 70
  Chip = DS18S20
  Data = 1 1 0 4B 46 FF FF 7 10 71  CRC=71
  Temperature = 0.31 Celsius, 32.56 Fahrenheit
No more addresses.
 
ROM = 10 E7 7A 37 2 8 0 70
  Chip = DS18S20
  Data = 1 FF FF FF FF FF FF FF FF FF  CRC=C9
  Temperature = -0.50 Celsius, 31.10 Fahrenheit
No more addresses.
 
No more addresses.
 
No more addresses.
 
No more addresses.
 
No more addresses.
 
 
 
 
Вот скетч Vad33:  датчик между уткой и кроликом (поменял местами их в морозилке, может в них дело...):
 
T= 18.50
T= 18.00
T= 17.50
T= 16.50
T= 16.00
T= 15.50
T= 15.00
T= 14.50
T= 14.00
T= 13.50
T= 13.00
T= 12.50
T= -4084.00
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
SeaWanderer
Offline
Зарегистрирован: 05.04.2016

В скетче нужна отдельная формула пересчёта данных из байта температуы при обнаружении бита минуса. Где-то видел в инете, но вот по-моему, не для DS18S20.

Утку уже съели, кролик осталссо...

anatoliyrnd
Offline
Зарегистрирован: 17.03.2016
 
if (Temp>4040) 
{
Temp=Temp-4095; 
//здесь выводим знак минус
};

ну и далее выводим Temp как обычно

примерно так.

 

SeaWanderer
Offline
Зарегистрирован: 05.04.2016
Вот оно! Спасибо, Анатолий! Начало получаться (после -8 ушёл в аут опять датчик), буду допиливать дальше.
T= 5.00
T= 4.50
T= 4.00
T= 4.00
T= 3.50
T= 3.00
T= 3.00
T= 2.50
T= 2.50
T= 2.00
T= 2.00
T= 1.50
T= 1.00
T= 1.00
T= 0.50
T= 0.50
T= 0.00
T= 0.00
T= -0.50
T= -0.50
T= -1.00
T= -1.00
T= -1.50
T= -1.50
T= -2.00
T= -2.00
T= -2.50
T= -2.50
T= -3.00
T= -3.00
T= -3.50
T= -3.50
T= -3.50
T= -4.00
T= -4.00
T= -4.50
T= -4.50
T= -5.00
T= -5.00
T= -5.00
T= -5.50
T= -5.50
T= -6.00
T= -6.00
T= -6.00
T= -6.50
T= -6.50
T= -6.50
T= -7.00
T= -7.00
T= -7.00
T= -7.50
T= -7.50
T= -7.50
T= -7.50
T= -8.00
T= -8.00
T= -8.00
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
T= -0.50
А как от долей избавиться?, нужны целые значения. Temp = Temp >> 1; не помогает. Может флоат не нужен нафик?
Спасибо ещё раз.
Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

SeaWanderer пишет:

А как от долей избавиться?, нужны целые значения. Temp = Temp >> 1; не помогает. Может флоат не нужен нафик?
Спасибо ещё раз.

Вообще по мануалу нужно читать 9 байт и их анализировать. мы читаем только 2.

Чтобы избавится от долей нужно при выводе перевести данные в целое, функцией int( <число> ),

как вариант. 

Serial.println(int(temp()));

Такое впечатление, что после -8 градусов датчик отрубается и начинает выдавать FF FF

Может он на морозе тупить начинает и нужно задержку для расчета увеличивать раза в 3-5 ?! ))

...
  ds.write(0x44);
  delay(750);  // <-- ЗДЕСЬ
  ds.reset();
...

Вот еще есть похожий скрипт:

#include <OneWire.h>
//  получаем  температуру от  DS18S20
 
OneWire  ds(4);   // линия  1-Wire будет на  pin 4
 
 void setup(void)
 {
  Serial. begin(9600);
}
 
void  loop(void)
{
  byte i;
   byte present = 0;
   byte data[12];
   byte addr[8];
   
   if ( !ds.search(addr)) {
       //Serial. print("No more  addresses.\n");
      ds.reset_search();
       return;
  }
   
   /*Serial.print("R=");
  for(  i =  0; i < 8; i++) {
    Serial.print(addr[i], HEX);
    Serial.print(" ");
  }*/
 
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n");
      return;
  }
   
  if ( addr[0] != 0x10) {
      Serial.print("Device is not a DS18S20 family device.\n");
      return;
  }
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // запускаем конвертацию
  delay(1000);             // скорее всего достаточно 750ms
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // считываем ОЗУ датчика
 
  /*Serial.print("P=");
  Serial.print(present,HEX);
  Serial.print(" ");*/
  for ( i = 0; i < 9; i++) {           // обрабатываем 9 байт
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  /*Serial.print(" CRC=");
  Serial.print( OneWire::crc8( data, 8), HEX);
  Serial.println();*/
   
  // высчитываем температуру :)
  int HighByte, LowByte, TReading, Tc_100;
  LowByte = data[0];
  Serial.print("LB= ");Serial.print(LowByte,HEX);
  HighByte = data[1];
  Serial.print(" HB= ");Serial.print(HighByte,HEX);
  TReading = (HighByte << 8) + LowByte;
  Tc_100 = TReading/2;
  Serial.print(" T = ");Serial.print(Tc_100);
  Serial.println();
}

 

anatoliyrnd
Offline
Зарегистрирован: 17.03.2016

Задержка впринципе нужна при паразитном питании, при обчном питании датчик будет отдавать показания предидущего преобразования, до тех пор пока не перепишет в регистр показания нового преобразования.  При этом есди датчик сконфигурировать на точность 9 бит то для преобразования надо менее 100 мс.

ssergo
Offline
Зарегистрирован: 10.05.2013

В данном проекте один значительный недостаток - использование RTC DS1307 - эти часы отличаются большой неточностью хода.  Если заменить эти часики на DS3231 - которые за год уходят не более чем на 2 минуты - то будет очень хорошо. Даже есть совместимость на уровне регистров отображающих время и дату.

Но главный плюс - в них есть 2 независимых будильника и встроенный датчик температуры с точностью до 0.25 градуса. Только из модуля с DS3231 необходимо выпаять диод, который рассчитан на подпитку аккумулятора, а мы обычно используем батарейку CR2032 (которой хватит больше чем на год)  подпитка тольго угробит эту батарейку.

phantom74rus
Offline
Зарегистрирован: 08.04.2016

День добрый.

Возможно поможет, сам недавно озадачивался температурой:

if ((data[1]&128) == 0){   //проверяем старший разряд 
      //положительная температура
   }else{
      //отрицательная температура
      uint8_t tmp;
      // «склеиваем» нулевой и первый байты ОЗУ датчика
      tmp = ((uint16_t)data[1]<<8)|data[0]; 
      
      //выполняем операцию логического отрицания
      tmp = ~tmp + 1;  
 
      //помещаем результат в соответствующие переменные
      data[0] = tmp;
      data[1] = tmp>>8;  
    }
  //выделяем целую часть
  temp_1 = ((data[1]&7)<<4)|(data[0]>>4);
  //выделяем с помощью битовой маски дробную часть
  temp_2 = (data[0]&15);
  //преобразуем в целое число
  temp_2 = (temp_2<<1) + (temp_2<<3);// Умножаем на 10
  temp_2 = (temp_2>>4);//делим на 16 или умножаем на 0.0625

 

anatoliyrnd
Offline
Зарегистрирован: 17.03.2016

Смущает if ((data[1]&128) == 0){   //проверяем старший разряд

128 - 10000000b

 флаг S по даташиту устанавливается маской 11111xxxb в MSByte

IMHO правльнее будет 

if (data[1]>>3) // если истина то отрицательная температура, если ложь то положительная]

причем отрицательная температура в двичной системе инвертированна

+25.0625°C- 0000 0001 1001 0001

 +10.125°C  0000 0000 1010 0010

+0.5°C         0000 0000 0000 1000

0°C               0000 0000 0000 0000

-0.5°C          1111 1111 1111 1000

-10.125°C    1111 1111 0101 1110

-25.0625°C  1111 1110 0110 1111 

и разве tmp должна быть int8_t а не  int16_t

phantom74rus
Offline
Зарегистрирован: 08.04.2016

Это преобразование для DS18B20.

Флаг S с 11 по 15 биты. Недостаточно проверить только старший разряд разве?

S – знак температуры (0 – положительная температура, 1 – отрицательная) BIT15-BIT11, BIT10–BIT4 -  целая часть значения температуры, BIT3-BIT0 – дробная часть

В DS18B20 для представления отрицательной температуры используется дополнительный код.  Чтобы получить дополнительный код числа, нужно выполнить над числом поразрядную инверсию (~) и прибавить к результату единицу. 

      tmp = ~tmp + 1;

И да, конечно uint16_t. Опечаточка, спасибо.

 

anatoliyrnd
Offline
Зарегистрирован: 17.03.2016

phantom74rus пишет:

 

Флаг S с 11 по 15 биты. Недостаточно проверить только старший разряд разве? 

 

Да впринципе достаточно. :)

SeaWanderer
Offline
Зарегистрирован: 05.04.2016
Скеч в записи 12 Vad33 - РАБОЧИЙ, показывает в минус и обратно. Сбойнул маленько на минус 10:
 
8 0 4B 46 FF FF C 10 3B LB= 8 HB= 0 T = 4
8 0 4B 46 FF FF 10 10 9A LB= 8 HB= 0 T = 4
7 0 4B 46 FF FF 4 10 B7 LB= 7 HB= 0 T = 3
7 0 4B 46 FF FF 8 10 FA LB= 7 HB= 0 T = 3
6 0 4B 46 FF FF C 10 82 LB= 6 HB= 0 T = 3
6 0 4B 46 FF FF 10 10 23 LB= 6 HB= 0 T = 3
5 0 4B 46 FF FF 4 10 31 LB= 5 HB= 0 T = 2
5 0 4B 46 FF FF 8 10 7C LB= 5 HB= 0 T = 2
4 0 4B 46 FF FF B 10 6A LB= 4 HB= 0 T = 2
4 0 4B 46 FF FF F 10 51 LB= 4 HB= 0 T = 2
3 0 4B 46 FF FF 1 10 5D LB= 3 HB= 0 T = 1
3 0 4B 46 FF FF 5 10 66 LB= 3 HB= 0 T = 1
3 0 4B 46 FF FF 7 10 F7 LB= 3 HB= 0 T = 1
2 0 4B 46 FF FF B 10 F9 LB= 2 HB= 0 T = 1
2 0 4B 46 FF FF D 10 53 LB= 2 HB= 0 T = 1
2 0 4B 46 FF FF 10 10 36 LB= 2 HB= 0 T = 1
1 0 4B 46 FF FF 3 10 4A LB= 1 HB= 0 T = 0
1 0 4B 46 FF FF 5 10 E0 LB= 1 HB= 0 T = 0
1 0 4B 46 FF FF 8 10 69 LB= 1 HB= 0 T = 0
0 0 4B 46 FF FF B 10 7F LB= 0 HB= 0 T = 0
0 0 4B 46 FF FF E 10 80 LB= 0 HB= 0 T = 0
FF FF 4B 46 FF FF 1 10 43 LB= FF HB= FF T = 0
FF FF 4B 46 FF FF 4 10 BC LB= FF HB= FF T = 0
FF FF 4B 46 FF FF 6 10 2D LB= FF HB= FF T = 0
FF FF 4B 46 FF FF 8 10 F1 LB= FF HB= FF T = 0
FE FF 4B 46 FF FF B 10 E7 LB= FE HB= FF T = -1
FE FF 4B 46 FF FF E 10 18 LB= FE HB= FF T = -1
FE FF FF FF FF FF FF FF FF LB= FE HB= FF T = -1
F6 FF 4B 46 FF FF 9 10 5C LB= F6 HB= FF T = -5
F6 FF 4B 46 FF FF A 10 9 LB= F6 HB= FF T = -5
F6 FF 4B 46 FF FF C 10 A3 LB= F6 HB= FF T = -5
F5 FF 4B 46 FF FF 3 10 7E LB= F5 HB= FF T = -5
F5 FF 4B 46 FF FF 4 10 10 LB= F5 HB= FF T = -5
F5 FF 4B 46 FF FF 5 10 D4 LB= F5 HB= FF T = -5
F5 FF 4B 46 FF FF 6 10 81 LB= F5 HB= FF T = -5
F5 FF 4B 46 FF FF 7 10 45 LB= F5 HB= FF T = -5
F4 FF 4B 46 FF FF 9 10 DA LB= F4 HB= FF T = -6
F4 FF 4B 46 FF FF A 10 8F LB= F4 HB= FF T = -6
F4 FF 4B 46 FF FF A 10 8F LB= F4 HB= FF T = -6
F4 FF 4B 46 FF FF C 10 25 LB= F4 HB= FF T = -6
F4 FF 4B 46 FF FF C 10 25 LB= F4 HB= FF T = -6
F4 FF 4B 46 FF FF E 10 B4 LB= F4 HB= FF T = -6
ED FF 4B 46 FF FF 7 10 3B LB= ED HB= FF T = -9
ED FF 4B 46 FF FF 6 10 FF LB= ED HB= FF T = -9
ED FF 4B 46 FF FF 7 10 3B LB= ED HB= FF T = -9
ED FF 4B 46 FF FF 7 10 3B LB= ED HB= FF T = -9
ED FF 4B 46 FF FF 8 10 23 LB= ED HB= FF T = -9
ED FF 4B 46 FF FF 8 10 23 LB= ED HB= FF T = -9
ED FF 4B 46 FF FF 8 10 23 LB= ED HB= FF T = -9
EC FF 4B 46 FF FF 9 10 A4 LB= EC HB= FF T = -10
EC FF 4B 46 FF FF 9 10 A4 LB= EC HB= FF T = -10
EC FF 4B 46 FF FF 9 10 A4 LB= EC HB= FF T = -10
EC FF 4B 46 FF FF 9 10 A4 LB= EC HB= FF T = -10
EC FF 4B 46 FF FF 9 10 A4 LB= EC HB= FF T = -10
EC FF 4B 46 FF FF A 10 F1 LB= EC HB= FF T = -10
EC FF 4B 46 FF FF A 10 F1 LB= EC HB= FF T = -10
EC FF 4B 46 FF FF A 10 F1 LB= EC HB= FF T = -10
EC FF 4B 46 FF FF B 10 35 LB= EC HB= FF T = -10
FF FF FF FF FF FF FF FF FF LB= FF HB= FF T = 0
EC FF 4B 46 FF FF C 10 5B LB= EC HB= FF T = -10
EC FF 4B 46 FF FF C 10 5B LB= EC HB= FF T = -10
FF FF FF FF FF FF FF FF FF LB= FF HB= FF T = 0
FF FF FF FF FF FF FF FF FF LB= FF HB= FF T = 0
EB FF 4B 46 FF FF 1 10 2 LB= EB HB= FF T = -10
FF FF FF FF FF FF FF FF FF LB= FF HB= FF T = 0
EB FF 4B 46 FF FF 2 10 57 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 2 10 57 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 2 10 57 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 2 10 57 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 2 10 57 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 2 10 57 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 3 10 93 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 3 10 93 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 2 10 57 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 3 10 93 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 3 10 93 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 4 10 FD LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 3 10 93 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 4 10 FD LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 3 10 93 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 4 10 FD LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 4 10 FD LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 5 10 39 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 5 10 39 LB= EB HB= FF T = -10
EB FF 4B 46 FF FF 5 10 39 LB= EB HB= FF T = -10
EA FF 4B 46 FF FF A 10 62 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF A 10 62 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF A 10 62 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF B 10 A6 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF B 10 A6 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF A 10 62 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF B 10 A6 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF B 10 A6 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF B 10 A6 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF C 10 C8 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF C 10 C8 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF C 10 C8 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF C 10 C8 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF C 10 C8 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF C 10 C8 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF D 10 C LB= EA HB= FF T = -11
EA FF 4B 46 FF FF C 10 C8 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF D 10 C LB= EA HB= FF T = -11
EA FF 4B 46 FF FF D 10 C LB= EA HB= FF T = -11
EA FF 4B 46 FF FF D 10 C LB= EA HB= FF T = -11
EA FF 4B 46 FF FF E 10 59 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF D 10 C LB= EA HB= FF T = -11
EA FF 4B 46 FF FF E 10 59 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF E 10 59 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF E 10 59 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF F 10 9D LB= EA HB= FF T = -11
EA FF 4B 46 FF FF F 10 9D LB= EA HB= FF T = -11
EA FF 4B 46 FF FF F 10 9D LB= EA HB= FF T = -11
EA FF 4B 46 FF FF F 10 9D LB= EA HB= FF T = -11
EA FF 4B 46 FF FF F 10 9D LB= EA HB= FF T = -11
EA FF 4B 46 FF FF F 10 9D LB= EA HB= FF T = -11
EA FF 4B 46 FF FF 10 10 69 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF 10 10 69 LB= EA HB= FF T = -11
EA FF 4B 46 FF FF 10 10 69 LB= EA HB= FF T = -11
E9 FF 4B 46 FF FF 4 10 7B LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 4 10 7B LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 4 10 7B LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 5 10 BF LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 5 10 BF LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 5 10 BF LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 5 10 BF LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 5 10 BF LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 4 10 7B LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 5 10 BF LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 6 10 EA LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 6 10 EA LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 6 10 EA LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 6 10 EA LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 6 10 EA LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 6 10 EA LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 7 10 2E LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 7 10 2E LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 7 10 2E LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 7 10 2E LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 7 10 2E LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 8 10 36 LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 8 10 36 LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 8 10 36 LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 8 10 36 LB= E9 HB= FF T = -11
E9 FF 4B 46 FF FF 8 10 36 LB= E9 HB= FF T = -11
E8 FF 4B 46 FF FF 9 10 B1 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 9 10 B1 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 9 10 B1 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF A 10 E4 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 9 10 B1 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 9 10 B1 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 9 10 B1 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF A 10 E4 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF A 10 E4 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF A 10 E4 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF B 10 20 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF B 10 20 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF A 10 E4 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF A 10 E4 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF B 10 20 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF B 10 20 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF B 10 20 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF B 10 20 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF B 10 20 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF B 10 20 LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF C 10 4E LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF D 10 8A LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF D 10 8A LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF D 10 8A LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF D 10 8A LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF D 10 8A LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF D 10 8A LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF D 10 8A LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF E 10 DF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF D 10 8A LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF E 10 DF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF E 10 DF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF E 10 DF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF E 10 DF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF E 10 DF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF E 10 DF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF E 10 DF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF F 10 1B LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF F 10 1B LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF F 10 1B LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF F 10 1B LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF F 10 1B LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF F 10 1B LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF F 10 1B LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF F 10 1B LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 10 10 EF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 10 10 EF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 10 10 EF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 10 10 EF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 10 10 EF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 10 10 EF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 10 10 EF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 10 10 EF LB= E8 HB= FF T = -12
E8 FF 4B 46 FF FF 10 10 EF LB= E8 HB= FF T = -12
E7 FF 4B 46 FF FF 1 10 3D LB= E7 HB= FF T = -12
E8 FF 4B 46 FF FF 10 10 EF LB= E8 HB= FF T = -12
E7 FF 4B 46 FF FF 1 10 3D LB= E7 HB= FF T = -12
E7 FF 4B 46 FF FF 1 10 3D LB= E7 HB= FF T = -12
E7 FF 4B 46 FF FF 1 10 3D LB= E7 HB= FF T = -12
E7 FF 4B 46 FF FF 1 10 3D LB= E7 HB= FF T = -12
E7 FF 4B 46 FF FF 1 10 3D LB= E7 HB= FF T = -12
E7 FF 4B 46 FF FF 1 10 3D LB= E7 HB= FF T = -12
E7 FF 4B 46 FF FF 1 10 3D LB= E7 HB= FF T = -12
E7 FF 4B 46 FF FF 2 10 68 LB= E7 HB= FF T = -12
E7 FF 4B 46 FF FF 2 10 68 LB= E7 HB= FF T = -12
E7 FF 4B 46 FF FF 2 10 68 LB= E7 HB= FF T = -12
E7 FF 4B 46 FF FF 2 10 68 LB= E7 HB= FF T = -12
 
Спасибо. 
SeaWanderer
Offline
Зарегистрирован: 05.04.2016

ssergo,

по неточности DS1307 будет видно при длительной непрерывной эксплуатации готового изделия, требования невысоки. Но пока после запуска RTC - не врут. Включал нексолько раз за пару недель, посмотреть. Диод и резистор я выпаял, как посоветовали в ютубе, для корректной работы с CR2032 ,( LR2032 не нашёл, пришлось адаптировать под батарейку космос)
SeaWanderer
Offline
Зарегистрирован: 05.04.2016

скетч anatoliyrnd допилить до ума у меня не вышло, несмотря на кажущуюся простоту предложения. Буду допиливать скетч  Vad33 из записи№12, благо там похоже просто слэшами удастся закрыть ненужное оставив нужное. Спасибо всем ещё раз.

anatoliyrnd
Offline
Зарегистрирован: 17.03.2016

SeaWanderer пишет:

скетч anatoliyrnd допилить до ума у меня не вышло, несмотря на кажущуюся простоту предложения. Буду допиливать скетч  Vad33 из записи№12, благо там похоже просто слэшами удастся закрыть ненужное оставив нужное. Спасибо всем ещё раз.

Вот для DS18b20 полностю рабочая функция с округлением до целых градусов . 

float dsconvertdata( byte *znak)
{

  byte celsius;

  int16_t raw = (data[1] << 8) | data[0];
  
  if ((data[1] & 128) == 0)
  {
    *znak = 0; //температура положительлная
  } else
  {
    *znak = 1; //температура отрицательная
    raw = ~raw + 1;
  }
   raw = raw & ~7;  // 9 bit resolution
  //raw = raw & ~3; 10 bit res
celsius = byte(raw/16);
  
  return celsius;
}

 

SeaWanderer
Offline
Зарегистрирован: 05.04.2016
Как здесь ранее заметил dimax, датчик мой - DS18S20, а скетчи я терзаю для DS18B20. 
 
anatoliyrnd, для S пойдёт ?
Maverik
Offline
Зарегистрирован: 12.09.2012

ssergo пишет:

  Только из модуля с DS3231 необходимо выпаять диод, который рассчитан на подпитку аккумулятора, 

это который ?

anatoliyrnd
Offline
Зарегистрирован: 17.03.2016

SeaWanderer пишет:

Как здесь ранее заметил dimax, датчик мой - DS18S20, а скетчи я терзаю для DS18B20. 
 
anatoliyrnd, для S пойдёт ?

У меня нет S но насколько я помню 0,1 байты у обоих датчиков это температура, а 8 байт это CRS , вот назначение других байтов разное. Но в нашем случае поидеи должно работать.

Только еденственное не float dsconvertdata а byte dsconvertdata , т.к. функция будет возвращать целое число температуры.

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

Maverik пишет:

ssergo пишет:

  Только из модуля с DS3231 необходимо выпаять диод, который рассчитан на подпитку аккумулятора, 

это который ?

Он у них один. Если на 3231 сделано как на 1307, то еще и резистор из нижнего плеча от батареи.

SeaWanderer
Offline
Зарегистрирован: 05.04.2016
Научился пилить оргстекло электролобзиком без сколов, освоил Layout, хлорное железо и ЛУТ. На удивление всё более менее красиво получается с первого раза.
В отличие от скетча на отриц.t.
Отдельно,  с выводом на serial,ваши предложения некоторые (пробовал не все) работают (скетч от Vad33 из записи №12 например). Когда вставляю в код Аффтора поделки с гиктаймса, - t=0, не считает гадина заокеанская хоть ты тресни. При этом структура сохраняется, компиляция проходится, ни на что не ругаемся, вкачиваемся в Nano, время показываем - t не показываем. Положит. температуру скетч автора показывает после моего первого изменения (Temp = Temp >> 1;) Буду дальше пилить скетчи, после того, как допилю и склею корпус. Благо до минусовых температур ещё есть полгода :)