Arduino Mega Server

Модератор: Alex

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

Re: Arduino Mega Server

Сообщение Alex » Ср сен 02, 2015 2:42 pm

как написать сценарий: допустим утро - аключился свет, нажал на кнопку - закрылись шторы. Просто в скетче?
Я пока не разбирался, но по логике вещей должна быть возможность сравнивать время в библиотеке Тайм. Ну а дальше — выполняем любое действие. Можно даже напрячься и сделать управление временем срабатывания с веб-странички.

С кнопкой еще проще — нужно просто её физически подключить к какому-либо пину и отслеживать её состояние.

А управление шторами — через электронный ключ и с любого пина.

Сложность в том, что всё это (по-отдельности не очень сложное) нужно делать и программировать самому (поскольку готового шаблона нет и двух молодцов из ларца тоже нет).

В будущем, возможно, будет сервис, в котором вы сможете заказать разработку нужных вам функций и конфигураций.
Gnomych
Сообщения: 5
Зарегистрирован: Пт авг 28, 2015 10:55 am
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение Gnomych » Ср сен 02, 2015 7:06 pm

Gorien писал(а): Ещё бы часы подключить, но об этом уже кто-то говорил.
Прилагаю свой проект, пока там все "локально" ибо с сервером не разобрался,
но принцип получения я думаю понятен. Там и время, и работа с датчиками.
Работу с датчиками и вообще с инетом взял из примера к книге Петин В. "Проекты с использованием контроллера Arduino". Скетч примера добавляю, но скажу сразу. Если подойти чисто по книге, то придется долго вкуривать почему не работат. Автор не утруждает себя изложением нюансов кода как то регистрация всех адресов датчика в массиве, типа само собой разумеется. Но это "Бог ему судья", мне книга так или иначе помогла.
Скетч к главе 14 " Сетевой обмен с помощью Arduino"
СпойлерПоказать
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <Wire.h>
#include <BMP085.h>

BMP085 dps = BMP085();
long Temperature085 = 0, Pressure085 = 0, Altitude085 = 0;

#include "DHT.h"

#define DHTTYPE DHT11 // DHT 11
DHT dht(8, DHTTYPE);

OneWire ds(7); // on pin 7

byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
byte ip[] = { 192, 168, 1, 111 };
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };

EthernetServer server(10001);



byte my_addr[3][8] = {{0x28, 0xFF, 0xE6, 0x2E, 0x64, 0x14, 2, 0x3B},
{0x28, 0xFF, 0xB6, 0x4A, 0x64, 0x14, 1, 0xD2},
{0x28, 0xFF, 0x95, 0x14, 0x64, 0x14, 1, 0xA9}
};

void setup() {
Serial.begin(9600);
Serial.println("start");
// start the Ethernet connection and the server:
// инициализация Ethernet shield
//Ethernet.begin(mac, ip, gateway, subnet);
Ethernet.begin(mac, ip);
// запуск сервера
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());

Wire.begin();
delay(1000);
dps.init();
//dps.init(MODE_ULTRA_HIGHRES,69400,true);

}


