Arduino Nano + enc28j60 + физические кнопки
- Войдите на сайт для отправки комментариев
Сб, 13/01/2018 - 20:42
Использую пример Дмитрия Осипова. Он работает без физических кнопок нормально.
Хочу использовать совместно с физическими кнопками, чтобы при нажатии на физическую кнопку изменения отображались на веб странице.
У меня есть два работающих кода: только через веб сервер и только физическими кнопками.
Не получается объединить их. Думаю можно выступать клиентом и отправить запрос, как из браузера на arduino. Но очевидно это можно сделать, как то по другому.
У Дмитрия Осипова используется 8 реле, у меня всего три(плюс один оставил на всякий).
Физические кнопки с библиотекой Титановый Велосипед.
/* Дмитрий Осипов. http://www.youtube.com/user/d36073?feature=watch v.01 Управляем Arduino с Web страницы Webserver Ethernet ENC28J60 Enternet HR911105A Pin ON OF Relays. ----- Что нам понадобится: 1). ENC28J60 Ethernet LAN / Network Module. http://www.ebay.com/sch/i.html?_from=R40&_sacat=0&_nkw=ENC28J60&rt=nc&LH... 2). Библиотека / Library - "ethercard". EtherCard is a driver for the ENC28J60 chip, compatible with Arduino IDE. https://github.com/jcw/ethercard или берем здесь. https://yadi.sk/d/R57sVoglbhTRN 3). Скачать sketch. v.01 Управляем Arduino с Web страницы Webserver Ethernet ENC28J60 Enternet HR911105A Pin ON OF Relays. ----------------------- Подключаем Pins "ENC28J60 Module" к Arduino Uno. VCC - 3.3V GND - GND SCK - Pin 13 SO - Pin 12 SI - Pin 11 CS - Pin 10 Можно выбрать любой. Подключаем "ENC28J60 Module" например к Router, загружаем sketch, открываем страницу в браузере например 192.168.1.222 , на странице можем включать выключат Pins / реле. --------- Примечание: "ENC28J60 Module" питается от 3.3 volts, и потребляет по документации 250mA. Arduino Uno Максимальный допустимый ток, получаемый с 3V3 контакта — 50 мА. У меня прекрасно всё работает с 3V3 контакта Arduino Uno. На всякий случай, предупреждаю. ------------------ */ #include <EtherCard.h> // Подключаем скачанную библиотеку. https://yadi.sk/d/R57sVoglbhTRN #include <Button.h> Button apartment; // квартира // MAC Address должен быть уникальным в вашей сети. Можно менять. static byte mymac[] = { 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A }; // ip статический / постоянный Address нашей Web страницы. static byte myip[] = { 192, 168, 1, 222 }; // Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера. byte Ethernet::buffer[900]; BufferFiller bfill; // Массив задействованных номеров Pins Arduino, для управления например 8 реле. int LedPins[] = { 2, 3, 4, 5, 6, 7, 8, 9 }; // Массив для фиксации изменений. boolean PinStatus[] = { 5, 6, 7, 8 }; //------------- const char http_OK[] PROGMEM = "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n\r\n"; const char http_Found[] PROGMEM = "HTTP/1.0 302 Found\r\n" "Location: /\r\n\r\n"; const char http_Unauthorized[] PROGMEM = "HTTP/1.0 401 Unauthorized\r\n" "Content-Type: text/html\r\n\r\n" "<h1>401 Unauthorized</h1>"; //------------ // Делаем функцию для оформления нашей Web страницы. void homePage() { bfill.emit_p(PSTR("$F" "<title>Maximov's Webserver</title>" "ArduinoPIN 5: <a href=\"?ArduinoPIN5=$F\">$F</a><br />" "Temnaya: <a href=\"?ArduinoPIN6=$F\">$F</a><br />" "Koridor: <a href=\"?ArduinoPIN7=$F\">$F</a><br />" "Bathroom: <a href=\"?ArduinoPIN8=$F\">$F</a>"), http_OK, PinStatus[5] ? PSTR("off") : PSTR("on"), PinStatus[5] ? PSTR("<font color=\"green\"><b>ON</b></font>") : PSTR("<font color=\"red\">OFF</font>"), PinStatus[6] ? PSTR("off") : PSTR("on"), PinStatus[6] ? PSTR("<font color=\"green\"><b>ON</b></font>") : PSTR("<font color=\"red\">OFF</font>"), PinStatus[7] ? PSTR("off") : PSTR("on"), PinStatus[7] ? PSTR("<font color=\"green\"><b>ON</b></font>") : PSTR("<font color=\"red\">OFF</font>"), PinStatus[8] ? PSTR("off") : PSTR("on"), PinStatus[8] ? PSTR("<font color=\"green\"><b>ON</b></font>") : PSTR("<font color=\"red\">OFF</font>")); } //------------------------ void setup() { apartment.button(14, A1, A2); // button Ванна, Прихожая, Тёмная // test.button(); apartment.duration_bounce (5); apartment.duration_click_Db (250); apartment.duration_inactivity_Up(5000); apartment.duration_inactivity_Dn(1000); // test.duration_timer_Up (500); apartment.duration_press (500); pinMode(8, OUTPUT); // _________Ванна______________ pinMode(7, OUTPUT); // _________Прихожая___________ pinMode(6, OUTPUT); // _________Тёмная_____________ Serial.begin(9600); // По умолчанию в Библиотеке "ethercard" (CS-pin) = № 8. // if (ether.begin(sizeof Ethernet::buffer, mymac) == 0). // and change it to: Меняем (CS-pin) на 10. // if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0). if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0); if (!ether.dhcpSetup()); // Выводим в Serial монитор IP адрес который нам автоматический присвоил наш Router. // Динамический IP адрес, это не удобно, периодический наш IP адрес будет меняться. // Нам придётся каждый раз узнавать кой адрес у нашей страницы. ether.printIp("My Router IP: ", ether.myip); // Выводим в Serial монитор IP адрес который нам присвоил Router. // Здесь мы подменяем наш динамический IP на статический / постоянный IP Address нашей Web страницы. // Теперь не важно какой IP адрес присвоит нам Router, автоматический будем менять его, например на "192.168.1.222". ether.staticSetup(myip); ether.printIp("My SET IP: ", ether.myip); // Выводим в Serial монитор статический IP адрес. //----- for (int i = 0; i <= 8; i++) { pinMode(LedPins[i], OUTPUT); PinStatus[i] = false; } } // -------------------------------------- void loop() { delay(1); // Дёргаем микроконтроллер. //Работаем с кнопками apartment.read(); if (apartment.event_click_Dn (0) == 1) { !PinStatus[8]; digitalWrite(8, !digitalRead(8)); bfill.emit_p(http_Found); } //Если кнопка нажата инвертируем значение (ванна) if (apartment.event_click_Dn(1) == 1) { digitalWrite(7, !digitalRead(7)); //Если кнопка нажата инвертируем значение (прихожая !PinStatus[7]; bfill.emit_p(http_Found); } if (apartment.event_click_Dn(2) == 1) { !PinStatus[6]; digitalWrite(6, !digitalRead(6)); //Если кнопка нажата инвертируем значение (тёмная) bfill.emit_p(http_Found); } word len = ether.packetReceive(); // check for ethernet packet / проверить ethernet пакеты. word pos = ether.packetLoop(len); // check for tcp packet / проверить TCP пакеты. if (pos) { bfill = ether.tcpOffset(); char *data = (char *) Ethernet::buffer + pos; if (strncmp("GET /", data, 5) != 0) { bfill.emit_p(http_Unauthorized); } else { data += 5; if (data[0] == ' ') { homePage(); // Return home page Если обнаружено изменения на станице, запускаем функцию. for (int i = 0; i <= 7; i++)digitalWrite(LedPins[i], PinStatus[i + 1]); } // "16" = количество символов "?ArduinoPIN1=on ". else if (strncmp("?ArduinoPIN5=on ", data, 16) == 0) { PinStatus[5] = true; bfill.emit_p(http_Found); } else if (strncmp("?ArduinoPIN6=on ", data, 16) == 0) { PinStatus[6] = true; bfill.emit_p(http_Found); } else if (strncmp("?ArduinoPIN7=on ", data, 16) == 0) { PinStatus[7] = true; bfill.emit_p(http_Found); } else if (strncmp("?ArduinoPIN8=on ", data, 16) == 0) { PinStatus[8] = true; bfill.emit_p(http_Found); } //------------------------------------------------------ else if (strncmp("?ArduinoPIN5=off ", data, 17) == 0) { PinStatus[5] = false; bfill.emit_p(http_Found); } else if (strncmp("?ArduinoPIN6=off ", data, 17) == 0) { PinStatus[6] = false; bfill.emit_p(http_Found); } else if (strncmp("?ArduinoPIN7=off ", data, 17) == 0) { PinStatus[7] = false; bfill.emit_p(http_Found); } else if (strncmp("?ArduinoPIN8=off ", data, 17) == 0) { PinStatus[8] = false; bfill.emit_p(http_Found); } //--------------------------- else { // Page not found bfill.emit_p(http_Unauthorized); } } ether.httpServerReply(bfill.position()); // send http response } }
Использую пример Дмитрия Осипова.
Физические кнопки с библиотекой Титановый Велосипед.
Ну, так а чего здесь вопросы задаём? Спрашивай у Осипова и Клапауция.