ds18b20

Здесь можно обсуждать устройства относящиеся к цифровым технологиям.

Модератор: gurvinok

Аватара пользователя
GhostX
Сообщения: 1135
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

ds18b20

Сообщение GhostX » 26 фев 2016, 13:08

Зацепил я значит эти датчики. Результат довольно точен. Заявленным данным соответствует на 100%.
Хотя немного поэкспериментировав выявил некоторые закономерности. проверка датчиков подмышкой)) дало результаты 36,44 и 36,56 при погрешности в 0.5 градуса считаю отлично.
далее воткнул их в инкубатор без подогрева, просто. Температура опустилась до комнатной и начала играть в такт с там уже имеющимися а соотношение в 0,12 разницы так и осталось, что наводит на мысли, что они намного точнее чем заявлено. Может, это только с моими экземплярами...
Ладно ближе к делу.
Как то можно их калибровать внутри себя?

Аватара пользователя
gurvinok
Сообщения: 1544
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: ds18b20

Сообщение gurvinok » 26 фев 2016, 14:29

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

Аватара пользователя
GhostX
Сообщения: 1135
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: ds18b20

Сообщение GhostX » 27 фев 2016, 02:55

gurvinok писал(а):Нет. Только выбирать разрядеость выборки для точности.
Вот с этим я столкнусь в ближайшие 2-3 дня. Как это делается, по ардуински и по СИшенски? :)

Аватара пользователя
gurvinok
Сообщения: 1544
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: ds18b20

Сообщение gurvinok » 27 фев 2016, 09:42

У датчика есть дамп байт. Выглядит он вот так.
ds18b20_1.jpg
Для того чтобы изменить разрядность оцифровки, нужно внести изменения в байт за номером четыре. Это конфигурационный байт. Вот его внутренности.
ds18b20_2.jpg
Биты от 0 до 4 ничего не значат, а вот 5-й и 6-й как раз отвечают за разрядность. В таблице ниже видно какая возможна разрядность АЦП и время требуемое на оцифровку температуры. Для датчика DS18B20 по умолчанию записаны две единицы, что говорит о том что он будет оцифровывать в 12 битном режиме и на все это нужно 750 мс времени.

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

Аватара пользователя
GhostX
Сообщения: 1135
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: ds18b20

Сообщение GhostX » 29 фев 2016, 20:57

Я еще больше разобрался в кишках этого датчика и теперь могу вопрос по человечий задавать.
Вот возьмем 25.06, 25.12, 25.24 градусов
Как сделать 1 знак после запятой? Но не отрезать, а округлить по среднему арифметическому.

Аватара пользователя
gurvinok
Сообщения: 1544
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: ds18b20

Сообщение gurvinok » 29 фев 2016, 21:06

Один знак после запятой. sprintf() по моему уже сама округлит.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1135
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: ds18b20

Сообщение GhostX » 29 фев 2016, 22:11

Сейчас внедрял этот датчик в код инкубатора и наткнулся на одну грустную непродуманность.
у меня все переменные связанные с температурой были в типе byte. А теперь видимо требуются float
где 4 байта...
так... мысли в слух... еще не знаю как исправлять... ))
Как хранятся переменные типа float в памяти?
память eeprom.

Аватара пользователя
gurvinok
Сообщения: 1544
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: ds18b20

Сообщение gurvinok » 29 фев 2016, 22:36

По байтно)))

Код: Выделить всё


// Сохранить float в byte массив
void floattobyte(float* data, byte* arr)
{
    for(byte i=0; i<4; i++)
    {
        *arr = *data;
        data++;
        arr++;
    }
}

// Чтение float из byte массива
void bytetofloat(float* data, byte* arr)
{
     for(byte i=0; i<4; i++)
    {
        *data = *arr;
        data++;
        arr++;
    }
}
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1135
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: ds18b20

Сообщение GhostX » 29 фев 2016, 23:23

Честно говоря не понял что в коде происходит. Зачем адресу назначать значение переменной?!
Думаю там суть самая показана, но не наглядно.))
нашел тоже самое или не тоже самое, но более понятно, вот оно:

Код: Выделить всё

#include <EEPROM.h>

void setup()
{ 
  float val_1 = 3000.12;
  float val_2 = 0;
  
  EEPROM_float_write(0, val_1);
  val_2 = EEPROM_float_read(0);

  // выводим в сериал
  Serial.begin(9600);
  Serial.println(val_2);
}

void loop(){}


void EEPROM_float_write(int addr, float val) // запись в ЕЕПРОМ
{  
  byte *x = (byte *)&val;
  for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}

float EEPROM_float_read(int addr) // чтение из ЕЕПРОМ
{    
  byte x[4];
  for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
  float *y = (float *)&x;
  return y[0];
}
не понимаю, что происходит вот тут

Код: Выделить всё

byte *x = (byte *)&val;
и вот тут

Код: Выделить всё

float *y = (float *)&x;
интуитивно догадываюсь, что идет преобразование типа переменной.... Но там указатель стоит....
особенно вот это не понятно (byte *) есть тип без переменной.
хотя вторая половина тоже не понятна.)))
Понимаю, что вроде просто, дело в мелочах.

Аватара пользователя
gurvinok
Сообщения: 1544
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: ds18b20

Сообщение gurvinok » 29 фев 2016, 23:30

Зачем адресу назначать значение переменной?!
Не адресу, а значение байтов флоата передается в массив, а потом увеличивается адрес байта флоата и элемента массива. Я на кой черт кино про указатели снимал? :lol:
Если долго мучиться, может быть получится.

Ответить