void loop ()
{

/**/
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//client.print("Web-server Arduino-Nano-328 <br> ");
//client.print("DFRduino Ethernet-Shield V 2.0 <br>");
//client.print("<br>");
client.print('{');
client.print('"');client.print("meteo");client.print('"');client.println(":");
client.print('{');

for (byte thisByte = 0; thisByte < 4; thisByte++) {
//client.print(Ethernet.localIP()[thisByte], DEC);
//client.print(".");
}
//client.print("<br><br>");


//client.print("Показания счетчиков температуры: <br>");
//client.print("temperatura: <br>");

for(int j=1;j<4;j++)
{
Serial.print("temp");
Serial.print(j);
Serial.print("=");
int Temp=get_temp(j);
Serial.print(Temp/16);
Serial.print(".");
Serial.print(((Temp%16)*100)/16);
Serial.println();
client.print('"');client.print("temp");client.print(j);client.print('"');client.print(":");
client.print('"');client.print(Temp/16);
client.print(".");
client.print(((Temp%16)*100)/16);client.print('"');client.print(',');
}
float h = dht.readHumidity();
float t = dht.readTemperature();
//Serial.print("humidity4=");
//Serial.print(h);
//Serial.println(" %");
//Serial.print("temp4=");
//Serial.print(t);
//Serial.println(" *C");
client.print('"');client.print("temp4");client.print('"');client.print(":");
client.print('"');client.print(t);client.print('"');client.print(',');
client.print('"');client.print("humidity4");client.print('"');client.print(":");
client.print('"');client.print(h);client.print('"');
client.print(',');
//client.println("}");
//client.print("}");
// bmp085
dps.getTemperature(&Temperature085);
dps.getPressure(&Pressure085);
dps.getAltitude(&Altitude085);
//Serial.print("pressure5=");
//Serial.print(Pressure085/133.3);
//Serial.println(" %");
//Serial.print("temp5=");
//Serial.print(Temperature085*0.1);
//Serial.println(" *C");
client.print('"');client.print("temp5");client.print('"');client.print(":");
client.print('"');client.print(Temperature085*0.1);client.print('"');client.print(',');
client.print('"');client.print("pressure5");client.print('"');client.print(":");
client.print('"');client.print(Pressure085/133.3);client.print('"');
client.println("}");
client.print("}");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}/**/
}
// получение тмпературы датчика
int get_temp(int nn)
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int Temp;
/*
if ( !ds.search(addr)) {
//Serial.print("No more addresses.\n");
ds.reset_search();
return 0;
}
Serial.print("R="); //R=28 Not sure what this is
for( i = 0; i < 8; i++) {
Serial.print(addr, HEX);
Serial.print(" ");
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return 0;
}
if ( addr[0] != 0x28) {
Serial.print("Device is not a DS18S20 family device.\n");
return 0;
}
*/
ds.reset();
ds.select(my_addr[nn-1]);
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(my_addr[nn-1]);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data = ds.read();
}
Temp=(data[1]<<8)+data[0];//take the two bytes from the response relating to temperature

Temp=Temp;//divide by 16 to get pure celcius readout

return Temp;
}

byte my_addr[3][8] - это и есть тот массив который меня вверг в замешательство. В книге ни слова ни пол слова. Потом догнал, что и к чему, что и реализовал в последней версии. (Думаю это коряво до нельзя, нужно делать идентификаторы помещений и им присваивать адреса датчиков. Хотя как присвоить в данном проекте идентификатор "тумбочке" когда она ни как не связана с электроникой. Думаю это вопрос распределения функций между многими контроллерами.) Короче если датчик один то вопросов вообще нет а если на шине их порядка 20-ти, тогда нужно рассматривать ни только программный вопрос но и чисто технический в реализации и пуско-наладке (навешивание резисторов и подбор их сопротивлений).
В дальнейшем мною рассматривается вопрос по синхронизации времени с инетом и RTC на базе DS 1307 от "Мастер Кит" (модуль МР1095, нафига я так дорого покупал не знаю, хотел внукам угодить, но САМ увяз по самое не могу). Пока изучаю в инете данный вопрос, уже есть определенное видение вопроса, думаю что в ближайшие выходные все реализую в коде.
Не бейте сильно я только учусь.
Вложения
meteo_0_1_1.zip
(4.26 КБ) 158 скачиваний
Gnomych
Сообщения: 5
Зарегистрирован: Пт авг 28, 2015 10:55 am
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение Gnomych » Ср сен 02, 2015 7:11 pm

Alex писал(а):
как написать сценарий: допустим утро - аключился свет, нажал на кнопку - закрылись шторы. Просто в скетче?
Я пока не разбирался,...........
Я вчера имел неосторожность копнуть в этом направлении..... Приобрел на Али комплект приемо-передатчика на 433 МГц, думаю именно это малой кровью по возможностям Arduino решит и включение света и разные схемы и шторы в том числе.
arturmon82
Сообщения: 28
Зарегистрирован: Сб июн 06, 2015 6:04 pm
Благодарил (а): 9 раз
Поблагодарили: 3 раза

Re: Arduino Mega Server

Сообщение arturmon82 » Ср сен 02, 2015 8:11 pm

