Обращение к dallas 18b20 по его адресу

ramzes.ru
Offline
Зарегистрирован: 19.11.2014

Подскажите как обратиться к датчику по его адресу?

DallasTemperature sensors(&oneWire);
//=========== Присваиваем имена датчикам Dallas ===============
DeviceAddress ulicaDeviceAddress;   // датчик - УЛИЦА
DeviceAddress vxodDeviceAddress;    // датчик - ВХОД
DeviceAddress kuxhyDeviceAddress;   // датчик - КУХНЯ
DeviceAddress spalnyDeviceAddress;  // датчик - СПАЛЬНЯ
DeviceAddress zalDeviceAddress;     // датчик - ЗАЛ
DeviceAddress xolDeviceAddress;     // датчик - ХОЛ 2 этаж
DeviceAddress spalny2DeviceAddress; // датчик - СПАЛЬНЯ 2 этаж
DeviceAddress tvodaDeviceAddress;   // датчик - Теплоносителя
//============ Устанавливаем значения по умолчанию =============
float ulica = 0;                    //переменная температуры - УЛИЦА
float vxod = 0;                     //переменная температуры - ВХОДА
float kuhny = 0;                    //переменная температуры - КУХНЯ
float spalny = 0;                   //переменная температуры - СПАЛЬНЯ
float zal = 0;                      //переменная температуры - ЗАЛ
float xol = 0;                      //переменная температуры - ХОЛ
float spalny2 = 0;                  //переменная температуры - СПАЛЬНЯ 2 этаж
float tvody = 0;                    //переменная температуры - температура в болере
float AverageTemp = 0;              //переменная среднего значения температуры

void loop() {
sensors.requestTemperatures();

  sensors.getAddress(ulicaDeviceAddress, 0);
  ulica = sensors.getTempC(ulicaDeviceAddress);
  
  sensors.getAddress(vxodDeviceAddress, 1);
  vxod = sensors.getTempC(vxodDeviceAddress);
  
  sensors.getAddress(kuxhyDeviceAddress, 2);
  kuhny = sensors.getTempC(kuxhyDeviceAddress);

  sensors.getAddress(spalnyDeviceAddress, 3);
  spalny = sensors.getTempC(spalnyDeviceAddress);

  sensors.getAddress(zalDeviceAddress, 4);
  zal = sensors.getTempC(zalDeviceAddress);

  sensors.getAddress(xolDeviceAddress, 5);
  xol = sensors.getTempC(xolDeviceAddress);
  
  sensors.getAddress(spalny2DeviceAddress, 6);
  spalny2 = sensors.getTempC(spalny2DeviceAddress);
  
  sensors.getAddress(tvodaDeviceAddress, 7);
  tvody = sensors.getTempC(tvodaDeviceAddress);

  Serial.println ();
  Serial.println ();
  Serial.print ("Temperature na ulice: ");
  Serial.println (ulica);
  Serial.println ("-------------------------");
  Serial.print ("Humidity: ");
  Serial.println (humidity, 2);
  Serial.print ("Temperature: ");
  Serial.println (temperature, 2);
  Serial.println ("-------------------------");
  Serial.print ("Temperature na vxode: ");
  Serial.println (vxod);
  Serial.print ("Temperature na kuhne: ");
  Serial.println (kuhny);
  Serial.print ("Temperature v spalne: ");
  Serial.println (spalny);
  Serial.print ("Temperature v zale: ");
  Serial.println (zal);
  Serial.print ("Temperature v hole: ");
  Serial.println (xol);
  Serial.print ("Temperature v spalne 2 etaz: ");
  Serial.println (spalny2);
  Serial.println ("-------------------------");
  Serial.print ("Average temperature: ");
  Serial.println (AverageTemp);
  Serial.println ("-------------------------");
    Serial.print ("Temperature v bake: ");
  Serial.println (tvody);
  Serial.println ("-------------------------");
}

 

в этом случае температура считывается призвольно с датчиков, если датчики например ulica и spalny  поменять местами при подключении, то датчик с  ulica будет показывать температуру в спальне.

как правильно указать, что датчик 28FFBE943C040014 - улицы, 28FF9480561403A6  - спальня и соответственно к ним обращаться?

vitalikost
Offline
Зарегистрирован: 28.11.2014
Примерно так 
DallasTemperature sensors(&oneWire);

DeviceAddress Thermometer1 = {
  0x28, 0x50, 0xEE, 0xDA, 0x05, 0x00, 0x00, 0x67 };  //28 50 EE DA 05 00 00 67
DeviceAddress Thermometer2 = {
  0x28, 0x9E, 0x95, 0xB5, 0x04, 0x00, 0x00, 0x57 };

void setup() {

  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
  sensors.setResolution(Thermometer2, 10);

  Serial.begin(9600);
}

void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {

  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);

  Serial.print("Sensor2  ");
  printTemperature(Thermometer2);
}

 

 

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

Добавить к адресу байт идентификатора.

