положение крана можно приблизительно выставлять в заданное положение ( измерив время хода от закрыт до открыт ) импульсом питания определённой длительности.... ( в теории, а на практике придётся импульсом 6 сек ( если полный ход 6 сек ) гарантированно закрыть кран, потом подав импульс на 3 сек считать, что кран в среднем положении, открыть на 0,75 - 6 сек для закрытия, 4 сек на открытие... кататак :) ( проходное сечение крана от угла поворота штока-шара - НЕ линейная зависимость )
повторюсь - один кран нарушает циркуляцию, циркнасос работает зря, "слабые" места под угрозой разморозки....
два крана по схеме трёхходового крана - обеспечат ПОСТОЯННУЮ ЦИРКУЛЯЦИЮ
Слишком примитивно. Циркуляция должна идти постоянно и с большим протоком, а вот горячую воду, сколько нужно, надо подмешивать в этот контур из контура котла с помощью трёхходовика, можно капиллярного, как у меня дома, а можно и электрического.
Алгоритм управления простой: Приоткрыли, подождали, померяли температуру на выходе, сравнили с надобной и приоткрыли или призакрыли.
И не покупайте 5-ти Вольтовые, куча минусов: бОльшие токи, два блока питания на 5 Вольт.
Ставьте 12-ти Вольтовые: одноамперник 12 В это совсем не проблемма, 5 Вольт из него-же стэпдауном, захотели- любой аккумулятор от сигналок 12 В 7Ач нетрудно подцепить.
Там у меня схема феншуйная и мне достаточно обычного крана с моторчиком, а не 3х-ходового. Благодарю за совет про 12-ти вольтовые вместо 5-ти! Про КПД скажу, что низкотемпературное отопление это очень хорошо, но в случае с котлом Стропува конденсат уже при 55 градусах в подаче ведрами течет и поэтому приходится 60 держать. Все на сей день прекрасно работает, но вот растопка и вывод котла в рабочий режим требует постоянного контроля, поэтому мною было решено заардуинить все нафиг. Еще огромный минус в этот процесс вносят противопожарные нормы, которые требуют, чтобы дверь в котельную была одна и с улицы только, а это значит нужно выходить в любую непогоду несколько раз для контроля и бла бла, что, согласитесь, не очень удобно... Я вот приобрел на дня "эзернет шилд W5100", для того, чтобы прям с офиса смотреть температуру и крутить серву, но никак не разберусь с кодом там... Простецкие "шилдики" из уроков Дмитрия Осипова были куда проще, но нагнулись по неизвестной причине))).
Кстати, хотел спросить: а есть здесь на форуме какой-нибудь раздельчик, в котором "тупые" вопросы по программингу можно задавать, чтобы желающие могли отвечать на них? А то вы мне уже итак здорово помогли и грузить херней никого не хочется))
Ну тут в процессе изучения у меня возникают вопросы не по теме или же косвенно ее касающие. А именно один из них: в чем разница между операторами if-else и switch-case? Из опытов я пока увидел, что switch-case не умеет работать с интервалами, но в свою очередь if-else умеет делать все то же самое, что и switch-case... Это просто дело вкуса, как, к примеру, писать float или double или же есть у каждого из них свои прелести?
Спасибо)))) Можно всю оставшуюся жизнь теперь в свободное время изучать))) А такой вопросик, если можно: в чем принципиальная разница между несколькими операторами if и if-else if-else? Она вроде как есть, но я не понял пока в чем проявляется..
Угу... Вроде понятно... Надо будет парочку опытов с лампочками поставить и все будет в ажуре думаю. Благодарю Вас! А сейчас я уже вишу час в изучении http://arduino.ua/ru/prog/Ethernet . Лишь бы башка не взорвалась))) Все ж хочется очень ардуинкой управлять с любого места)
Да, попали вы с котлом, давно читал про эти "устройства" длительного горения... Даже закладки про это чудо гдето есть...Борьба со смолами забивающими дымоход за два месяца и дёгтем вытекающем снизу.... Говорят надо топить или очень-очень сухими дровами или углёмю. И действительно нельзя допускать конденсата. А тогда какой смысл греть по полной и выбрасывать тепло в трубу?
Ссылку прочитал. В ней говорится о конденсате в дымоходе в основном, а такой проблемы у меня нет, т.к. все трубы из сендвичей. Конденсат появляется как я понял из-за "жарко" в камере сгорания и "холодно" через стенку в емкости с водой... И эта температура воды (видимо из таблицы точки росы) как раз градусов 55 где-то. Смолистыми породами стараемся не топить:-) В целом, за неимения газа (а точнее за отказ платить 500тысяч рублей за прокладку газа от трубы, что в 30метрах) вариант неплохой, но муторный.
Это я уже читал... Простая передача аналоговых значений... Теперь бы умудриться переправить (или добавить) их так, чтобы можно было светодиодикаи или релюшечкой управлять))) А для этого надо вот изучать комнды этого шилда как я понял. А вот тут http://robocraft.ru/blog/238.html у меня эксперимент удался!
Все... 50 опытов прошли полуудачно... Уже язык HTML успел немного изучить даже... Зафигачил из ссылки выше себе канал управления из 4х реле... Вот его скетч
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);
int numPins = 4;
int pins[] = { 2, 3, 4, 5 }; // Пины для реле
int pinState[] = {0, 0, 0, 0}; // Состояние пинов
void setup()
{
// Изначально выключаем все реле
for (int i = 0; i < numPins; i++)
{
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], 1);
}
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
}
void loop()
{
EthernetClient client = server.available();
if (client)
{
// Проверяем подключен ли клиент к серверу
while (client.connected())
{
// Проверяем идет ли запрос к серверу
int dataCount = client.available();
if (dataCount > 0)
{
// Считываем данные передаваемые серверу с клиента (броузера)
for (int i = 0; i < dataCount; i++)
{
char ch = client.read();
// Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P'
if (i == 0 && ch != 'P')
break;
if (ch == '\n' && i < dataCount - 1)
{
// Находим строку, в которой содержатся передаваемые данные
char chNext = client.read();
// Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
if (chNext == 'r')
{
// Выключаем все реле
pinState[0] = 0;
pinState[1] = 0;
pinState[2] = 0;
pinState[3] = 0;
// Считываем первый номер реле, который нужно включить
char relayNum = client.read();
pinState[relayNum-'0'] = 1;
Serial.write(relayNum);
// Считываем вспомогательную информацию (=on&)
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
// Пока есть данные об остальных реле, считываем и заносим в массив pinState
while (relayNum != -1)
{
relayNum = client.read();
relayNum = client.read();
pinState[relayNum-'0'] = 1;
Serial.write(relayNum);
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
}
} else
{
// Если не было передано данных, то выключаем все реле
pinState[0] = 0;
pinState[1] = 0;
pinState[2] = 0;
pinState[3] = 0;
}
}
}
}
// В соответствие с переданными данными включаем реле
for (int i = 0; i < 4; i++)
{
digitalWrite(pins[i], !pinState[i]);
}
// Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<html>");
client.println("<head>");
client.println("<title>Zelectro. Relay + Ethernet shield.</title>");
client.println("</head>");
client.println("<body>");
client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>");
client.println("<form method='post'>");
client.print("<div>Relay 1 <input type='checkbox' ");
if (pinState[0] == 1)
client.print("checked");
client.println(" name='r0'></div>");
client.print("<div>Relay 2 <input type='checkbox' ");
if (pinState[1] == 1)
client.print("checked");
client.println(" name='r1'></div>");
client.print("<div>Relay 3 <input type='checkbox' ");
if (pinState[2] == 1)
client.print("checked");
client.println(" name='r2'></div>");
client.print("<div>Relay 4 <input type='checkbox' ");
if (pinState[3] == 1)
client.print("checked");
client.println(" name='r3'></div>");
client.println("<input type='submit' value='Refresh'>");
client.println("</form>");
client.println("</body>");
client.println("</html>");
client.stop();
}
}
}
Все прекрасно работает... Но я ж так просто не сдаюсь! Мне захотелось 5ю реле самому зафигачить туда... Зафигачил, все работает, кроме одного момента: инвертированное положение для пина. Тобишь после загрузки скетча мой вновь добавленный пин принимает сразу HIGH, хотя галочку в браузере я еще не поставил. Вот код:
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);
int numPins = 5;
int pins[] = { 2, 3, 4, 5, 6}; // Пины для реле
int pinState[] = {0, 0, 0, 0, 0}; // Состояние пинов
void setup()
{
// Изначально выключаем все реле
for (int i = 0; i < numPins; i++)
{
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], 1);
}
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
}
void loop()
{
EthernetClient client = server.available();
if (client)
{
// Проверяем подключен ли клиент к серверу
while (client.connected())
{
// Проверяем идет ли запрос к серверу
int dataCount = client.available();
if (dataCount > 0)
{
// Считываем данные передаваемые серверу с клиента (броузера)
for (int i = 0; i < dataCount; i++)
{
char ch = client.read();
// Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P'
if (i == 0 && ch != 'P')
break;
if (ch == '\n' && i < dataCount -1)
{
// Находим строку, в которой содержатся передаваемые данные
char chNext = client.read();
// Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
if (chNext == 'r')
{
// Выключаем все реле
pinState[0] = 0;
pinState[1] = 0;
pinState[2] = 0;
pinState[3] = 0;
pinState[4] = 0;
// Считываем первый номер реле, который нужно включить
char relayNum = client.read();
pinState[relayNum-'0'] = 1;
Serial.write(relayNum);
// Считываем вспомогательную информацию (=on&)
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
// Пока есть данные об остальных реле, считываем и заносим в массив pinState
while (relayNum != -1)
{
relayNum = client.read();
relayNum = client.read();
pinState[relayNum-'0'] = 1;
Serial.write(relayNum);
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
}
} else
{
// Если не было передано данных, то выключаем все реле
pinState[0] = 0;
pinState[1] = 0;
pinState[2] = 0;
pinState[3] = 0;
pinState[4] = 0;
}
}
}
}
// В соответствие с переданными данными включаем реле
for (int i = 0; i < 5; i++)
{
digitalWrite(pins[i], !pinState[i]);
}
// Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<html>");
client.println("<head>");
client.println("<title>Zelectro. Relay + Ethernet shield.</title>");
client.println("</head>");
client.println("<body>");
client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>");
client.println("<form method='post'>");
client.print("<div>Rele 1 <input type='checkbox' ");
if (pinState[0] == 1)
client.print("checked");
client.println(" name='r0'></div>");
client.print("<div>Rele 2 <input type='checkbox' ");
if (pinState[1] == 1)
client.print("checked");
client.println(" name='r1'></div>");
client.print("<div>Rele 3 <input type='checkbox' ");
if (pinState[2] == 1)
client.print("checked");
client.println(" name='r2'></div>");
client.print("<div>Rele 4 <input type='checkbox' ");
if (pinState[3] == 1)
client.print("checked");
client.println(" name='r3'></div>");
client.print("<div>Rele 5 <input type='checkbox' ");
if (pinState[4] == 1)
client.print("checked");
client.println(" name='r4'></div>");
client.println("<input type='submit' value='Refresh'>");
client.println("</form>");
client.println("</body>");
client.println("</html>");
client.stop();
}
}
}
Про чекбокс не догнал)) Я понял, что чекбокс это просто галочка... Радио - точка ну и т.п... У меня проблема в том, что мой пин со старта сразу HIGH принимает.. Как сделать, чтоб он как все был?
Ну если у Вас днюха, то поздравляю от всей души! И желаю, чтоб прожили долго и счастливо, ибо хороших людей надо побольше на этой планете))) А если не у Вас, то имениннику того же))) Завтра выхожу на работу из отпуска и начинаю закладывать провода под ардуинку к котлу))
Про чекбокс не догнал)) Я понял, что чекбокс это просто галочка... Радио - точка ну и т.п... У меня проблема в том, что мой пин со старта сразу HIGH принимает.. Как сделать, чтоб он как все был?
Ну если у Вас днюха, то поздравляю от всей души! И желаю, чтоб прожили долго и счастливо, ибо хороших людей надо побольше на этой планете))) А если не у Вас, то имениннику того же))) Завтра выхожу на работу из отпуска и начинаю закладывать провода под ардуинку к котлу))
Сделал. Только после этого галочки в браузере стало нельзя ставить толпой и там вообще хаос начался))) Диод на 6 пине горит со старта один фиг. заливал это:
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);
int numPins = 5;
int pins[] = { 2, 3, 4, 5, 6}; // Пины для реле
int pinState[] = {0, 0, 0, 0, 0}; // Состояние пинов
void setup()
{
// Изначально выключаем все реле
for (byte i = 2; i < (numPins + 2); i++)
{
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], 1);
}
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
}
void loop()
{
EthernetClient client = server.available();
if (client)
{
// Проверяем подключен ли клиент к серверу
while (client.connected())
{
// Проверяем идет ли запрос к серверу
int dataCount = client.available();
if (dataCount > 0)
{
// Считываем данные передаваемые серверу с клиента (броузера)
for (int i = 0; i < dataCount; i++)
{
char ch = client.read();
// Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P'
if (i == 0 && ch != 'P')
break;
if (ch == '\n' && i < dataCount - 1)
{
// Находим строку, в которой содержатся передаваемые данные
char chNext = client.read();
// Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
if (chNext == 'r')
{
// Выключаем все реле
pinState[0] = 0;
pinState[1] = 0;
pinState[2] = 0;
pinState[3] = 0;
pinState[4] = 0;
// Считываем первый номер реле, который нужно включить
char relayNum = client.read();
pinState[relayNum-'0'] = 1;
Serial.write(relayNum);
// Считываем вспомогательную информацию (=on&)
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
// Пока есть данные об остальных реле, считываем и заносим в массив pinState
while (relayNum != -1)
{
relayNum = client.read();
relayNum = client.read();
pinState[relayNum-'0'] = 1;
Serial.write(relayNum);
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
}
} else
{
// Если не было передано данных, то выключаем все реле
pinState[0] = 0;
pinState[1] = 0;
pinState[2] = 0;
pinState[3] = 0;
pinState[4] = 0;
}
}
}
}
// В соответствие с переданными данными включаем реле
for (int i = 0; i < 5; i++)
{
digitalWrite(pins[i], !pinState[i]);
}
// Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<html>");
client.println("<head>");
client.println("<title>Zelectro. Relay + Ethernet shield.</title>");
client.println("</head>");
client.println("<body>");
client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>");
client.println("<form method='post'>");
client.print("<div>Relay 1 <input type='checkbox' ");
if (pinState[0] == 1)
client.print("checked");
client.println(" name='r0'></div>");
client.print("<div>Relay 2 <input type='checkbox' ");
if (pinState[1] == 1)
client.print("checked");
client.println(" name='r1'></div>");
client.print("<div>Relay 4 <input type='checkbox' ");
if (pinState[2] == 1)
client.print("checked");
client.println(" name='r2'></div>");
client.print("<div>Relay 5 <input type='checkbox' ");
if (pinState[3] == 1)
client.print("checked");
client.println(" name='r3'></div>");
client.print("<div>Relay 3 <input type='checkbox' ");
if (pinState[4] == 1)
client.print("checked");
client.println(" name='r4'></div>");
client.println("<input type='submit' value='Refresh'>");
client.println("</form>");
client.println("</body>");
client.println("</html>");
client.stop();
}
}
}
А вот теперь я крепко подвис... Ситуация следующая.. Залил скетч этот же самый, только подправленный на 8 реле отсюда http://pastebin.com/2NjEgcEf с небольшими корректировками по ип и отображением названий в браузере... Работает все как оказалось идеально, но объясните мне такой факт: почему подключая в одном и том же состоянии пина реле и светодиод к нему получаем, что реле-разомкнуто, а светодиод-горит! Получается все пины стоят HIGH, а реле работает, когда на пинах LOW? Я слышал что-то про реле, управляемых положительным и отрицательным потенциалом....
Неудобств нет))) Было отсутствие знаний по этому делу и я весь мозг сломал почему у меня инвертированное значение пина... А оказывается все прекрасно!))) Сегодня заказал себе на али 8-ми модульное реле и 2 ENC Ethernet модуля - будет праздник!) Спасибо Вам в очередной раз! А, кстати, у Вас есть опыт подключения/работы с GSM модулем?
вот я сегодня - сам себе праздник, а вам нужно сделать код приёма в браузер значения хотя бы 6-ти аналоговых пинов И управления по 8-ми каналам :)
Вас, кстати, с наступившим! Это вееерно... Аналоговые пины.... Тут в стандартной библиотеке есть пример, который значения аналоовых портов передает... Думаю, несколько часов скрежета зубами по граниту дадут хоть какой то результат!))
положение крана можно приблизительно выставлять в заданное положение ( измерив время хода от закрыт до открыт ) импульсом питания определённой длительности.... ( в теории, а на практике придётся импульсом 6 сек ( если полный ход 6 сек ) гарантированно закрыть кран, потом подав импульс на 3 сек считать, что кран в среднем положении, открыть на 0,75 - 6 сек для закрытия, 4 сек на открытие... кататак :) ( проходное сечение крана от угла поворота штока-шара - НЕ линейная зависимость )
повторюсь - один кран нарушает циркуляцию, циркнасос работает зря, "слабые" места под угрозой разморозки....
два крана по схеме трёхходового крана - обеспечат ПОСТОЯННУЮ ЦИРКУЛЯЦИЮ
http://ru.aliexpress.com/item/T25-B3-C-quality-5VDC-electric-three-way-v...
Слишком примитивно. Циркуляция должна идти постоянно и с большим протоком, а вот горячую воду, сколько нужно, надо подмешивать в этот контур из контура котла с помощью трёхходовика, можно капиллярного, как у меня дома, а можно и электрического.
Алгоритм управления простой: Приоткрыли, подождали, померяли температуру на выходе, сравнили с надобной и приоткрыли или призакрыли.
И не покупайте 5-ти Вольтовые, куча минусов: бОльшие токи, два блока питания на 5 Вольт.
Ставьте 12-ти Вольтовые: одноамперник 12 В это совсем не проблемма, 5 Вольт из него-же стэпдауном, захотели- любой аккумулятор от сигналок 12 В 7Ач нетрудно подцепить.
и я про тоже - циркуляция или мимо котла, или через котёл - в зависимости от t обратки или от t воздуха в помещении
ссылку дал просто для картинки, а автоматику лучше да, на 12 V ( или на 24 V - смотря какие комплектующие )
Там у меня схема феншуйная и мне достаточно обычного крана с моторчиком, а не 3х-ходового. Благодарю за совет про 12-ти вольтовые вместо 5-ти! Про КПД скажу, что низкотемпературное отопление это очень хорошо, но в случае с котлом Стропува конденсат уже при 55 градусах в подаче ведрами течет и поэтому приходится 60 держать. Все на сей день прекрасно работает, но вот растопка и вывод котла в рабочий режим требует постоянного контроля, поэтому мною было решено заардуинить все нафиг. Еще огромный минус в этот процесс вносят противопожарные нормы, которые требуют, чтобы дверь в котельную была одна и с улицы только, а это значит нужно выходить в любую непогоду несколько раз для контроля и бла бла, что, согласитесь, не очень удобно... Я вот приобрел на дня "эзернет шилд W5100", для того, чтобы прям с офиса смотреть температуру и крутить серву, но никак не разберусь с кодом там... Простецкие "шилдики" из уроков Дмитрия Осипова были куда проще, но нагнулись по неизвестной причине))).
Кстати, хотел спросить: а есть здесь на форуме какой-нибудь раздельчик, в котором "тупые" вопросы по программингу можно задавать, чтобы желающие могли отвечать на них? А то вы мне уже итак здорово помогли и грузить херней никого не хочется))
есть, но лучше уже здесь всё спрашивать - уже прикормлено, задача и ваш уровень известны - так лучше, чем плодить кучу тем :)
Ну тут в процессе изучения у меня возникают вопросы не по теме или же косвенно ее касающие. А именно один из них: в чем разница между операторами if-else и switch-case? Из опытов я пока увидел, что switch-case не умеет работать с интервалами, но в свою очередь if-else умеет делать все то же самое, что и switch-case... Это просто дело вкуса, как, к примеру, писать float или double или же есть у каждого из них свои прелести?
Тип double поддерживается в Arduino для совместимости кода с другими платформами.
у if в скобках выражение должно быть типа boolean - true или false , 0 или 1 ( 2,3,1000,65535 - это всё воспримется как 1 )
у switch - перечислимый тип данных byte, int, объявленные как enum
несколько if могут заменить switch , наоборот - нет
....добавлено
пригодится :) http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/main.htm#13
у if-else - два исхода , у switch-case - сколько сможете case прописать
Спасибо)))) Можно всю оставшуюся жизнь теперь в свободное время изучать))) А такой вопросик, если можно: в чем принципиальная разница между несколькими операторами if и if-else if-else? Она вроде как есть, но я не понял пока в чем проявляется..
из ифа два пути, а если надо больше ? на три -
иф1 вых1
эльзе1
иф2 вых2
эльзе2 вых3
иф2 со своим эльзе2 - встроен в эльзе1
в эльзе2 снова можно вставить очередной иф - выходов будет 4, ифами можно построить и более сложные алгоритмы анализа - лишь не запутаться :)
Угу... Вроде понятно... Надо будет парочку опытов с лампочками поставить и все будет в ажуре думаю. Благодарю Вас! А сейчас я уже вишу час в изучении http://arduino.ua/ru/prog/Ethernet . Лишь бы башка не взорвалась))) Все ж хочется очень ардуинкой управлять с любого места)
при хорошо написанной программе ОНА должна управлять всем, её нужно только контролировать....
ищите готовый пример браузер-W5100-ардуина - по нему и изучайте, просто изучать W5100 - точно взорвётесь :)
http://habrahabr.ru/post/230661/
Похоже уже взорвался... Висок заболел.. Хреново изучать все с нулевым знанием языка Си..
вот попроще - передача в браузер 6-ти значений с аналоговых выходов, управления ардуиной здесь не прописано
http://arduino.cc/en/Tutorial/WebServer
Да, попали вы с котлом, давно читал про эти "устройства" длительного горения... Даже закладки про это чудо гдето есть...Борьба со смолами забивающими дымоход за два месяца и дёгтем вытекающем снизу.... Говорят надо топить или очень-очень сухими дровами или углёмю. И действительно нельзя допускать конденсата. А тогда какой смысл греть по полной и выбрасывать тепло в трубу?
Нашёл закладку. Познавательный форум. Почитайте http://forum.vashdom.ru/threads/pech-bulerjan-problema-s-kondensatom-kak...
Ссылку прочитал. В ней говорится о конденсате в дымоходе в основном, а такой проблемы у меня нет, т.к. все трубы из сендвичей. Конденсат появляется как я понял из-за "жарко" в камере сгорания и "холодно" через стенку в емкости с водой... И эта температура воды (видимо из таблицы точки росы) как раз градусов 55 где-то. Смолистыми породами стараемся не топить:-) В целом, за неимения газа (а точнее за отказ платить 500тысяч рублей за прокладку газа от трубы, что в 30метрах) вариант неплохой, но муторный.
вот попроще - передача в браузер 6-ти значений с аналоговых выходов, управления ардуиной здесь не прописано
http://arduino.cc/en/Tutorial/WebServer
Это я уже читал... Простая передача аналоговых значений... Теперь бы умудриться переправить (или добавить) их так, чтобы можно было светодиодикаи или релюшечкой управлять))) А для этого надо вот изучать комнды этого шилда как я понял. А вот тут http://robocraft.ru/blog/238.html у меня эксперимент удался!
ну, вот канал управления http://zelectro.cc/Ethernet_shield_W5100
ну, вот канал управления http://zelectro.cc/Ethernet_shield_W5100
Воо. Огромное спасибо в очередной раз!)) Это уже вещь! Теперь можно сравнив несколько таких скетчей вычислить где там и что править))
Все... 50 опытов прошли полуудачно... Уже язык HTML успел немного изучить даже... Зафигачил из ссылки выше себе канал управления из 4х реле... Вот его скетч
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2) EthernetServer server(80); int numPins = 4; int pins[] = { 2, 3, 4, 5 }; // Пины для реле int pinState[] = {0, 0, 0, 0}; // Состояние пинов void setup() { // Изначально выключаем все реле for (int i = 0; i < numPins; i++) { pinMode(pins[i], OUTPUT); digitalWrite(pins[i], 1); } Serial.begin(9600); Ethernet.begin(mac, ip); server.begin(); } void loop() { EthernetClient client = server.available(); if (client) { // Проверяем подключен ли клиент к серверу while (client.connected()) { // Проверяем идет ли запрос к серверу int dataCount = client.available(); if (dataCount > 0) { // Считываем данные передаваемые серверу с клиента (броузера) for (int i = 0; i < dataCount; i++) { char ch = client.read(); // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P' if (i == 0 && ch != 'P') break; if (ch == '\n' && i < dataCount - 1) { // Находим строку, в которой содержатся передаваемые данные char chNext = client.read(); // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле) if (chNext == 'r') { // Выключаем все реле pinState[0] = 0; pinState[1] = 0; pinState[2] = 0; pinState[3] = 0; // Считываем первый номер реле, который нужно включить char relayNum = client.read(); pinState[relayNum-'0'] = 1; Serial.write(relayNum); // Считываем вспомогательную информацию (=on&) relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); // Пока есть данные об остальных реле, считываем и заносим в массив pinState while (relayNum != -1) { relayNum = client.read(); relayNum = client.read(); pinState[relayNum-'0'] = 1; Serial.write(relayNum); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); } } else { // Если не было передано данных, то выключаем все реле pinState[0] = 0; pinState[1] = 0; pinState[2] = 0; pinState[3] = 0; } } } } // В соответствие с переданными данными включаем реле for (int i = 0; i < 4; i++) { digitalWrite(pins[i], !pinState[i]); } // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<html>"); client.println("<head>"); client.println("<title>Zelectro. Relay + Ethernet shield.</title>"); client.println("</head>"); client.println("<body>"); client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>"); client.println("<form method='post'>"); client.print("<div>Relay 1 <input type='checkbox' "); if (pinState[0] == 1) client.print("checked"); client.println(" name='r0'></div>"); client.print("<div>Relay 2 <input type='checkbox' "); if (pinState[1] == 1) client.print("checked"); client.println(" name='r1'></div>"); client.print("<div>Relay 3 <input type='checkbox' "); if (pinState[2] == 1) client.print("checked"); client.println(" name='r2'></div>"); client.print("<div>Relay 4 <input type='checkbox' "); if (pinState[3] == 1) client.print("checked"); client.println(" name='r3'></div>"); client.println("<input type='submit' value='Refresh'>"); client.println("</form>"); client.println("</body>"); client.println("</html>"); client.stop(); } } }Все прекрасно работает... Но я ж так просто не сдаюсь! Мне захотелось 5ю реле самому зафигачить туда... Зафигачил, все работает, кроме одного момента: инвертированное положение для пина. Тобишь после загрузки скетча мой вновь добавленный пин принимает сразу HIGH, хотя галочку в браузере я еще не поставил. Вот код:
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2) EthernetServer server(80); int numPins = 5; int pins[] = { 2, 3, 4, 5, 6}; // Пины для реле int pinState[] = {0, 0, 0, 0, 0}; // Состояние пинов void setup() { // Изначально выключаем все реле for (int i = 0; i < numPins; i++) { pinMode(pins[i], OUTPUT); digitalWrite(pins[i], 1); } Serial.begin(9600); Ethernet.begin(mac, ip); server.begin(); } void loop() { EthernetClient client = server.available(); if (client) { // Проверяем подключен ли клиент к серверу while (client.connected()) { // Проверяем идет ли запрос к серверу int dataCount = client.available(); if (dataCount > 0) { // Считываем данные передаваемые серверу с клиента (броузера) for (int i = 0; i < dataCount; i++) { char ch = client.read(); // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P' if (i == 0 && ch != 'P') break; if (ch == '\n' && i < dataCount -1) { // Находим строку, в которой содержатся передаваемые данные char chNext = client.read(); // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле) if (chNext == 'r') { // Выключаем все реле pinState[0] = 0; pinState[1] = 0; pinState[2] = 0; pinState[3] = 0; pinState[4] = 0; // Считываем первый номер реле, который нужно включить char relayNum = client.read(); pinState[relayNum-'0'] = 1; Serial.write(relayNum); // Считываем вспомогательную информацию (=on&) relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); // Пока есть данные об остальных реле, считываем и заносим в массив pinState while (relayNum != -1) { relayNum = client.read(); relayNum = client.read(); pinState[relayNum-'0'] = 1; Serial.write(relayNum); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); } } else { // Если не было передано данных, то выключаем все реле pinState[0] = 0; pinState[1] = 0; pinState[2] = 0; pinState[3] = 0; pinState[4] = 0; } } } } // В соответствие с переданными данными включаем реле for (int i = 0; i < 5; i++) { digitalWrite(pins[i], !pinState[i]); } // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<html>"); client.println("<head>"); client.println("<title>Zelectro. Relay + Ethernet shield.</title>"); client.println("</head>"); client.println("<body>"); client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>"); client.println("<form method='post'>"); client.print("<div>Rele 1 <input type='checkbox' "); if (pinState[0] == 1) client.print("checked"); client.println(" name='r0'></div>"); client.print("<div>Rele 2 <input type='checkbox' "); if (pinState[1] == 1) client.print("checked"); client.println(" name='r1'></div>"); client.print("<div>Rele 3 <input type='checkbox' "); if (pinState[2] == 1) client.print("checked"); client.println(" name='r2'></div>"); client.print("<div>Rele 4 <input type='checkbox' "); if (pinState[3] == 1) client.print("checked"); client.println(" name='r3'></div>"); client.print("<div>Rele 5 <input type='checkbox' "); if (pinState[4] == 1) client.print("checked"); client.println(" name='r4'></div>"); client.println("<input type='submit' value='Refresh'>"); client.println("</form>"); client.println("</body>"); client.println("</html>"); client.stop(); } } }не забывайте про чекбокс "свернуть код" :)
дык, чо ? нрмально работает ?
Про чекбокс не догнал)) Я понял, что чекбокс это просто галочка... Радио - точка ну и т.п... У меня проблема в том, что мой пин со старта сразу HIGH принимает.. Как сделать, чтоб он как все был?
неее, анализ мине уже заказан - завтра днюха :)
при загрузке кода поставте галочку на допстранице - "свернуть" ! результат - короткое сообщение ( код свёрнут ), кому интерессно - развернут...
главные галочки в допе - свернуть и нумерация....
Ну если у Вас днюха, то поздравляю от всей души! И желаю, чтоб прожили долго и счастливо, ибо хороших людей надо побольше на этой планете))) А если не у Вас, то имениннику того же))) Завтра выхожу на работу из отпуска и начинаю закладывать провода под ардуинку к котлу))
Про чекбокс не догнал)) Я понял, что чекбокс это просто галочка... Радио - точка ну и т.п... У меня проблема в том, что мой пин со старта сразу HIGH принимает.. Как сделать, чтоб он как все был?
про чекбокс и радибуттон - можно позже ? :)
Ну если у Вас днюха, то поздравляю от всей души! И желаю, чтоб прожили долго и счастливо, ибо хороших людей надо побольше на этой планете))) А если не у Вас, то имениннику того же))) Завтра выхожу на работу из отпуска и начинаю закладывать провода под ардуинку к котлу))
спасибо ! но завтра :)
заложите проводов нужное количество х 2...3 - пригодится позжееееее
строки 8, 9, 17, 18 - пины на реле 2 3 4 5 6 - в цикле проходимся по пинам 0 1 2 3 4
for(inti = 0; i < numPins; i++) >>>>>>>>>>>>>>>>>>>>>>>>>>>>for(bytei = 2; i < (numPins + 2); i++){
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], 1);
}
всё это можно заменить на
DDRD=DDRD | B01111100;
PORTD=B01111100;
http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
блок чекбоксов - галочки можно ставить в любом порядке и количестве ( похоже на иф )
блок радиокнопок - кружочек можно поставить только один ( похоже на свич-казе )
строки 8, 9, 17, 18 - пины на реле 2 3 4 5 6 - в цикле проходимся по пинам 0 1 2 3 4
for(inti = 0; i < numPins; i++) >>>>>>>>>>>>>>>>>>>>>>>>>>>>for(bytei = 2; i < (numPins + 2); i++){
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], 1);
}
всё это можно заменить на
DDRD=DDRD | B01111100;
PORTD=B01111100;
http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
)))))) Походу это фаталити для моей головы)))
строку 70 скопируйте в 71 и 85 в 86
строку 70 скопируйте в 71 и 85 в 86
Сделал. Только после этого галочки в браузере стало нельзя ставить толпой и там вообще хаос начался))) Диод на 6 пине горит со старта один фиг. заливал это:
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2) EthernetServer server(80); int numPins = 5; int pins[] = { 2, 3, 4, 5, 6}; // Пины для реле int pinState[] = {0, 0, 0, 0, 0}; // Состояние пинов void setup() { // Изначально выключаем все реле for (byte i = 2; i < (numPins + 2); i++) { pinMode(pins[i], OUTPUT); digitalWrite(pins[i], 1); } Serial.begin(9600); Ethernet.begin(mac, ip); server.begin(); } void loop() { EthernetClient client = server.available(); if (client) { // Проверяем подключен ли клиент к серверу while (client.connected()) { // Проверяем идет ли запрос к серверу int dataCount = client.available(); if (dataCount > 0) { // Считываем данные передаваемые серверу с клиента (броузера) for (int i = 0; i < dataCount; i++) { char ch = client.read(); // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P' if (i == 0 && ch != 'P') break; if (ch == '\n' && i < dataCount - 1) { // Находим строку, в которой содержатся передаваемые данные char chNext = client.read(); // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле) if (chNext == 'r') { // Выключаем все реле pinState[0] = 0; pinState[1] = 0; pinState[2] = 0; pinState[3] = 0; pinState[4] = 0; // Считываем первый номер реле, который нужно включить char relayNum = client.read(); pinState[relayNum-'0'] = 1; Serial.write(relayNum); // Считываем вспомогательную информацию (=on&) relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); // Пока есть данные об остальных реле, считываем и заносим в массив pinState while (relayNum != -1) { relayNum = client.read(); relayNum = client.read(); pinState[relayNum-'0'] = 1; Serial.write(relayNum); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); } } else { // Если не было передано данных, то выключаем все реле pinState[0] = 0; pinState[1] = 0; pinState[2] = 0; pinState[3] = 0; pinState[4] = 0; } } } } // В соответствие с переданными данными включаем реле for (int i = 0; i < 5; i++) { digitalWrite(pins[i], !pinState[i]); } // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<html>"); client.println("<head>"); client.println("<title>Zelectro. Relay + Ethernet shield.</title>"); client.println("</head>"); client.println("<body>"); client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>"); client.println("<form method='post'>"); client.print("<div>Relay 1 <input type='checkbox' "); if (pinState[0] == 1) client.print("checked"); client.println(" name='r0'></div>"); client.print("<div>Relay 2 <input type='checkbox' "); if (pinState[1] == 1) client.print("checked"); client.println(" name='r1'></div>"); client.print("<div>Relay 4 <input type='checkbox' "); if (pinState[2] == 1) client.print("checked"); client.println(" name='r2'></div>"); client.print("<div>Relay 5 <input type='checkbox' "); if (pinState[3] == 1) client.print("checked"); client.println(" name='r3'></div>"); client.print("<div>Relay 3 <input type='checkbox' "); if (pinState[4] == 1) client.print("checked"); client.println(" name='r4'></div>"); client.println("<input type='submit' value='Refresh'>"); client.println("</form>"); client.println("</body>"); client.println("</html>"); client.stop(); } } }А вот теперь я крепко подвис... Ситуация следующая.. Залил скетч этот же самый, только подправленный на 8 реле отсюда http://pastebin.com/2NjEgcEf с небольшими корректировками по ип и отображением названий в браузере... Работает все как оказалось идеально, но объясните мне такой факт: почему подключая в одном и том же состоянии пина реле и светодиод к нему получаем, что реле-разомкнуто, а светодиод-горит! Получается все пины стоят HIGH, а реле работает, когда на пинах LOW? Я слышал что-то про реле, управляемых положительным и отрицательным потенциалом....
блоки реле +5 V с оптроном на входе управления могут управляться от 0 или от 5 - как производитель сделает
на плату подаётся GND и 5 V, третий контакт - управление.
если оптрон подключен третий пин и GND - то включается HIGHом
если оптрон подключен третий пин и 5 V- то включается LOWом
в чём неудобство-то ? если программа написана для ловных реле, а есть хигные - правим код и всё :)
Неудобств нет))) Было отсутствие знаний по этому делу и я весь мозг сломал почему у меня инвертированное значение пина... А оказывается все прекрасно!))) Сегодня заказал себе на али 8-ми модульное реле и 2 ENC Ethernet модуля - будет праздник!) Спасибо Вам в очередной раз! А, кстати, у Вас есть опыт подключения/работы с GSM модулем?
#138 - значит я не прав :)
код на 8 релюшек не зажимайте :) - ему тут место
Опачки... Не заходит.... Вот рабочий код на 8 реле:
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2) EthernetServer server(80); int numPins = 8; int pins[] = { 2, 3, 4, 5, 6, 7, 8, 9 }; // Пины для реле int pinState[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; // Состояние пинов void setup() { // Изначально выключаем все реле for (int i = 0; i < numPins; i++) { pinMode(pins[i], OUTPUT); digitalWrite(pins[i], 1); } Serial.begin(9600); Ethernet.begin(mac, ip); server.begin(); } void loop() { EthernetClient client = server.available(); if (client) { // Проверяем подключен ли клиент к серверу while (client.connected()) { // Проверяем идет ли запрос к серверу int dataCount = client.available(); if (dataCount > 0) { // Считываем данные передаваемые серверу с клиента (броузера) for (int i = 0; i < dataCount; i++) { char ch = client.read(); // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P' if (i == 0 && ch != 'P') break; if (ch == '\n' && i < dataCount - 1) { // Находим строку, в которой содержатся передаваемые данные char chNext = client.read(); // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле) if (chNext == 'r') { // Выключаем все реле pinState[0] = 0; pinState[1] = 0; pinState[2] = 0; pinState[3] = 0; pinState[4] = 0; pinState[5] = 0; pinState[6] = 0; pinState[7] = 0; // Считываем первый номер реле, который нужно включить char relayNum = client.read(); pinState[relayNum-'0'] = 1; Serial.write(relayNum); // Считываем вспомогательную информацию (=on&) relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); // Пока есть данные об остальных реле, считываем и заносим в массив pinState while (relayNum != -1) { relayNum = client.read(); relayNum = client.read(); // по логике нужно продублировать pinState[relayNum-'0'] = 1; Serial.write(relayNum); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); } } else { // Если не было передано данных, то выключаем все реле pinState[0] = 0; pinState[1] = 0; pinState[2] = 0; pinState[3] = 0; pinState[4] = 0; pinState[5] = 0; pinState[6] = 0; pinState[7] = 0; } } } } // В соответствие с переданными данными включаем реле for (int i = 0; i < 8; i++) { digitalWrite(pins[i], !pinState[i]); } // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<html>"); client.println("<head>"); client.println("<title>Zelectro. Relay + Ethernet shield.</title>"); client.println("</head>"); client.println("<body>"); client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>"); client.println("<form method='post'>"); client.print("<div>Relay 1 <input type='checkbox' "); if (pinState[0] == 1) client.print("checked"); client.println(" name='r0'></div>"); client.print("<div>Relay 2 <input type='checkbox' "); if (pinState[1] == 1) client.print("checked"); client.println(" name='r1'></div>"); client.print("<div>Relay 3 <input type='checkbox' "); if (pinState[2] == 1) client.print("checked"); client.println(" name='r2'></div>"); client.print("<div>Relay 4 <input type='checkbox' "); if (pinState[3] == 1) client.print("checked"); client.println(" name='r3'></div>"); client.print("<div>Relay 5 <input type='checkbox' "); if (pinState[4] == 1) client.print("checked"); client.println(" name='r4'></div>"); client.print("<div>Relay 6 <input type='checkbox' "); if (pinState[5] == 1) client.print("checked"); client.println(" name='r5'></div>"); client.print("<div>Rele 7 <input type='checkbox' "); if (pinState[6] == 1) client.print("checked"); client.println(" name='r6'></div>"); client.print("<div>Rele 8 <input type='checkbox' "); if (pinState[7] == 1) client.print("checked"); client.println(" name='r7'></div>"); client.println("<input type='submit' value='Refresh'>"); client.println("</form>"); client.println("</body>"); client.println("</html>"); client.stop(); } } }рано праздник вам !!!!!! :)-
вот я сегодня - сам себе праздник, а вам нужно сделать код приёма в браузер значения хотя бы 6-ти аналоговых пинов И управления по 8-ми каналам :)
ничё не понял.... на 4 - сделали, на 5 - глючит 5-ое реле, на 8 - всё отлично ? так где глючево-то пр 5-ти реле ?
рано праздник вам !!!!!! :)-
вот я сегодня - сам себе праздник, а вам нужно сделать код приёма в браузер значения хотя бы 6-ти аналоговых пинов И управления по 8-ми каналам :)
Вас, кстати, с наступившим! Это вееерно... Аналоговые пины.... Тут в стандартной библиотеке есть пример, который значения аналоовых портов передает... Думаю, несколько часов скрежета зубами по граниту дадут хоть какой то результат!))
ничё не понял.... на 4 - сделали, на 5 - глючит 5-ое реле, на 8 - всё отлично ? так где глючево-то пр 5-ти реле ?
Это я - дурак...5ым "реле" я подключил светодиод, думая, что он сигнализирует работу реле... А оказалось то наоборот))
спасибо :) далеко от Питера ? а то заходи если чо....
да, надо скрестить #117 и #144
http://arduino.ru/forum/otvlechennye-temy/kto-otkuda