카테고리 보관물: Arduino Study

Arduino + Ethernet module(Wiz812mj) 비닐하우스 구현 소스

// DDR(Port Data Direction Register), PORT(Port Data Register), PIN(Port Input Pin Register)
//1) DDRx : 값이 0이면 해당 핀을 입력으로 사용하고, 1로 설정하면 출력으로 사용함.
//2) PORTx : 0으로 설정하면 해당 핀의 출력이 Low이고, 1로 설정하면 High를 출력함.
// 만약 해당 포트를 입력으로 설정하고 PORT값을 1로 설정하면 내부 Pull-up이 동작합니다.
//3) PINx : 해당 포트의 상태값을 읽어옵니다. Low면 0으로 읽고, High라면 1로 읽어서 PIN 레지스터에
// 저장됩니다.
// 여기서 중요한 것은 해당 PIN레지스터는 PORT 값이 변경될때마다 새롭게 갱신되는 것이 아니라
// 사용자가 PINx의 명령을 주게 되면 그 때마다 레지스터의 값이 갱신됩니다.
//————————————————————————————————————

#define RHT01_PIN 0 // 상수 선언
#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(32, 30, 28, 26, 24, 22); // 아두이노 각 핀 LCD에 연결
int a, b, d;
int in1 = 7;
int in2 = 6;
int in3 = 5;
int in4 = 4; // DC Motor
int switchPin1 = 3;
int switchPin2 = 2; // Relay SW & Contorller DC Motor
int Pump = 36;
int Fan = 37;
int one = 1; // Blind Contoroller to Temp & Humi
int two = 3; // Pump Contorller
float temp = 0; // (실수) 소수점을 넣어 아날로그 값에 근접
float humi = 0; // 정확한 값이 요구되는 온&습도 이므로 실수로 선언
int signal[1] = {0};
int temp_st = 24;

