风筝
发表于: 昨天 17:40 | 显示全部楼层

您对以太网通信感兴趣吗?在本篇帖子中,我们将使用ENC28J60模块和Arduino开发板探索以太网通信的世界。无论您是初学者还是经验丰富的Arduino爱好者,这都将对您有所帮助。在本文中,我们将学习如何连接ENC28J60模块,并提供分步说明和要点。通过简单的说明和实际示例,我们将学习如何建立TCP/IP 连接、发送和接收数据以及使用ENC28J60模块创建我们自己的Web服务器。


所需的组件

●    Arduino Micro开发板

●    ENC28J60以太网网络模块

●    公/母跳线


ENC28J60以太网模块的引脚排列

该模块配备ENC28J60 以太网网络控制器,支持各种网络协议。由于具有SPI接口,它可以轻松与微控制器通信。该芯片的最大数据传输速度为10Mbps,足以满足许多应用的需求。该模块有10个引脚,如下图所示。

enc28j60-Pinout.jpg


使用Arduino和ENC28J60模块创建Web服务器的硬件连接

按如下所示连接各个组件,将Arduino开发板的SPI引脚连接到以太网模块的SPI引脚。

注意:ENC28J60以太网模块的电源电压必须为3.3V。更高的电压可能会烧毁芯片。

enc28j60-Wiring.jpg


Web服务器代码

在开始编写代码之前,首先从此链接下载EthernetENC库并将其安装在Arduino软件中。

现在让我们开始编写Web服务器代码。通过此代码,Arduino读取6个模拟输入并以特定格式显示在Web服务器页面上。

  1. /*
  2.   modified on OCT 23, 2023
  3.   Modified by MajidMerati from Arduino Examples
  4. */

  5. #include <SPI.h>
  6. #include <EthernetENC.h>

  7. // Enter a MAC address and IP address for your controller below.
  8. // The IP address will be dependent on your local network:
  9. byte mac[] = {
  10.   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
  11. };
  12. IPAddress ip(192, 168, 6, 101);

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

  17. void setup() {
  18.   // You can use Ethernet.init(pin) to configure the CS pin
  19.   //Ethernet.init(10);  // Most Arduino shields
  20.   //Ethernet.init(5);   // MKR ETH shield
  21.   //Ethernet.init(0);   // Teensy 2.0
  22.   //Ethernet.init(20);  // Teensy++ 2.0
  23.   //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
  24.   //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet

  25.   // Open serial communications and wait for port to open:
  26.   Serial.begin(9600);
  27.   while (!Serial) {
  28.     ; // wait for serial port to connect. Needed for native USB port only
  29.   }
  30.   Serial.println("Ethernet WebServer Example");

  31.   // start the Ethernet connection and the server:
  32.   Ethernet.begin(mac, ip);

  33.   // Check for Ethernet hardware present
  34.   if (Ethernet.hardwareStatus() == EthernetNoHardware) {
  35.     Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
  36.     while (true) {
  37.       delay(1); // do nothing, no point running without Ethernet hardware
  38.     }
  39.   }
  40.   if (Ethernet.linkStatus() == LinkOFF) {
  41.     Serial.println("Ethernet cable is not connected.");
  42.   }

  43.   // start the server
  44.   server.begin();
  45.   Serial.print("server is at ");
  46.   Serial.println(Ethernet.localIP());
  47. }


  48. void loop() {
  49.   // listen for incoming clients
  50.   EthernetClient client = server.available();
  51.   if (client) {
  52.     Serial.println("new client");
  53.     // an http request ends with a blank line
  54.     boolean currentLineIsBlank = true;
  55.     while (client.connected()) {
  56.       if (client.available()) {
  57.         char c = client.read();
  58.         Serial.write(c);
  59.         // if you've gotten to the end of the line (received a new line
  60.         // character) and the line is blank, the http request has ended,
  61.         // so you can send a reply
  62.         if (c == '\n' && currentLineIsBlank) {
  63.           // send a standard http response header
  64.           client.println("HTTP/1.1 200 OK");
  65.           client.println("Content-Type: text/html");
  66.           client.println("Connection: close");  // the connection will be closed after completion of the response
  67.           client.println("Refresh: 5");  // refresh the page automatically every 5 sec
  68.           client.println();
  69.           client.println("<!DOCTYPE HTML>");
  70.           client.println("<html>");
  71.           // output the value of each analog input pin
  72.           for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
  73.             int sensorReading = analogRead(analogChannel);
  74.             client.print("analog input ");
  75.             client.print(analogChannel);
  76.             client.print(" is ");
  77.             client.print(sensorReading);
  78.             client.println("<br />");
  79.           }
  80.           client.println("</html>");
  81.           break;
  82.         }
  83.         if (c == '\n') {
  84.           // you're starting a new line
  85.           currentLineIsBlank = true;
  86.         } else if (c != '\r') {
  87.           // you've gotten a character on the current line
  88.           currentLineIsBlank = false;
  89.         }
  90.       }
  91.     }
  92.     // give the web browser time to receive the data
  93.     delay(1);
  94.     // close the connection:
  95.     client.stop();
  96.     Serial.println("client disconnected");
  97.   }
  98. }
复制代码

代码说明

在对Arduino开发板进行编程之前,请按照以下步骤操作:

1) 在第13行输入唯一的MAC地址。

2) 在第15行写入服务器的IP地址。

3) 在第20行输入所需的端口号。

4) 如果以太网模块的CS引脚连接到Arduino SS引脚以外的引脚,请在第24行更改引脚号。此外,如果使用Arduino以外的电路板,请从第25行到第29行选择适当的CS引脚号选项。

5) 在第85行到第89行,您可以更改Web服务器上显示的文本。


完成上述步骤后,上传代码。

几秒钟后,您的Web服务器将被激活。打开浏览器软件并在URL字段中输入服务器的IP地址。此代码的默认地址是192.168.6.101。这样做之后,您将看到以下窗口。

enc28j60-Webserver-Page.jpg

如您所见,此窗口显示了6个模拟通道的输入。


现在从Arduino软件打开串口监视器窗口。 如果所有电线和LAN电缆都正确连接并且您有正确的设置,将显示以下输出。

enc28j60-result-server.jpg


以上就是使用Arduino和ENC28J60以太网模块创建本地Web服务器的全部内容,如有任何问题,可以随时在本帖下面回复。


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 707 | 回复: 1494



手机版|

GMT+8, 2024-12-19 01:35 , Processed in 0.044698 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表