Датчик ds18b20. Как перевести дискретность на 12 бит???

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Prototipnew  , а по какой схеме питается датчик ?
не по "паразитной" ? точно ?

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

Штирлиц пишет:

 Мож ну его этот датчик , к чертовой матери. Мож лучше с блинком  поиграться топикстартеру, а потом и с блинком без делей.Если бы датчик читать умел - уже бы и сам поменял разрядность и без загрузки скетчей...Не умея менять разрядность датчика , имеем желание иметь температуру с тысячными градуса. .

После тех пяти строчек проблема на 9 будет вернуться. Но возвращается, если только ТС ничего не умалчивает. Ощущение, что у него в EEPROM датчика не пишется.

Та все поколдовал получилось со строками работает.

Prototipnew
Offline
Зарегистрирован: 07.02.2016

SU-27-16 пишет:

Prototipnew  , а по какой схеме питается датчик ?
не по "паразитной" ? точно ?

Подпертый выход резистором на плюс

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Та все поколдовал получилось со строками работает.

Prototipnew  , дык , что было-то не так ? после чего заработало ?

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

SU-27-16 пишет:

Та все поколдовал получилось со строками работает.

Prototipnew  , дык , что было-то не так ? после чего заработало ?

Да че? Скетч загружал не в ардуино , а на удаленный сервер... Кинулся , разобрался , подключил к компу ардуину- ВСЕ заработало.!!!! И "сериал" про 12 бит закончился!!!!

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

странно.... мгновений 17-ть , а бит всего 12-ть :(

Prototipnew
Offline
Зарегистрирован: 07.02.2016

SU-27-16 пишет:

Та все поколдовал получилось со строками работает.

Prototipnew  , дык , что было-то не так ? после чего заработало ?

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

#include <OneWire.h>
 
OneWire ds (2);
 
byte data[12];
byte addr1[8]; // ID индивидуально для каждого датчика
 
unsigned int raw;
float temp1;
 
void setup()
{
Serial.begin(9600);
ds.reset();
  ds.write(0xCC);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60);
  //ds.write(0x48);
}
 
void loop()
{
  temp1 = DS18B20 (addr1);
  Serial.println(temp1);
}
 
//==================================================================================
//                            Считывание температуры
//==================================================================================
float DS18B20(byte *adres)
{
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44, 1); // start conversion, with parasite power on at the end
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE); // Read Scratchpad
 
  for (byte i = 0; i < 12; i++) // можно увеличить точность измерения до 0.0625 *С (от 9 до 12 бит)
  { // we need 9 bytes
   data[i] = ds.read ();
  }
  raw =  (data[1] << 8) | data[0];//=======Пересчитываем в температуру
  float celsius =  (float)raw / 16.0;
  return celsius;
}
Prototipnew
Offline
Зарегистрирован: 07.02.2016

Штирлиц пишет:

SU-27-16 пишет:

Та все поколдовал получилось со строками работает.

Prototipnew  , дык , что было-то не так ? после чего заработало ?

Да че? Скетч загружал не в ардуино , а на удаленный сервер... Кинулся , разобрался , подключил к компу ардуину- ВСЕ заработало.!!!! И "сериал" про 12 бит закончился!!!!

Очень смешно. Попался тебе б такой датчик....

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Prototipnew пишет:

Штирлиц пишет:

SU-27-16 пишет:

Та все поколдовал получилось со строками работает.

Prototipnew  , дык , что было-то не так ? после чего заработало ?

Да че? Скетч загружал не в ардуино , а на удаленный сервер... Кинулся , разобрался , подключил к компу ардуину- ВСЕ заработало.!!!! И "сериал" про 12 бит закончился!!!!

Очень смешно. Попался тебе б такой датчик....

Я бы попробывал другой(не  такая уж у них высокая цена). А первый -если есть проблема-выбросил бы. Сейчас у него ЕЕПРОМ глючит . а завтра он покажет другую температуру ядерного реактора. Че с ним заморачиваться?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Prototipnew  , так правильнее... дополнительно - "свернуть" и "пронумеровать"
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Только 048 улалил только чтоб не убить память.
а жизни хватит , чтобы убить её ? :) ( он помнит с одного раза , не надо каждый раз в память это писАть )

Попался тебе б такой датчик....
Штирлиц  прав... 
Я бы попробывал другой(не  такая уж у них высокая цена). А первый -если есть проблема-выбросил бы. Сейчас у него ЕЕПРОМ глючит . а завтра он покажет другую температуру ядерного реактора. Че с ним заморачиваться?

