Установка датчиков температуры

Проблемы/вопросы, связанные с запуском под различными платформами и конфигурациями.

Модератор: immortal

Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Установка датчиков температуры

Сообщение Alex » Чт май 31, 2012 9:22 pm

Ну вот, отлично! Теперь есть от чего отталкиваться и с чем экспериментировать. Спасибо.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Установка датчиков температуры

Сообщение Alex » Пт июн 01, 2012 3:57 pm

Ок. Код работает и действительно показывает температуру с двух датчиков на одном входе Arduino. Очень здорово! Но есть небольшие проблемки. Вернее были. :)

Во-первых, если потерялась связь с датчиком, то код начинает выдавать одинаковые значения на обоих датчиках и никак не предупреждает, о том, что один датчик отвалился. 8(). В реальной жизни это ни в какие ворота.

Во-вторых, поскольку датчики сидят на одном входе, Arduino не различает разные датчики. И, если датчик один, то он для неё всегда первый. Т. е. датчик в подвале может вдруг начать показывать температуру в гараже. Что опять же 8().

Обе проблемы в новом коде устранены. Корректно отрабатывается вынимание датчиков во время работы и они жёстко привязаны к своему номеру. Т. е. физический датчик 1 всегда в системе виден, как Sensor 1.

В новом коде могут быть ошибки. Он писался "лишь бы заставить работать".Желательно, что бы его посмотрел кто-то, кто в этом понимает. Но у меня всё работает корректно.

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

#include <DallasTemperature.h>
#include <OneWire.h>
#include <math.h>

//Уникальные внутренние адреса имеющихся датчиков
byte mytempDat1 [] = {40, 240, 72, 81, 3, 0, 0}; 
byte mytempDat2 [] = {40, 221, 16, 81, 3, 0, 0};

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempSensor1, tempSensor2;

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

  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
    else Serial.println("OFF");
  oneWire.reset_search();

  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  sensors.getAddress(tempSensor1, 0);
  sensors.getAddress(tempSensor2, 1);
  oneWire.reset_search();
  delay(1000);
}

void loop() {
   sensors.requestTemperatures();
   
  // -------------------------------------------------- Temp Sensor 1 
  
  float current_temp1 = 0;
 
  /* 
  //Если раскомментировать, то покажет внутренний номер датчика #1
  for(byte i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(tempSensor1[i]); // в DEC
    //Serial.print(tempSensor1[i], HEX); // или в HEX
  }
  */
  
  if (tempSensor1[1] == mytempDat1[1] && tempSensor1[2] == mytempDat1[2] && tempSensor1[3] == mytempDat1[3]) {
    current_temp1 = sensors.getTempC(tempSensor1); // получаем температуру
    if (current_temp1 != -127) { 
      Serial.println("Sensor 1:");
      Serial.println(current_temp1);
      } else {
        Serial.println("Sensor 1:");
        Serial.println("removed"); // вынули датчик
        }
  } else {
    Serial.println("Sensor 1:");
    Serial.println("not present"); // нет датчика
  }    
    
  // -------------------------------------------------- Temp Sensor 2
  
  float current_temp2 = 0;
 
  if (tempSensor2[1] == mytempDat2[1] && tempSensor2[2] == mytempDat2[2] && tempSensor2[3] == mytempDat2[3]) {
    current_temp2 = sensors.getTempC(tempSensor2); // получаем температуру
 
    if (current_temp2 != -127) {
      Serial.println("Sensor 2:");
      Serial.println(current_temp2);
      } else {
        Serial.println("Sensor 2:");
        Serial.println("removed"); // вынули датчик
        }
 
  } else {
    Serial.println("Sensor 2:");
    Serial.println("not present"); // нет датчика
  }
  Serial.println("------------------------- end of cycle");
  delay(5000);
}
shurlin
Сообщения: 39
Зарегистрирован: Вс апр 22, 2012 3:18 pm
Благодарил (а): 0
Поблагодарили: 4 раза

Re: Установка датчиков температуры

Сообщение shurlin » Сб июн 02, 2012 12:23 pm

О, спасибо!

А то руки не доходили код почистить и проверить его на shockproof :)
На днях внесу его в полный код и посмотрю на предмет косяков.

А вообще я сколянюсь к мысли что термодатчики через Ардуину пользовать не особо интересно, тк есть возможность подключать их по сети OneWire. Правда для нее нужен адаптер и чуть более сложное подключение самих датчиков.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Установка датчиков температуры

Сообщение Alex » Сб июн 02, 2012 2:39 pm

