Определение порядкогого номера DS18B20

Использование датчиков и обсуждение пользовательских блоков к ним
Oleg1345140
Лейтенант
Сообщения: 538
Зарегистрирован: 06.09.2015{, 07:09}
Репутация: 1
Откуда: Курган

Определение порядкогого номера DS18B20

#1

Сообщение Oleg1345140 » 25.10.2016{, 17:45}

Добрый день. Подскажите уважаемые форумчане. Задача следующая есть несколько наборов датчиков DS18B20 (по 20 штук на шине). Задача сделать несколько устройств, которые при подключении смогут опрашивать датчики и записывать данные. Сложность заключается в том что необходимо знать показания какого датчика записываются (1, 2, ..., 20...). Как это можно организовать. И да датчики должны инициализироваться в приборе самостоятельно. Пример: берем прибор А и подключаем к шине 1, прибор опрашивает датчики и записывает и/или отображает их показания на экране (зависит от оператора прибора), наприер оператор хочет узнать температуру 5-го датчика или пролистать и посмотреть изменение температуры от 1 до 20 датчика.

Добавлено (25.10.2016, 17:45)
---------------------------------------------
Подскажите хоть в каком направлении двигаться.

Аватара пользователя
slavas
Лейтенант
Сообщения: 573
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 0
Откуда: Санкт-Петербург

Определение порядкогого номера DS18B20

#2

Сообщение slavas » 25.10.2016{, 18:56}

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

Oleg1345140
Лейтенант
Сообщения: 538
Зарегистрирован: 06.09.2015{, 07:09}
Репутация: 1
Откуда: Курган

Определение порядкогого номера DS18B20

#3

Сообщение Oleg1345140 » 25.10.2016{, 20:42}

Есть одно но, количество шин в ближайшее время превысит 500 и будет расти, приборов тоже будет несколько и возможности обновлять их не будет. Может есть какие то концептуальные решения?

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 62
Контактная информация:

Определение порядкогого номера DS18B20

#4

Сообщение Олег » 25.10.2016{, 21:11}

Исходных данных мало. Я бы наверно ставил на каждый блок ардуино про мини это 20 датчиков можно подключить и считывание по модбас. Про мини стоит копейки, а шанс глюков уменьшается.

Oleg1345140
Лейтенант
Сообщения: 538
Зарегистрирован: 06.09.2015{, 07:09}
Репутация: 1
Откуда: Курган

Определение порядкогого номера DS18B20

#5

Сообщение Oleg1345140 » 25.10.2016{, 21:17}

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

Аватара пользователя
support
Супермодератор
Сообщения: 1785
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 638
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Определение порядкогого номера DS18B20

#6

Сообщение support » 25.10.2016{, 21:23}

Проблема в том что нет принципиальной возможности определить положения датчика в шлейфе. То есть это просто невозможно сделать. Можно опросить шлейф и узнать что на нём висят датчики с такими - то адресами, а вот положение в шлейфе узнать невозможно. Единственный вариант - погреть датчик и по изменению температуры определить кто он.
Автор программы FLProg.

Oleg1345140
Лейтенант
Сообщения: 538
Зарегистрирован: 06.09.2015{, 07:09}
Репутация: 1
Откуда: Курган

Определение порядкогого номера DS18B20

#7

Сообщение Oleg1345140 » 25.10.2016{, 21:52}

А в последствии изменить их ром так что бы унифицировать адреса для всех шлейфов?

Аватара пользователя
eugeneb
Лейтенант
Сообщения: 476
Зарегистрирован: 15.08.2016{, 11:20}
Репутация: 17
Откуда: Нижний Новгород
Имя: Евгений

Определение порядкогого номера DS18B20

#8

Сообщение eugeneb » 25.10.2016{, 23:52}

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

Oleg1345140
Лейтенант
Сообщения: 538
Зарегистрирован: 06.09.2015{, 07:09}
Репутация: 1
Откуда: Курган

Определение порядкогого номера DS18B20

#9

Сообщение Oleg1345140 » 28.10.2016{, 22:11}

Уточнил. Эти датчики можно програмировать. Там есть 3 байта или бита. И в них можно вписать последовательность. Можно ли этот функционал чтение/запись реализовать в флпрог?

Аватара пользователя
eugeneb
Лейтенант
Сообщения: 476
Зарегистрирован: 15.08.2016{, 11:20}
Репутация: 17
Откуда: Нижний Новгород
Имя: Евгений

Определение порядкогого номера DS18B20

#10

Сообщение eugeneb » 29.10.2016{, 02:36}

А зачем? Ведь важен не адрес сам по себе, а связка адрес-экземпляр датчика. По фигу какой адрес.

И ещё. Пересмотрел техописание на датчик. Там регистр адреса описывается как :
"64-bit lasered ROM-code"

