многорелейный мультиTермостат на шине 1-wire

denis999
Offline
Зарегистрирован: 16.04.2013

Приветствую зашедших

 

Обыскался примеры термостатов на ds18b20 совместно с реле, в итоге - Х..!!!(сам в шоке - столько времени arduino - и тут такой облом). И решил я тогда таки "докопатся до истины".

Результатом получилось мое первое рабочее устройство, так что - что вышло то вышло 8). Жду (честно) негатив по тому как я испоганил рабочий демокод.

УДАЛОСЬ таки забубенить мультитермостат только лишь на одной библиотеке OneWare.h и и датчиках DS18b20(+релюхи). Нужен был для единого центра автоматической поддержки нужной температуры в разных комнатах от обогревателей.

Датчиков можно много , а вот реле - в зависимости от девайса: до 10 на NANO до х.з. на MEGA

В коде разберетесь так же как и я (высматривал примеры из сети).

#include <OneWire.h>
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float porog = 22;
float celsius;
int relePin =  8;
byte  address_1[] = {0x28, 0x00, 0x99, 0x9A, 0x04, 0x00, 0x00, 0x3E};
byte  address_2[] = {0x28, 0x00, 0x99, 0x9A, 0x04, 0x01, 0x00, 0x3F};


OneWire ds (2); // все OneWire устройства на pin 2
byte done[8];

void setup  (void) {
  
  pinMode(relePin, OUTPUT);
  
  Serial.begin  (9600);
}

void reeds (void) {


  if  (ds.search  (addr)!=1) {
    ds.reset_search  ();
    delay  (250);
    for(byte i = 0; i < 8; i++) addr[i] = 0;
    return;
  }
  ds.reset  ();
  ds.select  (addr);

//***расскоментировать, чтобы показывал MAC-адреса устройств вместе с температурой***
//  Serial.println("----------");
//  Serial.print("Addr:");
//  for(byte i = 0; i < 8; i++)
//{
//  Serial.print("0x");
//  if(addr[i] < 0x10) Serial.print("0");
//  Serial.print(addr[i], HEX);
//  if(i == 7) Serial.println();
//  else Serial.print(", ");
//}

  ds.write  (0x44,1); // start conversion, with parasite power on at the end

  delay  (1000); // maybe 750ms is enough, maybe not
  // we might do a ds.depower  () here, but the reset will take care of it.

  present = ds.reset  ();
  ds.select  (addr);
  ds.write  (0xBE); // Read Scratchpad

  for  (i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read ();
  }

  // convert the data to actual temperature
  unsigned int raw =  (data[1] << 8) | data[0];
  if  (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if  (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else {
    byte cfg =  (data[4] & 0x60);
    if  (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
    else if  (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if  (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  }

  celsius =  (float)raw / 16.0;   
}

void loop (void) {
  float raznica = porog - celsius;
  
  reeds();
  if (!memcmp(address_1, addr, 8)) {
    // 28190C040074
    Serial.print  ("Inside: ");
    Serial.print  (celsius);
    Serial.print  (" ");
    Serial.println  (raznica);
    Serial.flush(); //очищаем значения порта
  
    if (raznica < 0) {digitalWrite(relePin,HIGH);
         }
    else {
  digitalWrite(relePin,LOW);
         }  

  }
  if (!memcmp(address_2, addr, 8)) {
    // 28564C04003A
    Serial.print  ("Temperature_2 = ");
    Serial.println  (celsius);
    Serial.flush(); //очищаем значения порта
  }

}

пишем для датчиков адреса, для реле переменные - и городим мультиТермостат.

 

leshak
Offline
Зарегистрирован: 29.09.2011

Честно говоря - мне не понятно почему последнее время все упорно стали использовать "чистый OneWire". Ведь даже в его примерах работы с DS18B20 указывается что "всю эта черновую работу за вас может сделать "dallas temperature control library". Тем более что размер скетча явно еще не заставляет нас "байты выжимать".

В строках 83-97 - у вас фигурные скобки расставлены "очень вычурно". Трудно понять какая к чему относится. Плохо код отформатирован.

Строки 91-94 - можно заменить одной строкой:

diitalWrite(relePin,raznica<0);

Но... что с заменой что без. Когда разница будет близка к нулю. Из-за небольшого шума датчика и малейших колебаний у вас может возникнуть неприятный эффект. Когда релешка начнет щелкать слишком часто. Именно потому что температура стоит "прямо на границе" и колеблется "очень чуть-чуть" туда/обратно.

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

Не знаю как вы искали, но термостатов на ардуине - ну фигова туча проектов. И готовых, и полу... да вот чуть больше недели назад только обсуждали Отсрочить время выполнения команды | Аппаратная платформа Arduino в очередной раз.

То что там "светодиод", а у вас "реле" - думаю не нужно объяснять что разницы "аж никакой"?  ;)

denis999
Offline
Зарегистрирован: 16.04.2013

"только oneWire" удобно для работы со всеми устройствами 1-wire - вытащил MAC и делай с ним что хошешь.

Имеется ввиду, что можно добавить (в моем случае) простые DS2401 и через геркон "подключать" их к сети 1-wire, тем самым получаем еще и "охранку". 

И как я говорил - знать не знаю С++ и вникать в "высший пилотаж" элементарно нет и не будет времени.

В идеале можно было бы спецам наделать КУЧУ юзабельных примеров с максимально возможными функциями по каждой библиотеке. Но это вопрос к создателям arduino. Не понятна стратегия создателей - вот вам шилды, вот вам язык ардуино (урезанный С++), НО "вы ребята ЗАОДНО выучите С++ по полной, потому-что не зная его в ПОЛНОМ ОБЪЕМЕ у вас все равно НИХРЕНА ТОЛЬКОВОГО НЕ ПОЛУЧИТСЯ".

За правку кода и ссылку спасибо. Попробую усовершенствовать.

leshak
Offline
Зарегистрирован: 29.09.2011

А кто вам мешает работать с DS2401 при использовании DallasControlLibrary? Ничего. OneWrite - по прежнему доступна. Разница только в том, что всю низкоуровневаю работу с DS18B20 вы сами в скетче с нуля пишите или просто взяли уже готовый кусок кода. Разница только где вся эта "червновая работа" расположилась. В библиотеке или в вашем коде.

Где вы усмотрели "высший пилотаж" - тоже не понятно. То что HIGH/LOW, TRUE/FALSE и 1/0 - как бы не секрет Константы | Аппаратная платформа Arduino

Так что мы использовали всего два элементарных факта: любое булевское выражение,  а  (raznica<0) - это пример такое выражения, - возвращает TRUE/FALSE, которые в свою очередь являются синонимами HIGH/LOW

>В идеале можно было бы спецам наделать КУЧУ юзабельных примеров с максимально возможными функциями по каждой библиотеке. 

Вы не поверите, но есть КУЧА юзабельных примеров http://playground.arduino.cc/ и http://playground.arduino.cc//Main/TutorialList

Каждая библиотека, как правило, содержит от пары штук до десятка примеров.

То что нет всех возможных комбинаций библиотек и ситуаций? Ну извините. Вспомните комбинаторику и подумайте сколько возможных сочетаний можно придумать. Поэтому - вам даются "базовые кубики" а дальше уж думайте как их комбинировать.

То что нужно "учить C++", ну... извините. Заниматся програмированием не имея базовых представлений. Что такое цикл/переменная/массив/константа - это нужно быть большим оптимистом. Ну подумайте сами - если бы без этого можно было обойтись, то был бы вообще нужен C++. Если бы было такое "волшебное средство" которое позволяет програмировать не зная програмирования, то разве программисты, как крайне ленивые существа, не были бы в первых рядах его использовния? Да они бы первыми кричали "C++ - в топку".

А в ПОЛНОМ ОБЪЕМЕ - не нужно его знать. Вообще человек знающий его в ПОЛНОМ ОБЪЕМЕ это очень редкая птица. Для ардуины - достаточно "базового". Вообщем-то знание любого другого языка Java/C#/PHP и т.п. - уже дает возможность, поглядывая в справочник в течении одного двух дней начать писать что-то толковое на ардуине. Только за счет того что есть "програмерская база".

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

denis999
Offline
Зарегистрирован: 16.04.2013

Это мой скорый вывод, так как я только начал. Но "курочка по зернышку клюет" ;) спс

 

leshak
Offline
Зарегистрирован: 29.09.2011

denis999 пишет:

Это мой скорый вывод, так как я только начал. Но "курочка по зернышку клюет" ;) спс

 

А вот это уже - правильная методология :)

paf
Offline
Зарегистрирован: 25.01.2013

Денис, я согласен :). С++ для избранных. Ну и... А что делать нам, у которых всего стандартный набор хромосом?!  Забить! Где-то валялось... А! Вот. Чем не средство?  

