Официальный сайт компании Arduino по адресу arduino.cc
многорелейный мультиTермостат на шине 1-wire
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Приветствую зашедших
Обыскался примеры термостатов на 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(); //очищаем значения порта } }
пишем для датчиков адреса, для реле переменные - и городим мультиТермостат.
Честно говоря - мне не понятно почему последнее время все упорно стали использовать "чистый OneWire". Ведь даже в его примерах работы с DS18B20 указывается что "всю эта черновую работу за вас может сделать "dallas temperature control library". Тем более что размер скетча явно еще не заставляет нас "байты выжимать".
В строках 83-97 - у вас фигурные скобки расставлены "очень вычурно". Трудно понять какая к чему относится. Плохо код отформатирован.
Строки 91-94 - можно заменить одной строкой:
Но... что с заменой что без. Когда разница будет близка к нулю. Из-за небольшого шума датчика и малейших колебаний у вас может возникнуть неприятный эффект. Когда релешка начнет щелкать слишком часто. Именно потому что температура стоит "прямо на границе" и колеблется "очень чуть-чуть" туда/обратно.
Так что вам тут нужно две границы. Одна для "включения реле", одна "для выключения". Сделать небольшой "зазор" в котором температура может гулять не влияя на состояние реле.
Не знаю как вы искали, но термостатов на ардуине - ну фигова туча проектов. И готовых, и полу... да вот чуть больше недели назад только обсуждали Отсрочить время выполнения команды | Аппаратная платформа Arduino в очередной раз.
То что там "светодиод", а у вас "реле" - думаю не нужно объяснять что разницы "аж никакой"? ;)
"только oneWire" удобно для работы со всеми устройствами 1-wire - вытащил MAC и делай с ним что хошешь.
Имеется ввиду, что можно добавить (в моем случае) простые DS2401 и через геркон "подключать" их к сети 1-wire, тем самым получаем еще и "охранку".
И как я говорил - знать не знаю С++ и вникать в "высший пилотаж" элементарно нет и не будет времени.
В идеале можно было бы спецам наделать КУЧУ юзабельных примеров с максимально возможными функциями по каждой библиотеке. Но это вопрос к создателям arduino. Не понятна стратегия создателей - вот вам шилды, вот вам язык ардуино (урезанный С++), НО "вы ребята ЗАОДНО выучите С++ по полной, потому-что не зная его в ПОЛНОМ ОБЪЕМЕ у вас все равно НИХРЕНА ТОЛЬКОВОГО НЕ ПОЛУЧИТСЯ".
За правку кода и ссылку спасибо. Попробую усовершенствовать.
А кто вам мешает работать с 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 и т.п. - уже дает возможность, поглядывая в справочник в течении одного двух дней начать писать что-то толковое на ардуине. Только за счет того что есть "програмерская база".
Так чтов конечно итоге все упирается в ваше "знать не знаю и вникать не хочу". С таким подходом ни в одной области ничего толкового сделать не получится. Зато вы становитесь идеальной целью "впаривателей". Все эти продавцы "волшебных таблеток", которые отменяют необходимость ходить в спорт зал и проч. - все они работают на одном принципе "обещаем чудо потакая лени". Вообщем "вам не нужно прилагать усилий". В реальности - все, всегда выходит по другому.
Это мой скорый вывод, так как я только начал. Но "курочка по зернышку клюет" ;) спс
Это мой скорый вывод, так как я только начал. Но "курочка по зернышку клюет" ;) спс
А вот это уже - правильная методология :)
Денис, я согласен :). С++ для избранных. Ну и... А что делать нам, у которых всего стандартный набор хромосом?! Забить! Где-то валялось... А! Вот. Чем не средство?
Денис, я согласен :). С++ для избранных. Ну и... А что делать нам, у которых всего стандартный набор хромосом?! Забить! Где-то валялось... А! Вот. Чем не средство?
Да фигня это все. Все равно это все те же "переменные/циклы/if-ы". Все равно в голове - строишь тот же самый алгоритм. Разница только в "форме записи". Картинки банально на экране больше места занимают. Для простенького примерчика - да "вроде наглядно". А когда что-то "чуть больше чем мигаем диодом" - превращается в АД.
Сколько уж таких попыток было "визуальных языков". И... кроме красивой маркетинговой "мишуры", типа "вам не нужно знать програмирование" - ничего. Пара "демонстрационный примеров". Потому что... все равно нужно :(
А тому кто может придумать алгоритм - как правило проще написать
if(A==B) чем из тулбокса тащить блок и в него же вписывать все это. А потом еще и линии проводить.
Вообщем много было попыток. Но визуального языка общего назначения - пока не придумали.
Их ниша - узкие предметные области.
Когда у нас есть несколько конкретных сущностей. Есть два/три вида правил. И главное у нас есть несколько экспертов-не-програмистов. Которым нужно описать много однотипных правил в привычной им форме.
Но это будет именно "специализированный язык". "Язык описания схем подключения датчиков", "язык расчета процентов по кредиту" и т.п. Как только мы попробуем сделать "визуальный язык общего назначения" - у нас получится монстр неудобный и требующий програмерского мышления.
Вообщем "язык общего назначения"=="думать как програмер".
Так что - не тратте время на Дракон, Modkit и т.п.
Толк от всего этого может быть только в области Предметно-ориентированный язык программирования — Википедия
С++ тяжелый язык? Есть решение!
хреновый пример... и термостат хреновый.... нада с каждого датчика адреса выяснять. какой где. подключая их по очереди.. а если один навернулся то шило мочало начинай с начала... потом условия прописывать по которым реле открывать. короче безсмысленая реализация :(
хреновый пример... и термостат хреновый.... нада с каждого датчика адреса выяснять. какой где. подключая их по очереди.. а если один навернулся то шило мочало начинай с начала... потом условия прописывать по которым реле открывать. короче безсмысленая реализация :(
а что они - наворачиваются? 8)
и насколько часто они у вас наворачиваются???
нарыл сей источник книг по С++
а что они - наворачиваются? 8)
и насколько часто они у вас наворачиваются???
бывает как навернутся на трубу и все. сливай воду суши весла :)