Нельзя его перепрограммировать.

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

Oleg1345140
Лейтенант
Сообщения: 538
Зарегистрирован: 06.09.2015{, 07:09}
Репутация: 1
Откуда: Курган

Определение порядкогого номера DS18B20

#11

Сообщение Oleg1345140 » 29.10.2016{, 07:32}

eugeneb писал(а):А те три байта, которые вы упомянули, можно запрограммировать отдельно,раз и на всегда.
Только оно вам надо? Нахвоста?
Там можно записать обозначения фактического местоположения датчика уникальное для шлейфа но одинаковое для всех шлейфов. И в последствии на основе этих  обозначений приборы-считыватели будут знать какой датчик они опрашивают в шлейфе.

Аватара пользователя
eugeneb
Лейтенант
Сообщения: 476
Зарегистрирован: 15.08.2016{, 11:20}
Репутация: 17
Откуда: Нижний Новгород
Имя: Евгений

Определение порядкогого номера DS18B20

#12

Сообщение eugeneb » 29.10.2016{, 10:04}

А, вы хотите, чтобы датчик сам сообщал своё местоположение в шлейфе. 
А контроллеру, типа по фигу заводские адреса, ему важны только локальные адреса в шлейфе.
И не надо держать БД на стороне контроллера.

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

Но, придётся запрограммировать КАЖДЫЙ датчик в КАЖДОМ шлейфе. Это может
оказаться геморройно. Даже слишком геморройно. (я не знаю вашу конкретику)
На столько геморройно, что вы откажетесь от этой идеи.

Наверное придётся написать отдельное приложение для программирования датчиков,
и возможно не на ФЛПроге.

Да и как читать потом эти адреса в ФЛПроге я не вижу.
Мож кто подскажет...

Oleg1345140
Лейтенант
Сообщения: 538
Зарегистрирован: 06.09.2015{, 07:09}
Репутация: 1
Откуда: Курган

Определение порядкогого номера DS18B20

#13

Сообщение Oleg1345140 » 29.10.2016{, 10:17}

Запрограммировать это скорее муторно чем геморройно, но вполне реально. да и программировать всего один раз придется. Сейчас очень интересует возможность считывать этот байт или эти байты. Надеюсь кто поможет с пользовательским блоком так как такой функционал я не нашел в флпрог. Возможно это не сложно и автор добавит его в блок датчика.

Аватара пользователя
eugeneb
Лейтенант
Сообщения: 476
Зарегистрирован: 15.08.2016{, 11:20}
Репутация: 17
Откуда: Нижний Новгород
Имя: Евгений

Определение порядкогого номера DS18B20

#14

Сообщение eugeneb » 29.10.2016{, 21:08}

В FLProg есть вспомогательная программа сканирования шины. Она на ардуинском С.
Вот её код для УНО (для второй ножки):

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

#include <OneWire.h>
OneWire  ds(2);  // on pin 10 (a 4.7K resistor is necessary)
byte deviceType;
void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;

  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
  
  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
     
      return;
  }

 

  switch (addr[0]) {
    case 0x10:
      type_s = 1;
      deviceType=1; //Chip = DS18S20 or old DS1820
      break;
    case 0x28:
      type_s = 0;
      deviceType=2;//Chip = DS18B20
      break;
    case 0x22:
      type_s = 0;
      deviceType=3;// Chip = DS1822
      break;
    default:
      deviceType=0;//Другое устройство
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        
  
  delay(1000);     
 
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);     
 for ( i = 0; i < 9; i++) {data [i]= ds.read();}
     

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;  
    else if (cfg == 0x20) raw = raw & ~3;
    else if (cfg == 0x40) raw = raw & ~1;
   
  }
  celsius = (float)raw / 16.0;
  
  
  Serial.write (1);
  Serial.write (2);
  Serial.print (deviceType);
  Serial.write (3);
     for( i = 0; i < 8; i++) {      
   
     Serial.write (2);
     Serial.print(addr[i], HEX);
     Serial.write (3);
    }
  Serial.write (2);
  Serial.print(celsius);
  Serial.write (3);
  Serial.write (4);
  
  
}

Попробуйте от неё добиться, чтобы она вам считывала что-нибудь ещё кроме адреса.

Если получится, то можно будет сделать пользовательский блок для своей задачи.
Последний раз редактировалось eugeneb 29.10.2016{, 21:12}, всего редактировалось 1 раз.

Oleg1345140
Лейтенант
Сообщения: 538
Зарегистрирован: 06.09.2015{, 07:09}
Репутация: 1
Откуда: Курган

Определение порядкогого номера DS18B20

#15

Сообщение Oleg1345140 » 30.10.2016{, 11:21}