leshak
Offline
Зарегистрирован: 29.09.2011

paf пишет:

Денис, я согласен :). С++ для избранных. Ну и... А что делать нам, у которых всего стандартный набор хромосом?!  Забить! Где-то валялось... А! Вот. Чем не средство?  

Да фигня это все. Все равно это все те же "переменные/циклы/if-ы". Все равно в голове - строишь тот же самый алгоритм. Разница только в "форме записи". Картинки банально на экране больше места занимают. Для простенького примерчика - да "вроде наглядно". А когда что-то "чуть больше чем мигаем диодом" - превращается в АД.

Сколько уж таких попыток было "визуальных языков". И... кроме красивой маркетинговой "мишуры", типа "вам не нужно знать програмирование" - ничего. Пара "демонстрационный примеров". Потому что... все равно нужно :(

А тому кто может придумать алгоритм - как правило проще написать

if(A==B) чем из тулбокса тащить блок и в него же вписывать все это. А потом еще и линии проводить.

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

Когда у нас есть несколько конкретных сущностей. Есть два/три вида правил. И главное у нас есть несколько экспертов-не-програмистов. Которым нужно описать много однотипных правил в привычной им форме.

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

Вообщем "язык общего назначения"=="думать как програмер".

Так что - не тратте время на Дракон, Modkit и т.п.

Толк от всего этого может быть только в области Предметно-ориентированный язык программирования — Википедия

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

С++ тяжелый язык? Есть решение!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

denis999
Offline
Зарегистрирован: 16.04.2013

Puhlyaviy пишет:

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

а что они - наворачиваются? 8)

и насколько часто они у вас наворачиваются??? 

denis999
Offline
Зарегистрирован: 16.04.2013

нарыл сей источник книг по С++

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

denis999 пишет:

а что они - наворачиваются? 8)

и насколько часто они у вас наворачиваются??? 

бывает как навернутся на трубу и все. сливай воду суши весла :)