Arduino Nano + enc28j60 + физические кнопки

saykl
Offline
Зарегистрирован: 30.07.2017

Использую пример Дмитрия Осипова. Он работает без физических кнопок нормально.

Хочу использовать совместно с физическими кнопками, чтобы при нажатии на физическую кнопку изменения отображались на веб странице.

У меня есть два работающих кода: только через веб сервер и только физическими кнопками.

Не получается объединить их. Думаю можно выступать клиентом и отправить запрос, как из браузера на 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
  }
}





 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

saykl пишет:

Использую пример Дмитрия Осипова.

Физические кнопки с библиотекой Титановый Велосипед.

Ну, так а чего здесь вопросы задаём? Спрашивай у Осипова и Клапауция.