int humi_st = 50;
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Mac Address
IPAddress ip(192,168,10,76); // Computer setting ip
EthernetServer server(46); //서버클래스 선언 포트 번호는 46 (telnet defaults to port 46)
String readString; // 받은 데이터를 저장할 String 변수
byte read_rht01_dat() // MCU와 센서간의 1-wire 방식으로 데이터를 1bit씩 주고 받음
{
byte i = 0;
byte result=0;
for(i=0; i bitwise 비트단위로 풀어 연산. while -&gt; 참이면 조건문 계속 수행
delayMicroseconds(30);
if(PINF &amp; _BV(RHT01_PIN)) // while은 1(참)일때 루프 돈다. 근데 코딩은 0이다가 1이 되면 루프 돈다. 만약 ex) if(!x 면 x가 거짓일때 실행한다.
result |=(1&lt; 입출력 핀의 방향을 결정함. (1출력 , 0입력)
//출력으로 쓸 것인지 결정
PORTF |= _BV(RHT01_PIN); // 설정된 포트에 데이터를 뿌려주는 출력용 레지스터 / 출력 핀일 경우 저장된 데이터(bit)가 외부로 출력됨.
Serial.begin(9600); // 아두이노 시리얼 활성화 9600 bps

Serial.println("Ready"); //
delay(1000);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Ethernet.begin(mac, ip); // initial
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());

}
void loop() {
// Ethernet Code, 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()) { // 반복문에 클라이언트 접속되면 참이므로 if로 넘어가고 조건문에서 클라이언트 접속되면 {} 실행
char c = client.read(); // 문자를 읽음(1 byte)
if (readString.length() X와 Y는 같지 않다. W1=0의 문자열을 찾고 안되면 -1 출력
signal[1] = 0;
}
else if(readString.indexOf("W2=1")!=-1)//on 체크 온도 1도씩 증가 / 특정한 문자 또는 문자열을 찾아 index(위치값)을 알아내는 함수. 처음부터 W2=1의 index를 리턴한다. 못찾으면 -1 리턴 , W2=1 -&gt; 찾고자 하는 Char나 String 값
{
temp_st++;

}
else if(readString.indexOf("W3=1")!=-1)//off 체크
{
temp_st--;

}
else if(readString.indexOf("W4=1")!=-1)//on 체크 습도 5%씩 증가
{
humi_st = humi_st + 5;

}
else if(readString.indexOf("W5=1")!=-1)//off 체크
{
humi_st = humi_st - 5;

}

client.println("HTTP/1.1 200 OK"); //header 응답 -&gt; 라이브러리
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
//client.println("Refresh: 3"); // refresh the page automatically every 5 sec
client.println();
client.println(""); // 웹브라우저 출력 화면
client.println("");
client.println("");
client.println(" <b>Vinyl house Auto Control Systems</b>

");
client.print("");
client.print("<span style="color: red; font-size: x-large;"><b>");
client.print("Temperature = "); // 현재 온도 출력
client.print(temp);
client.print(" C");
client.print(" ");
client.print(" ");
client.print(" ");
client.print(" ");
client.print(" ");</b></span>

client.print("<span style="color: blue; font-size: x-large;"><b>");
client.print("Humidity = "); // 현재 습도 출력
client.print(humi);
client.print(" %");
client.print("</b></span>

");

client.print("");
client.println("<span style="color: black; font-size: xx-large;"><b>"); // Hard Ware Condition 웹페이지 출력
client.print("Hard Ware Condition
");
client.print("
");
client.print("
</b></span>
<table>"); client.print("");</table>
client.print("
");

if(a == 1) {

client.print("FAN

");
client.print("
ON

"); // FAN on 시 색상 Green
}
else if(a == 2) {
client.print("FAN

");
client.print("
OFF

"); // FAN off 시 색상 Red
}
client.print("

");
client.print("
"); // 줄건너뛰기

if(b == 1) {

client.print("PUMP

");
client.print("
ON

"); // PUMP on 시 색상 Green
}
else if(b == 2) {

client.print("PUMP

");
client.print("
OFF

"); // PUMP off 시 색상 Red
}

client.print("

");
client.print("
"); // 줄 건너뛰기

if(d == 1) {

client.print("BLIND

");
client.print("
UP

"); // 블라인드 open
}
else if(d == 2) {

client.print("BLIND

");
client.print("
DOWN

"); // 블라인드 close
}

client.print("

");
client.print("

"); // 줄 건너뛰기
client.print("

");

client.println("<span style="color: red; font-size: large;"><b>");
client.println("st_Temp : ");
client.println(temp_st); // 설정한 온도 나타내기
client.print(" ");
client.print(" ");
client.print(" ");
client.println("<span style="color: blue; font-size: large;"><b>");
client.println("st_humi : ");
client.println(humi_st); // 설정한 습도 나타내기
client.print("
");</b></span></b></span>

for(int i=1; i&lt;6; i++) {

client.print("");

if(signal[i] == 1){
client.print("<span style="color: black; font-size: large;"><b>");
client.print("Setting Button =&gt;");
client.print(" </b></span>");
if (i == 1) client.print("");

}
else{
client.print("<span style="color: blue; font-size: large;"> <b>");
if (i == 1) client.print("Setting Button =&gt;");
client.print(" </b></span>");
if (i == 1) client.print("");

}
client.print("");
}
client.print("

");
client.println("<span style="color: black; font-size: 300%;"><b>");
client.print("<span style="text-decoration: underline;"><span style="color: #0e000e;">Made by. KSY   MGU</span></span>");</b></span>

client.println("");
client.println("");
client.println("");

readString=" ";
break; // 비정상적으로 루프나 코드 블럭을 벗어날때 쓰임.
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disonnected");

}
byte rht01_dat[5];

byte rht01_in;
byte i;

PORTF &amp;= ~_BV(RHT01_PIN); // 특정 비트에 0을 만들기 위한 용도
delay(18); // delay millisecond
PORTF |= _BV(RHT01_PIN); // 특정 비트에 1을 만들기 위한 용도
delayMicroseconds(40); // delay microsecond
DDRF &amp;= ~_BV(RHT01_PIN);
delayMicroseconds(40); // delay microsecond

rht01_in = PINF &amp; _BV(RHT01_PIN);
if(rht01_in)
{
Serial.println("start condition 1 not met");
return; // return 0; 이면 반환값 0을 통해 정상적 종료를 했는지 확인. 그냥 return이면 반환할 값 없으니 그냥 종료
}
delayMicroseconds(80);

rht01_in = PINF &amp; _BV(RHT01_PIN);
if(!rht01_in)
{
Serial.println("start condition 2 not met");
return;
}

delayMicroseconds(80); // now ready for data reception
for (i=0; i 내가 전송한 데이터가 오류일 수 있으니 예상 Data를 전송하고 실제 전송 Data와 비교해서 맞으면 ok, 틀리면 오류
if(rht01_dat[4]!= rht01_check_sum)
{
Serial.println("RHT01 checksum error");
}
lcd.setCursor(0, 0); // LCD 표시할 위치 선정
lcd.print("Humi = "); // 습도 lcd 출력
lcd.print(rht01_dat[0], DEC);
lcd.print(".");
lcd.print(rht01_dat[1], DEC);
lcd.print(" %");
lcd.setCursor(0, 1);
lcd.print("Temp = "); // 온도 lcd 출력
lcd.print(rht01_dat[2], DEC);
lcd.print(".");
lcd.print(rht01_dat[3], DEC);
lcd.setCursor(12, 1);
lcd.print("\337C");

lcd.setCursor(0, 3);
lcd.print("KNU / KSY.MGU");

delay(250);
temp = (float)rht01_dat[2] + (float)(rht01_dat[3]/100); // datasheet 보고 계산.
humi = (float)rht01_dat[0] + (float)(rht01_dat[1]/100); // 0 , 1 은 습도, 2 ,3은 온도
Serial.println(temp);
Serial.println(humi);

int switchState1; // 스위치1의 입력값을 저장할 변수
int switchState2; // 스위치2의 입력값을 저장할 변수
switchState1 = digitalRead(switchPin1); // 스위치1로부터 받은 0 혹은 1의 값을 저장
switchState2 = digitalRead(switchPin2); // 스위치2로부터 받은 0 혹은 1의 값을 저장

if(one == 1) { // 초기설정 1
if(temptemp_st) {
digitalWrite(Fan, HIGH);
if(switchState1 == HIGH &amp;&amp; switchState2 == LOW)
{ digitalWrite(in2, HIGH);
digitalWrite(in4, LOW);
digitalWrite(in1, LOW);
digitalWrite(in3, HIGH); // UP
}
else if(switchState1 == LOW &amp;&amp; switchState2 == HIGH)
{
digitalWrite(in2, HIGH);
digitalWrite(in4, LOW);
digitalWrite(in1, HIGH);
digitalWrite(in3, LOW); // 모터 정지

}
a = 1;
d = 1;
}
one = one - 1;
}
if(two == 3) { // 초기설정 3
if(humihumi_st)
{
digitalWrite(Pump, LOW);
b = 2;
}
two = two - 1;
}
}
Advertisements

Arduino Education Version_1

1. 아두이노

– 함수(메소드)의 이해.
: 함수 – 특정한 목적을 가지고 수행력을 행하는 동작

– 함수의 구성
[반환형] [함수명] (자료형인자1, 자료형 인자2….){
연산 또는 실행문장 마지막엔 세미콜론;
}
만약! 반환형이 없을 때엔 void 라 기술한다.

– 아두이노의 구성
setup() 함수 : 초기화 목적
loop 함수 : 반복문

2. 아두이노 설정

– 아두이노는 별도의 설정을 통해 구동이 가능.

– 보드 선택 : [도구] – [보드]에서 해당하는 Device 선택
– USB Driver 지정 C:\Program Files\Arduino\drivers\FTDI USB Drivers

3. 기본 문법

– 자료형 : 자원처리를 위해 자원을 저장할 수 있는 메모리 공간의 형태

자료형 크기 범위
int 2byte -32768 ~ 32767
unsigned int 2byte 0 ~ 65535
long 4byte -2147483648 ~ -2147483647
unsigned long 4byte 0 ~ 4294967295
float 4byte -3.4028E+38 ~ 3.4028E+38
double 4byte -3.4028E+108 ~ 3.4028E+108
boolean 1byte 1(true) 0(false)
char 1byte -128 ~ 127
byte 1byte 0 ~ 255
string 문자배열

String(Object) – 문자열 객체를 의미
string(char array) – 문자열이 모여있는 배열을 지칭

4. 기본적인 함수
* 디지털
– pinMode(핀번호, 입출력형식) : 지정한 구성 pin을 입력과 출력중 어떠한 용도로 사용할지 설정하는 함수
: 핀번호 – analog : 0 ~ 5, digital : 14 ~ 19
: 입출력형식 – 입력일때는 INPUT, 출력일때는 OUTPUT
* 디지털 출력
– digitalWrite(핀번호, 출력값) : 아두이노 보드의 atmega칩에 내장되어 있는 20k 풀업저항을 사용하는 함수(저항과 LED 램프 연결되어 있음)
OUTPUT으로 연결된 pin으로 신호를 준다.
: 핀번호 – analog : 0 ~ 5, digital : 14 ~ 19
: 출력값 – HIGH는 +5V(켜짐), LOW는 0V(꺼짐)
: HIGH와 LOW는 각각 true와 false로도 나타낼 수 있다.

Ardunino Study 예제

1. 진수 변환
10 : DEC
16 : HEX
8 : OCT
2 : BIN

char ch = 13; // char 문자 선언
void setup(){
Serial.begin(9600); // 9600 bps
}
void loop(){
Serial.print(“ch :”);
Serial.print(ch);
Serial.print(” “);

Serial.print(ch, DEC); // ch을 10진수 출력
Serial.print(” “);

Serial.print(ch, OCT); // ch을 8진수 출력
Serial.print(” “);

Serial.print(ch, HEX); // ch을 16진수 출력
Serial.print(” “);

Serial.print(ch, BIN); // ch을 2진수 출력
Serial.print(” “);
delay(2000);
}

2. 디지털
digitalRead : 디지털 전압을 측정한다.
pinMode(핀번호, INPUT) : 입력을 받을 핀의 설정
HIGH : 전압이 약 5V일 때 (저항에 전류가 흐를 때)
LOW : 전압이 약 0V일 때 (저항에 전류가 흐르지 않을 때)
OUTPUT : 출력모드
INPUT : 입력모드

const 키워드는 변수가 상수로서 읽을 수는 있지만 값을
변경할 수 없음을 나타내는 키워드이다. 이 변수에 값을
저장하려고 하면 컴파일할 때 에러가 발생한다.

const로 정의된 상수는 변수의 범위 규칙에 따라 전역변수
또는 지역변수가 될 수 있기 때문에 같은 역할을 하는 #define을
사용하는 것보다 낫다고 할 수 있다. 배열의 경우에는 const를 사용해야 한다.

예시

const float pi = 3.14;
float x;
x = pi * 2 // 상수를 산술 연산에 사용해도 된다.

pi = 7; // 상수에 값을 치환할 수 없다. 컴파일 에러 발생.

const int led_pin = 13; // LED 13핀에 상수 선언
const int switch_pin = 19; // 스위치 19번핀에 상수 선언
void setup(){
pinMode(led_pin, OUTPUT); // LED 출력
pinMode(switch_pin, INPUT); // 스위치 입력
}
void loop(){
int check = digitalRead(switch_pin); // 스위치핀을 Read해 check로 넣음.
if(check == HIGH){ // check가 5V일때
digitalWrite(led_pin, HIGH); // LED on
}
else{ // if가 아니라면
digitalWrite(led_pin, LOW); // led off
}
}

3. 모터 제어

digitalWrite로 전류를 넣어 방향을 제시 (HIGH = 정방향) (LOW = 역방향)
analogWrite로 속도를 넣어줌

int r_motor = 8; // 모터 8핀 선언
int switch_pin = 19; // 스위치핀 19 선언

void setup(){
pinMode(r_motor, OUTPUT); // 모터를 출력
pinMode(switch_pin, INPUT); // 스위치핀 입력
}
void loop(){
int check = digitalRead(switch_pin); // 스위치핀을 Read해서 check로 넣음
if(check==LOW){ // check가 LOW일때
digitalWrite(r_motor, HIGH); // 모터는 HIGH(정방향) & 전류를 보냄
analogWrite(10,100); // 속도
delay(300); // 0.3s
digitalWrite(r_motor, LOW); // 모터가 LOW(역방향, 반대방향)
analogWrite(10,100); // 속도
delay(300);
}
else{ // if 조건문이 아니면 실행
analogWrite(10,0); // 속도
delay(300);
}
}

4. Sound
– 피에조(pinNumber : 4)
– 주파수 : hz
– 아날로그 : ux
– 디지털 : ns

void setup(){
pinMode(4, OUTPUT); // 피에조 4번핀 출력 선언
}
void loop(){
digitalWrite(4, HIGH); // 5V일때 출력
delayMicroseconds(2273); // us delay
digitalWrite(4, LOW); // 0V일때 출력
delayMicroseconds(2273);
tone(4,440,10); // 소리크기
}

2014.11.19(수) Wiznet 교육 (아두이노)

안녕하세요.
초급 블로거 안진희입니다.
우선 잘 부탁드린다는 인사를 드리고 싶군요.

이번에 작성될 내용들은 Wiznet 아두이노 교육의 후기에 대해 집필해보려고 합니다.

이번에 수강한 교육은 아두이노에 이더넷 연결하기 오프라인 강좌였습니다.

강사분들은 Wiznet에 근무중이신 허봉준 강사님과 김수환 강사님 이십니다.

이번 강좌에서 제가 처음접하는 아두이노라는 보드를 강사님들이 아주 쉽고 간결하게 설명해주셔서 감사했습니다.

introduce부터 드리자면,

김수환 강사 – http://embeddist.wordpress.com/arduinonote/

위 블로그를 참고하여 교육을 받았구요. 초심자도 보고 금방 따라하실 수 있으실 정도로 정리가 잘되어 있습니다.

물론 제가 강사님의 블로그를 이곳저곳 그림을 따오면서 후기 및 감상문을 써야하는게 맞지만 이번 글은 제가 생각한 느낀점이나 생각하는 점을 말씀드릴까 합니다.

– 처음 아두이노 교육을 신청하고 강의노트를 보았을때, “Arduino는 open-source hardware board를 말한다.”라는 첫글을 시작으로 의문점이 생겼습니다.

Why? 기업들은 Hardware를 공유하지 않는다는 겁니다. 즉, 자료를 open시키지 않는다는 것이죠. 물론 학생들을 위한 Evaluation보드 겸 임베디드 보드를 제작하는 회사들도 있긴하지만 그런 회사들조차 완전한 회로도 및 소스를 Open하지 않는데… 라는 의문점이 들었습니다.

그래서 한편으론 신기하고 또 다른 한편으로는 당혹스러워 하며 아두이노 수업을 들었습니다.

그런데 교육을 듣다 문득 이런 생각이 들더군요. (그저 개인적인 생각입니다ㅎ)

정말 정보력이 중요하다는 것. 정보가 기술이자 곧 길이다. 라는 생각이 들더군요..
Open-Source라는 것이 참으로 웃긴 것이 필요로 하는 사람에겐 기회와 재산인데, 필요로하지 않는 사람은 이 자료를 가지고 있어도 그냥 휴지조각밖에 안된다는 점이 생각이 나오더라구요.

참 아이러니하다. 라는 생각하게되었어요.

그리고 생각을 접고 다음 교육을 따라갔습니다. 그런데 아두이노 보드는 shield라는 보드를 이용해서 인터넷 연결을 하더라구요. 즉, 아두이노 보드에 + 외부 보드를 결합하여 인터넷에 연결하였다.

여기도 이해가 잘 안갔습니다. 궁금해서 질문하고 싶었지만.. 부끄러워서 못했어요. 나중에 댓글로 혹은 쪽지로 물어봐야겠다는 생각을 했습니다.

Why ?! ‘아두이노 보드는 한보드에 인터넷이라는 기능을 넣지않고, 따로 보드를 만들어서 구현하였는가.’ 라는 생각을 했습니다.

그저 초급 엔지니어가 보기엔 ‘좀 더 생산성을 높이고 금전적인 목적때문에 나누지 않았나’ 하는 생각이 듭니다만..

그리고 아두이노 보드의 목적은 그저 교육과 공부의 목적인가? 라는 점이 궁금했습니다.

아두이노 보드를 이용해 3D 프린터기를 만들었다는 강사님의 말을 듣고.. “과연 응용분야가 저거 말고도 뭐가 있을까?”

라는 생각을 하였습니다.

하지만 아두이노 보드를 잘 모르는 저로썬 어디에 응용해야할진 잘 모르겠어서 앞으로 보드를 좀 더 공부해보고 어디에 응용하고 기획할지에 대해 생각해보아야 할 것 같습니다.

결론도 애매모호하고 서론 본론 결론이 이상하게 안맞네요..
초보 블로거다 보니 이런저런 횡설수설 말이 많고 정리도 잘 안되구요..
앞으로 글을 많이 쓰다보면 이런 점도 고쳐지지 않을까 하는 생각이 듭니다.

마지막으로 아두이노 보드에서 설명들었던 Source 에 대해 간략하게 설명드리고 마치겠습니다.
밑으로 보시면 아래의 장대한 소스는 아두이노와 쉴드 보드를 연결하여 HTML 상으로 웹서버를 만들고 아두이노 보드에 연결된 LED를 on/off하는 소스 코드입니다.
코드 해석을 보시면
1. Setup이라는 소스에서 초기화 작업이 이루어지구요.
2. Setup의 initialize가 끝났다면, Mac Address가 있습니다. Mac Address란 고유주소라는 뜻으로 제가 사용한 아두이노 보드 + shield 보드만 사용할 수 있는 고유 이더넷 주소라는 뜻입니다. 이 Mac Address는 따로 설정하지 않고 실습을 진행하였습니다.
3. 그 다음으로 loop문에서 무한 루프를 시켜 LED를 on / off 명령어들이 나열되어 있습니다.
여기의 소스에서 새로운 클라이언트를 생성하여 Html와 아두이노와 인터넷으로 연결 구동하여 LED를 on/off하는 것입니다.
– 여기서의 중요한 점은 아두이노 보드와 접속되어 있는 컴퓨터로 ip , gateway , subnet을 정확하게 맞춰주어야 한다는 점입니다. 먼저 컴퓨터 네트워크상 고정 IP를 만들어 ip를 체결하여 주시고 아래의 소스코드를 통해 192,168,1,20 의 인터넷 주소로 이동하시면 LED 제어를 하실 수 있습니다.
4. 위 실습을 하면서 생각한 것은 Remote 부분인 원격에 대한 부분인데, 잘만 활용한다면 유비쿼터스의 개념에도 많은 도움을 얻을 것 같다는 생각을 하게 되었습니다. 빨라져가는 디지털시대에 원격이란 아이템은 필수적인 요소이니깐 응용분야에 잘 접목을 시킨다면 괜찮은 아이템이 나오지 않을까. 하는 생각이 듭니다.

/*
Web Server

A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.

Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)

created 18 Dec 2009
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
modified 15 Nov 2014
by Soohwan Kim
*/

#include
#include

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
#if defined(WIZ550io_WITH_MACADDRESS) // Use assigned MAC address of WIZ550io
;
#else
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
#endif

//#define __USE_DHCP__

IPAddress ip(192,168,1,20);
IPAddress gateway( 192, 168, 1, 1 );
IPAddress subnet( 255, 255, 255, 0 );
// fill in your Domain Name Server address here:
IPAddress myDns(8, 8, 8, 8); // google puble dns

// 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 check_led_status();
// Define the LED PORT NUMBER
#define LED_PORT 53

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

// initialize the LED PORT
pinMode(LED_PORT, OUTPUT);
// initaial value is HIGH
digitalWrite(LED_PORT, HIGH);

// initialize the ethernet device
#if defined __USE_DHCP__
#if defined(WIZ550io_WITH_MACADDRESS) // Use assigned MAC address of WIZ550io
Ethernet.begin();
#else
Ethernet.begin(mac);
#endif
#else
#if defined(WIZ550io_WITH_MACADDRESS) // Use assigned MAC address of WIZ550io
Ethernet.begin(ip, myDns, gateway, subnet);
#else
Ethernet.begin(mac, ip, myDns, gateway, subnet);
#endif
#endif

// start the Ethernet connection and the server:
server.begin();
Serial.println(“WebServerControlLED”);
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;
String buffer = “”; // Declare the buffer variable
while (client.connected()) {
if (client.available()) {
char c = client.read();
buffer += c; // Assign to the buffer
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();
//client.println(“”);
client.println(“”);
client.println(“”);

// check the LED status
if (digitalRead(LED_PORT)>0){
client.println(“LED is ON“);
}else{
client.println(“LED is OFF“);
}

// generate the Form
client.println(“
“);
client.println(“”);
client.println(“

ON”);
client.println(“

OFF”);
client.println(“

“);

client.println(“”);
client.println(“”);
break;
}
if (c == ‘n’) {
// you’re starting a new line
currentLineIsBlank = true;
buffer=””;
}
else if ( c == ‘r’) {
//do cgi parser for LED-On
if(buffer.indexOf(“GET /led.cgi?status=1”)>=0){
// cgi action : LED-On
digitalWrite(LED_PORT, HIGH);
// send web-page
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println();
client.println(“”);
client.println(“”);
// check the LED status
if (digitalRead(LED_PORT)>0){
client.println(“LED is ON“);
}else{
client.println(“LED is OFF“);
}
client.println(“
“);
client.println(“Go to control-page“);

client.println(“”);
client.println(“”);
currentLineIsBlank = false;
break;
}

//do cgi parser for LED-Off
if(buffer.indexOf(“GET /led.cgi?status=0”)>=0){
// action : LED-Off
digitalWrite(LED_PORT ,LOW);
// send web-page
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println();
client.println(“”);
client.println(“”);
// check the LED status
if (digitalRead(LED_PORT)>0){
client.println(“LED is ON“);
}else{
client.println(“LED is OFF“);
}
client.println(“
“);
client.println(“Go to control-page“);

client.println(“”);
client.println(“”);
currentLineIsBlank = false;
break;
}
}
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”);
}
}