com
Offline
Зарегистрирован: 06.09.2013

bwn пишет:

Добавить к адресу байт идентификатора.

хрень получится

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

com пишет:

bwn пишет:

Добавить к адресу байт идентификатора.

хрень получится

Если не перекидывать их местами вручную, то никакой хрени, 8 байт адрес, 9-й место нахождения. Все в EEPROM.

Araris
Offline
Зарегистрирован: 09.11.2012

ramzes.ru пишет:

как правильно указать, что датчик 28FFBE943C040014 - улицы, 28FF9480561403A6  - спальня и соответственно к ним обращаться?

1.Убираете все "именные" переменные.

2.Создаете структуру данных, или три массива "название датчика - адрес датчика - температура".

3.В цикле опрашиваете датчики.

4.В цикле выводите данные.

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

Araris пишет:

ramzes.ru пишет:

как правильно указать, что датчик 28FFBE943C040014 - улицы, 28FF9480561403A6  - спальня и соответственно к ним обращаться?

1.Убираете все "именные" переменные.

2.Создаете структуру данных, или три массива "название датчика - адрес датчика - температура".

3.В цикле опрашиваете датчики.

4.В цикле выводите данные.

Не проведете маленький ликбез про структуры, учил бейсик и фортран, по сию пору не пойму что это и как с ним работать. Благодарю.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

опрос по адресу

#include <OneWire.h>

OneWire ds (A5);
byte data[12];
byte addr1[8] = {0x28, 0x97, 0xC5, 0xD5, 0x03, 0x00, 0x00, 0xBE};
byte addr2[8] = {0x28, 0xFF, 0xFE, 0x24, 0x61, 0x04, 0x00, 0x07};
unsigned int raw;
float temp1, temp2;

void setup() {
  Serial.begin  (9600);
}

void loop(){
  temp1 = DS18B20(addr1);
  temp2 = DS18B20(addr2);
  
  Serial.print("Temp1=");
  Serial.print(temp1);
  Serial.print("\t");
  Serial.print("Temp2=");
  Serial.println(temp2);
  Serial.flush(); //очищаем значения порта
}

//==================================================================================
//                             Считывание температуры
//==================================================================================
float DS18B20(byte *adres){
  ds.reset();
  ds.select(adres);
  ds.write(0x44,1); // start conversion, with parasite power on at the end
  delay(1000);
  ds.reset();
  ds.select(adres);
  ds.write(0xBE); // Read Scratchpad
  for (byte i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read ();
  }
  raw =  (data[1] << 8) | data[0];//=======Пересчитываем в температуру
  float celsius =  (float)raw / 16.0;
  return celsius;
}

 

com
Offline
Зарегистрирован: 06.09.2013

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

ramzes.ru пишет:

в этом случае температура считывается призвольно с датчиков, если датчики например ulica и spalny  поменять местами при подключении, то датчик с  ulica будет показывать температуру в спальне.

ЭТО НЕВОЗМОЖНО!

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

bwn пишет:

Если не перекидывать их местами вручную, то никакой хрени, 8 байт адрес, 9-й место нахождения. Все в EEPROM.

не понимаю, поясните, а зачем это?

если уж возиться с eeprom (возиться или нет - отдельная тема), то, имхо, считывайте в осмысленные переменные

если, конечно, датчиков конечное количество и оно известно на стадии разработки

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

Если законченное устройство, то с EEPROM возится. Иначе после каждой замены датчика или дублирования устройства будете по новой код править. Поскольку начальное опознание идет по возрастающей адресов, то сперва считываем, а потом идентифицируем (если нет желания расставить вручную по порядку).

ramzes.ru
Offline
Зарегистрирован: 19.11.2014

vitalikost пишет:

Примерно так 
DallasTemperature sensors(&oneWire);

DeviceAddress Thermometer1 = {
  0x28, 0x50, 0xEE, 0xDA, 0x05, 0x00, 0x00, 0x67 };  //28 50 EE DA 05 00 00 67
DeviceAddress Thermometer2 = {
  0x28, 0x9E, 0x95, 0xB5, 0x04, 0x00, 0x00, 0x57 };

void setup() {

  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
  sensors.setResolution(Thermometer2, 10);

  Serial.begin(9600);
}

void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {

  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);

  Serial.print("Sensor2  ");
  printTemperature(Thermometer2);
}

в этом примере почему то переодически у датчиков проскакивает значение -127.00 как будто датчик отсутствует. С чем это может быть связано и как поправить?

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

Проверьте задержки между периодами считывания и заодно контакты

vitalikost
Offline
Зарегистрирован: 28.11.2014
Пробуй так, задержка 1 сек(1000 мсек).
void loop() {
if(millis()%1000==0) {
  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);
  Serial.print("Sensor2  ");
  printTemperature(Thermometer2);
} 
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

bwn пишет:

Не проведете маленький ликбез про структуры, учил бейсик и фортран, по сию пору не пойму что это и как с ним работать. Благодарю.

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