на Юноне неделю назад = 145р. , сегодня = 160р.
ИМХО : не те деньги что потрачено нервов :)-

Prototipnew
Offline
Зарегистрирован: 07.02.2016

Штирлиц пишет:

Prototipnew пишет:

Штирлиц пишет:

SU-27-16 пишет:

Та все поколдовал получилось со строками работает.

Prototipnew  , дык , что было-то не так ? после чего заработало ?

Да че? Скетч загружал не в ардуино , а на удаленный сервер... Кинулся , разобрался , подключил к компу ардуину- ВСЕ заработало.!!!! И "сериал" про 12 бит закончился!!!!

Очень смешно. Попался тебе б такой датчик....

Я бы попробывал другой(не  такая уж у них высокая цена). А первый -если есть проблема-выбросил бы. Сейчас у него ЕЕПРОМ глючит . а завтра он покажет другую температуру ядерного реактора. Че с ним заморачиваться?

Ну зато много нового узнал) Ну канешно легше все выбросить. Вообще есть у меня подозрения что это такая модель датчика. В даташите опиывают датчик DS18B20s у него нет энергонезависимой.... А в датчике DS18B20 просто есть, что-то такое.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

В даташите опиывают датчик DS18B20s у него нет энергонезависимой....
моя с таким не встречался

Prototipnew
Offline
Зарегистрирован: 07.02.2016

SU-27-16 пишет:

В даташите опиывают датчик DS18B20s у него нет энергонезависимой....
моя с таким не встречался

Может я неправильно понимаю, но что-то с ним не так...

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Prototipnew пишет:

Может я неправильно понимаю, но что-то с ним не так...

После этого топика я стал с подозрением смотреть на свои датчики - вот сейчас с ними все хорошо . а потом -БАЦ !!!!и начнут глючить, узнав о вашем датчике. Убейте Ваш датчик!!! А то не дай бог подсоедините его к ESP8266 и он через интернет заразит все датчики во вселенной!

А если серьезно , то скорее всего у вашего датчика не прошли даром предыдущие эксперименты (неправильное подключение питания, переполюсовка,напряжение питания и т.д.).

А то что ваши познания улучшились , благодаря этому - в этом и есть ПЛЮС экспериментов! И один датчик - низкая цена за это.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Убейте Ваш датчик!!! А то не дай бог подсоедините его к ESP8266 и он через интернет заразит все датчики во вселенной!
:)-

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

Чтобы быть добрым феем до конца :

#include <OneWire.h>

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
 byte flag;    // Флаг для обслуживания времени возврата
 byte addr[8] = //Здесь адрес вашего датчика;
 int Temp; // Переменная температуры
 


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

//***Функция изменения разрядности Даллас****
void razrDall(byte raz) {
  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F);
  ds.write(0xFF);
  ds.write(raz);
  //ds.write(0x48); По вашему желанию не переносим
}
//------------------------------------------------

  
//***Функция считывания температуры c Далласов*****
void dallRead(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); //Команда на конвертацию
    flag = 1; //Время возврата в секундах
  }
  else {
    int temp;
     ds.reset();
     ds.select(addr);
     ds.write(0xBE); //Считывание значения с датчика
     temp = (ds.read() | ds.read()<<8); //Принимаем два байта температуры
     Temp = temp*100/4/4; //Температура в целочисленном формате *100
     //два знака после запятой.
     flag = 30; //Время возврата в секундах
   }
  }
}
//--------------------------------------------------
     
void loop() {
  
  dallRead(flag * 1000);
  Serial.println(Temp / 100.0,2);
  Serial.println(" ");
  delay(900); //Чтобы в порт непрерывно не долбило
  
}

Убили delay, float, лишние массивы. Работает с двумя знаками после запятой. Для трех не хватит int-а, надо ставить long и перемножать-делить на 1000.

Кстати датчик у вас 18B20, т.к. начало ID 0х28, у других иные значения.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

спасибо , добрый фей bwn !!!!
:)

Prototipnew
Offline
Зарегистрирован: 07.02.2016

Штирлиц пишет:

Prototipnew пишет:

Может я неправильно понимаю, но что-то с ним не так...

После этого топика я стал с подозрением смотреть на свои датчики - вот сейчас с ними все хорошо . а потом -БАЦ !!!!и начнут глючить, узнав о вашем датчике. Убейте Ваш датчик!!! А то не дай бог подсоедините его к ESP8266 и он через интернет заразит все датчики во вселенной!

