본문 바로가기

ESPRESSIF/ESP32

[EXP32 xBee EVM] W5500 UDP 테스트

 

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 출력 프로램을 사용 했다.

반응형