Небольшое замечание. Тестировалось вынимание датчиков на ходу, но не тестировалось подключение во время работы. Датчики в макетной плате и я побоялся пожечь всё при подключении.

А датчики будем подключать везде, где это можно сделать :). А если серьёзно, то можно подключать, можно не подключать, но иметь такую возможность (отлаженный код и практический опыт) не плохо.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Установка датчиков температуры

Сообщение Alex » Чт июн 21, 2012 8:18 am

Столкнулся со странной ситуацией. Было 2 датчика DS18B20, которые нормально работали в схеме с паразитным питанием. Купил ещё 3 датчика. Новые датчики нормально работают по одиночке. Но! При попытке включить 2 или больше датчиков из новой партии пишет "no parasite mode" или один из датчиков "not present". Всё бы ничего, но в том же месте старые датчики работают без проблем. Вата фак?! Все три новых датчика дохлые? Как-то маловероятно. Тем более, что по одиночке они работают. Или в чём может быть дело?
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Установка датчиков температуры

Сообщение Alex » Чт июн 21, 2012 3:08 pm

Разобрался. Почему-то важен порядок перечисления

byte mytempDat1 [] = {40...
byte mytempDat2 [] = {40...
byte mytempDat3 [] = {40...
byte mytempDat4 [] = {40...
byte mytempDat5 [] = {40...

какой s/n 1, какой 2 и т. д. Методом тыка расставил в правильном порядке... и всё заработало!
Panchez
Сообщения: 99
Зарегистрирован: Вс апр 29, 2012 7:31 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Установка датчиков температуры

Сообщение Panchez » Чт июн 21, 2012 4:56 pm

При паразитном питании термометров погрешность около 1-1.5 градуса, лучше использовать нормальное питание.
С уважением
Александр.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Установка датчиков температуры

Сообщение Alex » Чт июн 21, 2012 9:43 pm

Погрешность в один градус. Показывает он 27 или 28 градусов — для домашнего применения без разницы. По крайней мере для меня. А вот минусы у нормального питания существенные:

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

во-вторых, при нормальном питании каждый датчик занимает отдельную ногу Arduino. А так все датчики висят на одной ноге;

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

Так что...
Panchez
Сообщения: 99
Зарегистрирован: Вс апр 29, 2012 7:31 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Установка датчиков температуры

Сообщение Panchez » Сб июн 23, 2012 12:13 am

Если с Ардуиной, то согласен. У меня все датчики на 1-Wire сети, поэтому проблем с проводами нет.
С уважением
Александр.
sochkasov
Сообщения: 21
Зарегистрирован: Ср июл 25, 2012 4:15 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Установка датчиков температуры

Сообщение sochkasov » Пт авг 17, 2012 7:56 am

во-вторых, при нормальном питании каждый датчик занимает отдельную ногу Arduino. А так все датчики висят на одной ноге;
мне кажется Вы ошибаетесь. Вполне возможно использовать 1-wire на 1 ноге Arduino, используя при этом стандартную библиотеку OneWire.h (http://www.pjrc.com/teensy/td_libs_OneWire.html), а для получения данных температуры DallasTemperature.h (http://milesburton.com/index.php?title= ... ol_Library)
в третьих, при паразитном питании датчики можно вешать гирляндой в сочетании со звездой, что очень удобно, а при нормальном питании — только звездой.
Тут могу ошибаться я сам, но по информации, которую мне удалось насобирать, получается что при нормальном питании топология - шина. Если конечно не рассматривать подключение 2-3 датчиков на расстоянии в несколько метров. Очень рекомендую посмотреть статью http://mk90.blogspot.com/2011/04/1-wire.html

И вот у меня какой вопрос. Может я чего не понимаю, но почему нельзя использовать Arduino как шлюз между сетью 1-wire из датчиков DS18B(S)20 или других устройств и собственно управляющим компьютером? В данном случае получаем много преимуществ. Как одно из них - на 1 ногу ардуины можно повесить до 32 датчиков, что хорошо если нужно получить топологию звезда из шин :) ). И ведь код для Arduino, который занимается поиском всех датчиков на шине есть (в примерах к библиотеке), код для считывания нужных датчикой тоже есть. Для заполнения справочника датчиков (в базе) можно обратится по Ethernet например специально сформированным GET-ом к Arduino, он выдаст в ответ серийники и температуру датчиков, которые он нашел. А потом как вариант можно такими же вызовами получать как информацию с нужного датчика так и сразу со всех, в зависимости от того, что нужно.

И вот еще хорошая статья http://www.elin.ru/files/pdf/1-Wire/app148ru_p.pdf
Ответить