Как удалось узнать есть два байта в памяти датчика использующихся в режиме термостата для задания верхней и нижней границы температуры сработки, в режиме измерения эти регистры не участвуют и их можно использовать как регистры общего назначения, в том числе для чтения и записи своих данных. Описание.
В частности раздел Организация памяти: Данные записываются в байты 2, 3 и 4 начиная с младшего бита байта 2 при помощи команды Write Scratchpad [4Eh]. Для проверки целостности записанных данных, можно их прочитать, для чего необходимо передать датчику команду Read Scratchpad [BEh], после чего ведущее устройство должно принимать данные начиная с младшего бита байта 0."
Но как это реализовать в коде и тем более в блоке пользователя я пока не понимаю, возможно кто то из знающих или уважаемый автор подскажет.

Аватара пользователя
eugeneb
Лейтенант
Сообщения: 476
Зарегистрирован: 15.08.2016{, 11:20}
Репутация: 17
Откуда: Нижний Новгород
Имя: Евгений

Определение порядкогого номера DS18B20

#16

Сообщение eugeneb » 30.10.2016{, 20:16}

Та программа, что я вам выложил уже их читает!

В ней есть массив data[].
Его элементы data[2] и data[3] и есть эти два байта.
data[4] - конфигурационный.
Выведите их на печать и увидите.

Ваша задача научиться в них писать.

А пользовательский блок - дело десятое.

Oleg1345140
Лейтенант
Сообщения: 538
Зарегистрирован: 06.09.2015{, 07:09}
Репутация: 1
Откуда: Курган

Определение порядкогого номера DS18B20

#17

Сообщение Oleg1345140 » 30.10.2016{, 20:57}

Считал данные, получил: 2 28 43 70 E 8 0 0 6F 28.69 где 28 43 70 E 8 0 0 6F адрес ром,  28.69 температура, думаю тот скетч все же считывает ром и температуру но не те биты или я что то не так сделал.

Аватара пользователя
slavas
Лейтенант
Сообщения: 573
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 0
Откуда: Санкт-Петербург

Определение порядкогого номера DS18B20

#18

Сообщение slavas » 30.10.2016{, 21:51}

А когда датчики ставили о чём думали, это работало уже или мысль пришла и в полях датчики развесили?

Аватара пользователя
eugeneb
Лейтенант
Сообщения: 476
Зарегистрирован: 15.08.2016{, 11:20}
Репутация: 17
Откуда: Нижний Новгород
Имя: Евгений

Определение порядкогого номера DS18B20

#19

Сообщение eugeneb » 30.10.2016{, 22:34}

Всё правильно. Эта программка считывает весь ROM, все
9 байт.Просто выводит не всё.

Допишите её в конце, чтобы она печатала ещё байты
data[0], data[1]   - это температура
data[2], data[3]   - это нужные вам байты
data[4]   - это конфиг байт
data[8] - это CRC

PS:
На всякий случай, температура считается примерно так: data[0] +  data[1]*256)/16

Добавлено (30.10.2016, 22:34)
---------------------------------------------
slavas писал(а):А когда датчики ставили о чём думали, это работало уже или мысль пришла и в полях датчики развесили?
Я так понимаю, чела бросили на чужое хозяйство...
Последний раз редактировалось eugeneb 01.11.2016{, 02:30}, всего редактировалось 1 раз.

Oleg1345140
Лейтенант
Сообщения: 538
Зарегистрирован: 06.09.2015{, 07:09}
Репутация: 1
Откуда: Курган

Определение порядкогого номера DS18B20

#20

Сообщение Oleg1345140 » 01.11.2016{, 19:48}

eugeneb писал(а):Я так понимаю, чела бросили на чужое хозяйство...
Примерно так. К стати узнал что в регистры (вроде с 4-7) записаны данные о номере датчика и о номере шлейфа. Осталась попытаться их прочесть. Сейчас буду пробовать.

Добавлено (01.11.2016, 19:48)
---------------------------------------------
Воспользовался скетчем из примера:


РезультатПоказать
ROM = 28 FD 51 F 8 0 0 C1
  Chip = DS18B20
  Data = 1 2F 2 4B 46 7F FF 1 10 69  CRC=69
  Temperature = 34.94 Celsius, 94.89 Fahrenheit
ROM = 28 43 70 E 8 0 0 6F
  Chip = DS18B20
  Data = 1 1B 2 4B 46 7F FF 5 10 BB  CRC=BB
  Temperature = 33.69 Celsius, 92.64 Fahrenheit
No more addresses.


Надеюсь что и нужные мне байты там. (к стати на шине два датчика и оба информацию отдали)
Теперь нужно это как то в блок пользователя засунуть. Где можно почитать подробнее о создании пользовательского блока типа CODE, или кто смог бы помочь в этом процессе.

Ответить

Вернуться в «Датчики температуры, влажности и давления»