Web-сервер на Ethernet shield 28J60

В статье разобран Web сервер на ардуине с платой Ethernet shield на базе ENC28J60. Стандартный скетч примера Web сервера выводит состояние аналоговых линий платы Arduino UNO.w28_1Ранее решение подобной задачи было выполнено на стандартной плате Ethernet на чипе W5100. История, собственно, та жа, разница — в плате Ethernet контроллера. Захотелось использовать приехавшую с Алиэкспресс платку. Хороша она лишь тем, что имеет меньшие размеры, это позволяет встроить ее более органично в какую-либо законченную конструкцию… Но плата имеет большой минус — огромное количество всяческих библиотек и ни одной более-менее официальной. Беглый анализ форумов по данной теме показал довольно скептическое «народное» отношение к предмету: упоминается нестабильность (дословно — «глючность») чипа, довольно скудное описание примеров работы в качестве клиента… К тому же встречаются платы без стабилизатора напряжения, но надо иметь ввиду, что ENC28J60 работает при питании 3,3В.

Плата на 28J60 по подключению схожа с W5100. Взаимодействие Arduino с модулем осуществляется по SPI, поэтому задействованы выводы  pin 11,12,13 — последовательная шина; pin 10 — ноль при обращении к Ethernet контроллеру.

Из всех доступных в интернете библиотек выделяется UIPEthernet. Библиотека полностью совместима по функциям с стандартной Ethernet. Таким образом скетч написанный для W5100 легко адаптируется под ENC28J60 простой заменой строки

#include <Ethernet.h>

на строку

#include <UIPEthernet.h>

причем, даже подключать библиотеку SPI — не нужно. Пример скетча Web-сервера:

#include <UIPEthernet.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,1,177);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
 // Open serial communications:
  Serial.begin(9600);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // 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("Connection: close");  // the connection will be closed after completion of the response
	  client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");       
          }
          client.println("</html>");
          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();
    Serial.println("client disonnected");
  }
}

Это стандартный пример сервера из библиотеки Ethernet. Но: работает на ENC28J60 благодаря подключению соответствующей библиотеки. Пример отображает состояние всех шести аналоговых входов Arduino UNO.

 

Web-сервер на Ethernet shield 28J60: 2 комментария

Добавить комментарий