Araris
Offline
Зарегистрирован: 09.11.2012

vitalikost пишет:















Пробуй так, задержка 1 сек(1000 мсек).
void loop() {
if(millis()%1000==0) {
  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);
  Serial.print("Sensor2  ");
  printTemperature(Thermometer2);
} 
}

Задержка зависит от требуемой точности (см. setResolution()) и нужна между вызовом requestTemperatures() и чтением данных.

Вот значения задержки для разных Resolution:

int16_t DallasTemperature::millisToWaitForConversion(uint8_t bitResolution)
{
switch (bitResolution)
{
case 9:
return 94;
case 10:
return 188;
case 11:
return 375;
default:
return 750;
}
}

И еще там есть функция setWaitForConversion().

И еще замечу, что делать задержки по условию типа if(millis()%1000==0), конечно, красиво, но некорректно. Что будет, если программа "проскочит" момент, когда millis()%1000==0 ? Да ничего ведь не будет.

vitalikost
Offline
Зарегистрирован: 28.11.2014

можно заменить на delay(1000). Если проскочит, то на следующую секунду сделает замер. а также можно более красиво сделать 

if((millis()%1000<20) так для обработки есть окно 20 мс(Подобрано для примера). 

Lakki
Offline
Зарегистрирован: 19.02.2015

помогите разобраться с подключением. Ардуино у меня несколько дней много чего незнаю. Делаю по инструкции http://arduino-project.net/podklyuchenie-ds18b20-arduino/  и  http://nnm.me/blogs/pencraft/upravlenie-obogrevom-komnaty-pri-pomoshi-arduino-i-dallas18b20/  скачал вначале библиотеку Далас 2 дня назад подключат датчик dht22 все работает сейчас решил проверить 18b20 не пошло выходит ошибка нет Onware.h скачал эту библиотеку кинул в папку с библ перезагрузил компилирую ошибка нет библ далас.h 

 
Multiple.pde:2:31: fatal error: DallasTemperature.h: No such file or directory
compilation terminated.
Ошибка компиляции.

что делаю не так? Может в одну папку надо 2 библиотеки кинуть или ещё что? В инструкциях больше ни слова что надо еще что то делать

скачал oneware eверсию2.2 компилирую первый пример ошибка 

 
DS18x20_Temperature.pde:1:21: fatal error: OneWire.h: No such file or directory
compilation terminated.
Ошибка компиляции.
для компиляции не должно же быть разницы подключен датчик или нет? у меня пока нет ризистора 4.7КОм это не должно влиять?
попробывал тот же пример мультипле из далас. после скачки версии 2.2  ошибка опять по oneware как и выше. где скачать норм библиотеки чтоб друг с другом работали и как правиль ставить
Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Для компиляции никакого железа не надо. Куда библиотеки кидаете?

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

Если из архива распаковывали, проверьте, что нет внутри распакованной еще одной папки с таким именем.

Lakki
Offline
Зарегистрирован: 19.02.2015

Penni пишет:

Для компиляции никакого железа не надо. Куда библиотеки кидаете?

в папку libraries ардуно\програм файл. нашел библ онваре http://arduino.ru/forum/programmirovanie/fail-onewireh здесь работает но там нет примера чтоб адрес датчика определить библиотека далас с 1820 нехочет работать

Lakki
Offline
Зарегистрирован: 19.02.2015

bwn пишет:

Если из архива распаковывали, проверьте, что нет внутри распакованной еще одной папки с таким именем.

в точку. тоже думал есть разница или нет далас был папка в папке.  теперь вопрос по адресу как узнать в монииторе порта запись адрес 000000000000 все нули вобщем мож изза резистора хотя провод 10см

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

Резистор поищите какой есть, я думаю от 1К до 15К должно подойти.

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

Как это нет примера. Он вроде во всех есть - DS18x20. Там и адрес кажет.

Lakki
Offline
Зарегистрирован: 19.02.2015

bwn пишет:

Как это нет примера. Он вроде во всех есть - DS18x20. Там и адрес кажет.

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

Lakki
Offline
Зарегистрирован: 19.02.2015

опять примерно такая же фигня. Немогу разобраться почему не компилирует, долго не подходил к ардуино. чето подзабыл, что то с рабочего стала стер, что-то переместил. Сейчас удалил все скачан новую версию ардуино ide библиотеки распоковал, вроде норм не папка в папке и опять хрень какая то, ошибка вот скрины  [URL=http://radikal.ru/fp/428a71eabc254c8b8172adef280e14f1][IMG]http://i056.radikal.ru/1512/27/a43a3ec65de2t.jpg[/IMG][/URL]    [URL=http://radikal.ru/fp/0ddceac9206141499173d15a26795b19][IMG]http://s017.radikal.ru/i428/1512/5f/394862a8415dt.jpg[/IMG][/URL]

 

А ошибку выдает 

 
avr-g++: error: CreateProcess: No such file or directory
Ошибка компиляции.
 при компиляции стандартного кода DS18x20_Temperature