Возьмите за стандарт с сайта mysensors. Org там уже все за нас придумали, в частности какой датчик имеет id. Там правда про беспроводный обмен но думаю идею можно оттуда подчерпнуть.

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

Re: Arduino Mega Server

Сообщение Alex » Ср сен 02, 2015 9:09 pm

Подсистемы
Вложения
subsys.png
Подсистемы
subsys.png (25.68 КБ) 14514 просмотров
Gnomych
Сообщения: 5
Зарегистрирован: Пт авг 28, 2015 10:55 am
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение Gnomych » Ср сен 02, 2015 9:37 pm

arturmon82 писал(а):Возьмите за стандарт с сайта mysensors. Org там уже все за нас придумали, в частности какой датчик имеет id. Там правда про беспроводный обмен но думаю идею можно оттуда подчерпнуть.
Ни все так просто. Вопрос стоит о адаптации того что уже есть у народа, кто то свет включает с пульта,
кто то шторы и т.д. Насколько я понял что если канал не кодирован проблем нет, а вот если кодирован
то там предстоит повозиться и "общей" таблетки нет. Т.е. каждому придется ковырять свое железо дабы
достичь успеха самостоятельно при поддержке сообщества.
Да, там есть много наработок, но как правило они узконаправлены и как общая идеология не годятся.
Из всего прочитанного сегодня я понял, что самый верный способ, сканировать передатчик гаджета и
эмулировать его сигналы.
Дождусь посылки обязательно отпишусь по этому поводу.
У меня пока только одна люстра включается с пульта TechLiCo на две зоны, ею и буду управлять.
Если кому интересно можете почитать следующие статьи для ознакомления

http://cxem.net/arduino/arduino119.php

http://asio5.ru/?p=125

Вот эта на мой взгляд самая содержательная ссылка, по крайней мере описана библиотека
https://www.pjrc.com/teensy/td_libs_VirtualWire.html

Именно опираясь на нее собираюсь делать код под свои нужды.
До этой статьи меня больше всего смущало что используются 11 и 12 выводы, которые в нашем
случае задействованы под Ethernet. Именно последняя статья внесла ясность, что выход, есть
но он не однозначен и есть ограничения по использованию PWM(ШИМ) выходов с приемо-передатчиками на 433 МГц. Все завязано на потороха контроллера и использованием Timer1. Думаю для совместного
использования Ethernet Sheeld и приемо-передатчика на 433 МГц придется не мало попотеть.
Надо читать Datasheet на ATmega328 и разбираться с таймерами у меня пока времени на это нет.
arturmon82
Сообщения: 28
Зарегистрирован: Сб июн 06, 2015 6:04 pm
Благодарил (а): 9 раз
Поблагодарили: 3 раза

Re: Arduino Mega Server

Сообщение arturmon82 » Чт сен 03, 2015 2:17 am

Gnomych писал(а):
arturmon82 писал(а):Возьмите за стандарт с сайта mysensors. Org там уже все за нас придумали, в частности какой датчик имеет id. Там правда про беспроводный обмен но думаю идею можно оттуда подчерпнуть.
Ни все так просто. Вопрос стоит о адаптации того что уже есть у народа, кто то свет включает с пульта,
кто то шторы и т.д. Насколько я понял что если канал не кодирован проблем нет, а вот если кодирован
то там предстоит повозиться и "общей" таблетки нет. Т.е. каждому придется ковырять свое железо дабы
достичь успеха самостоятельно при поддержке сообщества.
Да, там есть много наработок, но как правило они узконаправлены и как общая идеология не годятся.
Из всего прочитанного сегодня я понял, что самый верный способ, сканировать передатчик гаджета и
эмулировать его сигналы.
Дождусь посылки обязательно отпишусь по этому поводу.
У меня пока только одна люстра включается с пульта TechLiCo на две зоны, ею и буду управлять.
Если кому интересно можете почитать следующие статьи для ознакомления

http://cxem.net/arduino/arduino119.php

http://asio5.ru/?p=125

Вот эта на мой взгляд самая содержательная ссылка, по крайней мере описана библиотека
https://www.pjrc.com/teensy/td_libs_VirtualWire.html

