В статье разобран Web сервер на ардуине с платой Ethernet shield на базе ENC28J60. Стандартный скетч примера Web сервера выводит состояние аналоговых линий платы Arduino UNO.Ранее решение подобной задачи было выполнено на стандартной плате 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.
Статья оказалась полезной.
Спасибо!!!