А если серьезно , то скорее всего у вашего датчика не прошли даром предыдущие эксперименты (неправильное подключение питания, переполюсовка,напряжение питания и т.д.).

А то что ваши познания улучшились , благодаря этому - в этом и есть ПЛЮС экспериментов! И один датчик - низкая цена за это.

Я не делал никаких эксперементов он сразу так показывал. И питания я сразу правильно подключал так что....

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

Чтобы быть добрым феем до конца :

#include <OneWire.h>

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
 byte flag;    // Флаг для обслуживания времени возврата
 byte addr[8] = //Здесь адрес вашего датчика;
 int Temp; // Переменная температуры
 


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

//***Функция изменения разрядности Даллас****
void razrDall(byte raz) {
  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F);
  ds.write(0xFF);
  ds.write(raz);
  //ds.write(0x48); По вашему желанию не переносим
}
//------------------------------------------------

  
//***Функция считывания температуры c Далласов*****
void dallRead(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); //Команда на конвертацию
    flag = 1; //Время возврата в секундах
  }
  else {
    int temp;
     ds.reset();
     ds.select(addr);
     ds.write(0xBE); //Считывание значения с датчика
     temp = (ds.read() | ds.read()<<8); //Принимаем два байта температуры
     Temp = temp*100/4/4; //Температура в целочисленном формате *100
     //два знака после запятой.
     flag = 30; //Время возврата в секундах
   }
  }
}
//--------------------------------------------------
     
void loop() {
  
  dallRead(flag * 1000);
  Serial.println(Temp / 100.0,2);
  Serial.println(" ");
  delay(900); //Чтобы в порт непрерывно не долбило
  
}

Убили delay, float, лишние массивы. Работает с двумя знаками после запятой. Для трех не хватит int-а, надо ставить long и перемножать-делить на 1000.

Кстати датчик у вас 18B20, т.к. начало ID 0х28, у других иные значения.

Спасибо. Но мне вринцыпе и два знака хватит.

Стьюи
Стьюи аватар
Offline
Зарегистрирован: 13.11.2016

Ищу температурный датчик,нашел здесь http://proumnyjdom.ru/kontrollery/ds18b20-podklyuchenie-k-arduino.html может кто знает где еще посмотреть аналогичные? Желательно  с ценами.

borisov_aa
Offline
Зарегистрирован: 05.04.2018

Добрый день, bwn

Нигде не могу найти хоть какой-то пример alarm search (0xEC), а у самого ума не хватает. Может есть какой то пример, или хотя бы кусок кода.

Заранее благодарен

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

Мне это не требовалось, не разбирался. Набейте в поиске "DS18B20 Чернов", очень неплохой перевод даташита.
И мне кажется, смысла в этом особого нет, если только не миллион датчиков на линии. Для обычных 2-3, все равно даем команду на конвертацию, потом считываем и анализируем. Зачем плодить лишние сущности.
В этой серии вроде есть какой то работающий автономно и дрыгающий ногой при выходе за заданные пределы, вот это уже интересней. ИМХО.

borisov_aa
Offline
Зарегистрирован: 05.04.2018

при помощи библиотеки DallasTemperature делается легко и просто, а вот через onewire пока сложно. Видимо придется вручную реализовать. Спасибо, ну и Чернова поищу

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

Перед search() пишите в шину 0xEC. Потом стандартная процедура залова откликнувшихся. Откликнутся только те, у кого случился Alarm.

borisov_aa
Offline
Зарегистрирован: 05.04.2018
  ds.reset();
  ds.write(0xCC);
  ds.write(0xEC);
  while(ds.search(addr))
  {
    ds_count++;
  }

типа так?

Не сработало...

isupov_andrey
Offline
Зарегистрирован: 21.08.2021

Все датчики DS18b20 Ревизии C4 работают только в 12-Bit!
Опыт показал что запись трех байт TH/USER BYTE 1, TH/USER BYTE 2, CONFIG. Записываются только два первых байта. CONFIG до записи и после записи 0x7F.

Начал разбираться в чем проблема, потратил 4 часа! Наткнулся на сайт https://www.rlocman.ru/review/article.html?di=621315,
где написано "

  • Семейство C: датчик работает только в 12-битном режиме – байт 4 регистра памяти датчика (регистр конфигурации)  всегда равен 0х7F.

"