Именно опираясь на нее собираюсь делать код под свои нужды.
До этой статьи меня больше всего смущало что используются 11 и 12 выводы, которые в нашем
случае задействованы под Ethernet. Именно последняя статья внесла ясность, что выход, есть
но он не однозначен и есть ограничения по использованию PWM(ШИМ) выходов с приемо-передатчиками на 433 МГц. Все завязано на потороха контроллера и использованием Timer1. Думаю для совместного
использования Ethernet Sheeld и приемо-передатчика на 433 МГц придется не мало попотеть.
Надо читать Datasheet на ATmega328 и разбираться с таймерами у меня пока времени на это нет.
Хотите свой велосипед по изобретать? Изображение удачи! Я вам не зря про май сенсор писал, там и для вас есть клиент для 433 приёмника. А так я имел ввиду, что надо посмотреть структуру либо и выдернуть из неё работу с разными датчиками. Заменить беспроводную часть на проводную и прикрутить вебку,получится законченный стандарт. И не придётся писать у каждого свои "виртуальные" названия датчиков, а будут стандартные виды датчиков.

Отправлено с моего P780 через Tapatalk
Gorien
Сообщения: 4
Зарегистрирован: Ср сен 02, 2015 12:10 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение Gorien » Чт сен 03, 2015 6:11 am

arturmon82 писал(а):Хотите свой велосипед по изобретать? Изображение удачи!
Воу, воу, воу...

Мой вопрос взаимодействия датчиков не в том что куда подключить какие датчики и какие механизмы использовать, а именно во взаимодействии. Было бы очень здорово если бы был встроен, прямо в скетч простой язык, понятный всем, с помощью которого можно было писать сценарии управления.
Pavel15
Сообщения: 1
Зарегистрирован: Чт сен 03, 2015 9:41 am
Благодарил (а): 0
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение Pavel15 » Чт сен 03, 2015 10:03 am

Gorien писал(а): Мой вопрос взаимодействия датчиков не в том что куда подключить какие датчики и какие механизмы использовать, а именно во взаимодействии. Было бы очень здорово если бы был встроен, прямо в скетч простой язык, понятный всем, с помощью которого можно было писать сценарии управления.
Реализацию логики можно почерпнуть с проекта:
Программируемый логический контроллер (ПЛК) на базе Arduino mega2560 + Ethernet shield
http://robocraft.ru/blog/3126.html

Цитата:
...контроллер исполнительных устройств с некоторой степенью автоматизации и настраиваемый полностью через web интерфейс. Логика работы контроллера хранится в файле на SD карте, а не в коде, что позволяет очень просто модифицировать логику работы, без изменения кода и перепрошивки контроллера....

Что умеет получившийся контроллер.
1. Ручной режим управления выходами, реализованный через WEB интерфейс (Включить/Выключить/Подать импульс).
2. Задержку включения после подачи питания. Если установлена задержка включения, то логические правила для этого выхода не действуют и реле управляется только в ручном режиме.
3. Управление выходами с помощью логических правил, в которых можно использовать любые типы датчиков, логические операции NOT/AND/OR и скобки. В формулах используются ID датчиков, которые также настраиваются через WEB интерфейс. Например, можно написать такую формулу (0|1)&!2. Для приведения значения аналоговых датчиков к логическому значению используются два граничных значения для обеспечения гистерезиса. Если значение больше или равно верхнему граничному значению, то значению сигнала будет true, а если меньше или равно нижнему, то false. Для всех датчиков возможно использовать инверсию значения. Например, при подключении кнопки, если она не нажата, на входе будет логическая 1 (true), а при инвертировании сигнала true будет обрабатываться при нажатой кнопке, т.е. при логическом 0 на входе.
Smishel
Сообщения: 4
Зарегистрирован: Пт авг 28, 2015 6:11 am
Благодарил (а): 0
Поблагодарили: 0

А кто-нибудь смог запустить AMS на Arduino DUE?

Сообщение Smishel » Пт сен 04, 2015 10:01 am

А кто-нибудь смог запустить AMS на Arduino DUE?
Ответить