скетч для управления arduino mega 2560, 16-канальным модуль-реле через ethernet
- Войдите на сайт для отправки комментариев
Вс, 05/01/2014 - 00:24
Помогите новеску!!! Нужен скетч управления arduino mega 2560, 16-канальным модуль-реле через ethernet
Сори за грамматику!!! новечку!!!
Я тут для развлечения писал скетч:
#include <SPI.h> #include <Ethernet.h> #include <SD.h> // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,0,100); #define R1 22 #define R2 23 #define R3 24 #define R4 25 /* This creates an instance of the webserver. By specifying a prefix * of "", all pages will be at the root of the server. */ #define WEBDUINO_SERVER_HEADER "Server: Test/" #define WEBDUINO_AUTH_REALM "Analog data" #define PREFIX "" #include <WebServer.h> WebServer webserver(PREFIX, 80); P(relay_form) = "<form>" "<label for=\"r1\">Relay 1</label><select name=\"r1\"><option>on</option><option>off</option></select><br>" "<label for=\"r2\">Relay 2</label><select name=\"r2\"><option>on</option><option>off</option></select><br>" "<label for=\"r3\">Relay 3</label><select name=\"r3\"><option>on</option><option>off</option></select><br>" "<label for=\"r4\">Relay 4</label><select name=\"r4\"><option>on</option><option>off</option></select><br>" "<input type=\"submit\" value=\"Set\">" "</form>" ; //CRC static PROGMEM prog_uint32_t crc_table[16] = { 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c }; unsigned long crc_update(unsigned long crc, byte data) { byte tbl_idx; tbl_idx = crc ^ (data >> (0 * 4)); crc = pgm_read_dword_near(crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4); tbl_idx = crc ^ (data >> (1 * 4)); crc = pgm_read_dword_near(crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4); return crc; } unsigned long crc32(char *s) { unsigned long crc = ~0L; while (*s) crc = crc_update(crc, *s++); crc = ~crc; return crc; } void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool) { server.httpSuccess(); if (type != WebServer::HEAD) { P(helloMsg) = "<h1>Hello, World!</h1><a href=\"private.html\">Private page</a>"; server.printP(helloMsg); server.println("<pre>"); File dataFile = SD.open("log.txt"); if (dataFile) { while (dataFile.available()) { server.print((char)dataFile.read()); } dataFile.close(); } server.println("</pre>"); } } void privateCmd(WebServer &server, WebServer::ConnectionType type, char *, bool) { /* if the user has requested this page using the following credentials * username = user * password = user * display a page saying "Hello User" * * the credentials have to be concatenated with a colon like * username:password * and encoded using Base64 - this should be done outside of your Arduino * to be easy on your resources * * in other words: "dXNlcjp1c2Vy" is the Base64 representation of "user:user" * * if you need to change the username/password dynamically please search * the web for a Base64 library */ if (server.checkCredentials("dXNlcjp1c2Vy")) { server.httpSuccess(); if (type != WebServer::HEAD) { P(helloMsg) = "<h1>Hello User</h1>"; server.printP(helloMsg); // output the value of each analog input pin for (int analogChannel = 0; analogChannel < 6; analogChannel++) { int sensorReading = analogRead(analogChannel); server.print("analog input "); server.print(analogChannel); server.print(" is "); server.print(sensorReading); server.println("<br />"); } } } /* if the user has requested this page using the following credentials * username = admin * password = admin * display a page saying "Hello Admin" * * in other words: "YWRtaW46YWRtaW4=" is the Base64 representation of "admin:admin" */ else if (server.checkCredentials("YWRtaW46YWRtaW4=")) { server.httpSuccess(); if (type != WebServer::HEAD) { P(helloMsg) = "<h1>Hello Admin</h1>"; server.printP(helloMsg); } } else { /* send a 401 error back causing the web browser to prompt the user for credentials */ server.httpUnauthorized(); } } void togle(uint8_t pin, char * state){ switch(crc32(state)){ case 0x9b629c8: case 0x9c320d6a: case 0xa75c2da2: case 0x83dcefb7: case 0xfdfc4c8d: digitalWrite(pin, LOW); break; case 0x2bbc5d43: case 0x13f11ba3: case 0xbd1b1fc9: case 0xf4dbdf21: case 0x2bcd6830: digitalWrite(pin, HIGH); break; } } uint8_t getpin(char * name){ switch(crc32(name)){ case 0xd0e09b1: case 0x988a2d13: return R1; break; case 0x9407580b: case 0x1837ca9: return R2; break; case 0xe300689d: case 0x76844c3f: return R3; break; case 0x7d64fd3e: case 0xe8e0d99c: return R4; break; } } #define NAMELEN 32 #define VALUELEN 32 void relay(WebServer &server, WebServer::ConnectionType type, char * url_tail, bool tail_complete){ URLPARAM_RESULT rc; char name[NAMELEN]; int name_len; char value[VALUELEN]; int value_len; server.httpSuccess(); switch(type){ case WebServer::HEAD: return; break; case WebServer::GET: while (strlen(url_tail)){ rc = server.nextURLparam(&url_tail, name, NAMELEN, value, VALUELEN); if (rc != URLPARAM_EOS) togle(getpin(name),value); } default: server.printP(relay_form); } } void setup() { pinMode(R1,OUTPUT); pinMode(R2,OUTPUT); pinMode(R3,OUTPUT); pinMode(R4,OUTPUT); digitalWrite(R1,HIGH); digitalWrite(R2,HIGH); digitalWrite(R3,HIGH); digitalWrite(R4,HIGH); // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.print("Initializing SD card..."); pinMode(4, OUTPUT); if (!SD.begin(4)) { Serial.println("failed!"); lcd.println("SD not found!"); }else{ Serial.println("done."); } Serial.println("Initializing Eternet!"); // start the Ethernet connection: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); // using static ip: Ethernet.begin(mac, ip); } Serial.print("server is at "); Serial.println(Ethernet.localIP()); webserver.setDefaultCommand(&defaultCmd); webserver.addCommand("index.html", &defaultCmd); webserver.addCommand("private.html", &privateCmd); webserver.addCommand("relay/", &relay); webserver.begin(); } void loop() { char buff[64]; int len = 64; /* process incoming connections one at a time forever */ webserver.processConnection(buff, &len); }на 4 канальный - до 16 сами допишите. Или за отдельную плату могу дописать.
Работает так http://192.168.0.100/relay/?r1=1&r2=0&r3=1&r4=0
Интересно!!! А сколько по цене??
Ну я думаю рублей 500. Сохранение состояния, авторизация, на 16 релюх - установка логического состояния на заданных 16 входах посредством get запроса. Вобщем цена не окончательная. Старт 300 и до 1500 в зависимости от функционала.
Для себя планирую сделать управление по таймерам каждым реле. С сохранением расписания на SD. И управлением по WEB(HTTP).
Я подготовлю техническое задание, что мне нужно!!!
Кстати управление по таймерам каждым реле. С сохранением расписания на SD. И управлением по WEB(HTTP), неплохая задумка, еще бы привязать датчик температуры DHT 11.
NeiroN напеши мне свою электронку, или скайп, есть предложение по работе!
skype:nxn_neiron?chat
Делал для себя. Ниже ссылка на видео и исходники.
http://youtu.be/KdfUfBaEKCs
https://www.dropbox.com/s/3ry17kj6coxgtvu/_WEB_server.zip
https://www.dropbox.com/s/ms415dp99yod5v5/Original%20version.zip
Классный проект. Немного отличается от видео на ютубе.
Игрался полвечера, при смене ip адреса отказался работать.
В том виде как выложено вами , кнопки не меняют своего состояния, не показывает время.
Можно попросить вас выложить именно тот проект - который на видео, и немного пояснить, что и как работает.
Видимо упаковал не ту папку для флешки. В понедельник проверю. Потерпите.
Уважаемый Dardan, Вы можно попросить вас выложить именно тот проект!
NEIRON! Добрый день! Хочется с Вами переговорить, но связь установить не удается.
Уточните пожлста логин.
NeiroN, нужна помощь в работе, предлогаю связаться в скайпе!
Добрый вечер. Вопрос наверное большей частью к NeiroN, но возможно мне еще кто нибудь поможет.
Три помощи строки:
if (server.checkCredentials("dXNlcjp1c2Vy"))
мы подключаемся к ардуине как user, если код другой, то как админ или еще много кого можно вписать. А как сделать кнопку выхода из под учетной записи??? Допустим для входа под другой учетной записью?
Вот тут предлогают отправлять клиенту 401 ответ для выхода.
P.S. Програмирование для меня хобби - так что не ждите какой либо помощи за деньги. Делаю только если мне интересно. И не нужно переносить обсуждение в ПМ - пусть все видят ваш уровень знаний.
Подскажите как запустить данный модуль программы. Не менял IP. Но в браузере пишет связ утяряна. Что я не так делаю.
Добрый день, Dardan!
С Новым Годом! С Рождеством!
Счастья, здоровья, удачи!
Вы еще занимаетесь этим проектом?
Имеются вопросы. Могли бы посоветовать? За оплату.
С уважением, alexnik100
Проектик подрос и вошёл в более крупный... http://youtu.be/OE8l9Lf4ebI
По коммерческим вопросам обращайтесь сюда - www.gms-net.ru
С Новым Годом всех....
Добрый день!
Пожалуйста. подскажите как вы запустили эту картинку с веб-сервера.
У меня не устанавливается адрес и соответственно я не могу выйти браузером на сервер.
МАС адрес также не устанавливается.
Пробовал вручную, но тоже не получается.
С уважением.
Добрый день!
Пожалуйста. подскажите как вы запустили эту картинку с веб-сервера.
У меня не устанавливается адрес и соответственно я не могу выйти браузером на сервер.
МАС адрес также не устанавливается.
Пробовал вручную, но тоже не получается.
С уважением.
Здравствуйте, Dardan!
Спасибо за поздравление.
Я пенсионер, ветеран труда, веду радиолюбительский кружок для детишек и инвалидов.
У нас своя локальная сеть. На ней учим занимающихся основам построения сетей Интернет.
У меня нет коммерческих вопросов.
Просто понравилось оформление Ваших кнопок и хотел сделать такие же для
устройства проверки связи и перезагрузки при зависаниях.
Хочется сделать подсвечивающиеся кнопки (изменяющие цвет). Пока не пойму как это сделать.
Могли бы посоветовать? Если напряженка со временем, я готов оплатить консультацию.
С уважением, alexnik100
Если Вы про последний ролик, то интерфейс построен на скриптах. Это хитрый способ, но сложен для понимания его реализации. В двух словах не скажешь.
Если Вы о старом варианте, то за давностью я уже не помню что там и как, а возиться с архивами и разбираться нет времени... Простите уж...
Если есть желание повозиться с сетями, то лучше уж взять ESP8266, а для простоты и наглядности работать под Lua. Пол часа времени в интернете и Вы сможете с легкостью запустить первые скрипты.... Ещё пару дней и изучения и 'пожените' этот модуль с ардуинкой... Получается хороший симбиоз с широкими и перспективными возможностями...
Здравствуйте, Dardan!
WI-FI роутер стоит сейчас недорого 800-1600 руб. со скоростью до 300 мбит/с, несколько входов 100 мбит/с, да и мощность у него повыше до 100 мВт, кроме того для них имеются усилители по 1-2 вт., поэтому перспектив с ESP8266 пока не вижу. С роутерами работаю уже более 10 лет.
Я в свое время изучал еще 8080 и программировал на уровне ассемблера, потом Бейсик, затем СИ, многое правда забылось, но учитывая библиотеки для ARDUINO, пока проблем нет. Проблемы были в самом начале.
По языку Lua почитаю, что нового придумали.
Я запустил Ваш скетч,
https://www.dropbox.com/s/3ry17kj6coxgtvu/_WEB_server.zip
https://www.dropbox.com/s/ms415dp99yod5v5/Original%20version.zip
Кнопки работают, реле срабатывают, но кнопки не меняют цвет.
Жалко бросать, уж очень симпатичный веб-дизайн.
Остальное нам пока без надобности.
Проверил файл Index, вроде бы там картинки правильно подставляются. Вручную когда меняешь ссылку на картинки, цвета меняются.
Сомнения вот в этой функции, она должна переключать цвет кнопок, но не переключает.
И переменные ( lineIdx, val ) непонятно откуда берутся.
Вы очень настойчивы не по делу. Не стоит использовать ( далее подтекст...
Вернуться к старому проекту возможности нет. Прошу понять правильно.... Извините помочь не могу............
Здравствуйте, Dardan!
Сегодня днем уже разместил тему в разделе ""Ищу исполнителя".
Если надумаете помочь за оплату , пишите.
С уважением, alexnik100
.