ESP32는 WiFi를 내장 하고 있어서 UDP통신을 구현 할수 있지만 일반 MCU로 사용한다고 해도 충분히 사용하기 편리하고 저렴해서 해서 여러 용도로 적용하면 좋을것 같다.
W5500 을 이용하여 이더넷으로 ADC값의 그래프를 표시 하는 프로젝트에 적용해 보았다.
ESP32를 이용한 W5500초기화코드
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include "local_config.h" // <--- Change settings for YOUR network here.
// A UDP instance to let us send and receive packets over UDP.
EthernetUDP Udp;
void prt_hwval(uint8_t refval) {
switch (refval) {
case 0:
Serial.println("No hardware detected.");
break;
case 1:
Serial.println("WizNet W5100 detected.");
break;
case 2:
Serial.println("WizNet W5200 detected.");
break;
case 3:
Serial.println("WizNet W5500 detected.");
break;
default:
Serial.println
("UNKNOWN - Update espnow_gw.ino to match Ethernet.h");
}
}
void prt_ethval(uint8_t refval) {
switch (refval) {
case 0:
Serial.println("Uknown status.");
break;
case 1:
Serial.println("Link flagged as UP.");
break;
case 2:
Serial.println("Link flagged as DOWN. Check cable connection.");
break;
default:
Serial.println
("UNKNOWN - Update espnow_gw.ino to match Ethernet.h");
}
}
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("\n\tUDP NTP Client v3.0\r\n");
// Use Ethernet.init(pin) to configure the CS pin.
Ethernet.init(13);
//WizReset();
Serial.println("Starting ETHERNET connection...");
Ethernet.begin(eth_MAC, eth_IP, eth_DNS, eth_GW, eth_MASK);
delay(200);
Serial.print("Ethernet IP is: ");
Serial.println(Ethernet.localIP());
Serial.print("Checking connection.");
bool rdy_flag = false;
for (uint8_t i = 0; i <= 20; i++) {
if ((Ethernet.hardwareStatus() == EthernetNoHardware)
|| (Ethernet.linkStatus() == LinkOFF)) {
Serial.print(".");
rdy_flag = false;
delay(80);
} else {
rdy_flag = true;
break;
}
}
if (rdy_flag == false) {
Serial.println
("\n\r\tHardware fault, or cable problem... cannot continue.");
Serial.print("Hardware Status: ");
prt_hwval(Ethernet.hardwareStatus());
Serial.print(" Cable Status: ");
prt_ethval(Ethernet.linkStatus());
while (true) {
delay(10); // Halt.
}
} else {
Serial.println(" OK");
}
Udp.begin(localPort);
}
ESP32에서 W5500을 이용하여 UDP로 ADC값을 전송하는 코드
void loop() {
char str_buf[32];
int sensorValue = analogRead(A0);
sprintf(str_buf, "%d\r\n", sensorValue);
Serial.print(str_buf);
Udp.beginPacket("192.168.1.129", 3000);
Udp.write(str_buf, strlen(str_buf));
Udp.endPacket();
delay(100);
}
UDP로 전송된 데이터는 PC에서 수신후 그래프에 출력하도록 했다.
PC프로그램은 기존에 C#으로 작성해 두었던 UDP Graph 출력 프로램을 사용 했다.
반응형