아두이노를 이용한 Iot환경을 구축해보려고 합니다.
본 프로젝트를 들어가기 전에 간단하게 테스트 겸 이더넷 모듈을 이용하여 LED ON or OFF를 구현해보았습니다.
아두이노에 네트워크 연결하기 위하여 ENC28J60을 사용하였다. 라이브러리는 하단의 링크에서 다운로드 가능합니다.
Github => github.com/njh/EtherCard
위의 페이지에서 "Code"를 클릭 후 "Download Zip"으로 다운이 가능합니다.
라이브러리 추가 후 회로 연결은 아래와 같이 연결하였습니다.
CS에 연결되어있는 8번 포트는 변경이 가능하며 위의 git의 readme를 읽어보면 현재 기본으로는 10번 포트로 설정되어 있습니다. 사용자가 임의로 설정하기 위해서는 코드에서 별도로 명시가 필요합니다.
#include <EtherCard.h>
static byte mac[] = { 0x90, 0x17, 0x7E, 0x00, 0x00, 0x01};
byte Ethernet::buffer[860];
BufferFiller bfill;
void setup() {
Serial.begin(57600);
Serial.println("Start to initializing...");
if (ether.begin(sizeof Ethernet::buffer, mac, 8) == 0){ // 이곳에 명시되어있는 8이 CS에 연결되는 포트번호이다.
Serial.println("Fail to getting ip address..");
}
while(!ether.dhcpSetup("LED", true));
Serial.println("Connected");
ether.printIp("IP: ", ether.myip);
pinMode(2, OUTPUT);
}
void loop() {
word pos = ether.packetLoop(ether.packetReceive());
if(pos) {
ether.httpServerReplyAck();
char* data = (char *) Ethernet::buffer + pos;
cmpCmd(data);
}
}
void goHome(){
ether.httpServerReply_with_flags(testPage(),TCP_FLAGS_ACK_V|TCP_FLAGS_FIN_V);
}
void cmpCmd(char* data){
if(strncmp("GET /0", data, 6) == 0) {
//Serial.println("ledon");
digitalWrite(2, HIGH);
goHome();
}
else if(strncmp("GET /1", data, 6) == 0){
//Serial.println("ledoff");
digitalWrite(2, LOW);
goHome();
}
}
static word testPage() {
bfill = ether.tcpOffset();
bfill.emit_p(PSTR("<!DOCTYPE html><html lang='en'><head><meta charset='UTF-8'><meta name='viewport' content='width=device-width, user-scalable=no'></head><body><a href='/0'>ledon</a> <a href='/1'>ledoff</a></body></html>"));
return bfill.position();
}
IP는 고정이 아닌 DHCP로 받아왔으며,
10번째 라인을 보면 8번 포트에 CS를 연결하기 위해 명시해놓은 것을 확인할 수 있습니다.
아두이노에 코드 업로드 후 정상적으로 IP를 받아온 것을 확인할 수 있습니다.
아두이노에 할당받은 IP로 접속하면 다음과 같은 페이지를 출력하는 것을 확인할 수 있습니다.
위의 페이지에서 LEDON을 클릭시에는 연결되어있는 LED를 켜줍니다.
LEDOFF를 클릭하면 연결되어있는 LED를 꺼줍니다.