Reposting: Processing 클라이언트 Ethernet 웹서버 Red & Green LED ON OFF 제어

codingart(66)
Published in
#kr
Words
196
Reading
1 min
Listen
Play
8y

noname01.png

Processing 의 HTTP 기능을 사용하여 이더넷 쉴드가 설치된 아두이노 우노 보드의 디지털 핀 3번과 4번에 설치된 2개의 LED 즉 Red LED 와 Green LED를 제어하여 보자. 사용된 전류 제한 저항은 220Ω이다. 2개의 LED가 1개의 전류제한 저항을 사용하여 아래 그림처럼 배선하자.

noname02.png

LED 1개를 이더넷을 통래 제어하는 코딩 문제와 본질적인 차이는 없겠지만 Processing 코드에 의한 디지털 제어라는 측면에서 경우의 수를 고려하여 코드를 수정해야 한다.

Processing 그래픽 화면에서 입력 방법을 고려해 보자. 그래픽 스크린을 size(400, 400)으로 설정하자. 그래픽 화면을 반으로 나누어 0< mouseX <200 과 200< mouseX <400 인 구간으로 나누어 각각 Red 와 Green 영역으로 대응시키자. Red LED on 명령은 if 제어문을 사용하여 200 이하의 mouseX 값과 동시에 mouseButton == LEFT 클릭으로 설정하고 반면에 Green LED on 명령은 else if 제어문을 사용하여 200 이상의 mouseX 값과 동시에 mouseButton == LEFT 클릭으로 설정한다. 이도 저도 아닌 경우 즉 mouseX 의 위치가 그래픽 화면 내 어디에 위치하든 간에 mouseButton == RIGHT 클릭이면 else 처리하여 2개의 LED를 동시에 OFF 시키도록 클라이언트 통신 신호를 보내도록 하자.

이더넷 쉴드 보드에 설치된 LED 가 가시적으로 보이지 않는 곳에 위치한다면 ON OFF 신호를 보낸 후 웹서버로부터 response를 받든지 아니면 클라이언트 스스로 방금 웹서버로 request를 보내면서 시행한 명령을 어떠한 방식으로라도 결과를 그래픽 화면에 출력해야 할 것이다. 즉 Red ON 신호를 보냈으면 (400,400) 그래픽 화면을 빨간색으로, Green ON 신호를 보냈으면 (400,400) 그래픽 화면을 초록색으로, 2 LED를 OFF 즉 꺼버린 나머지 경우는 (400,400) 그래픽 화면을 검정색으로 아래와 같이 출력하기로 하자.

noname03.png

Ethernet에 의해 HTTP 통신 연결이 된 아두이노에서 코드 수정 사항을 고려해 보자. 2개의 Red LED 와 Green LED를 각각 디지털 핀 3번과 4번에 설정하여 연결하자.
int red_Pin =3, int green_Pin =4 가 필요하며 setup()에서 각각 pinMode 출력 설정이 필수적이다.

loop() 내부에서sms Processing 으로부터 보내 온 문자 데이터를 client.read(0 명령으로 일일이 읽어 다 더하여 입력 버퍼 데이터 문자열 즉 readString을 준비한다. 참고로 NodeMCU/WeMos 와이파이 보드 사용 시에는 문자 데이터를 일일이 읽을 필요 없이 입력버퍼로부터 직접 문자열 데이터를 읽을 수 있다. 즉 이더넷 칩 W5100이 NodeMCU/WeMos 보드의 ESP8266 12E에 비해 약간 old 한 칩이라는 느낌이 든다.

noname04.png

Processing 으로부터 HTTP 통신 프로토콜에 의해 전달된 입력 버퍼 내용을 대상으로 “Ron” 또는 “Gon” 또는 “OFF”가 들어 있는지 readString.indexOf(“”) 명령을 사용하여 식별한다.

noname05.png

입력 버퍼 내용이 “Ron” 이라면 3번 핀의 Red LED를 ON 함과 동시에 4번 핀의 Green LED를 OFF 한다. 반대로 입력 버퍼 내용이 “Gon” 이라면 3번 핀의 Red LED를 OFF 함과 동시에 4번 핀의 Green LED를 ON 한다. 만약 입력 버퍼 데이터가 “OFF”라면 Red LED 와 Green LED를 모두 OFF 시키도록 한다. Red LED 와 Green LED를 함께 ON 시키는 경우는 Processing에서 그러한 명령을 준비하지 않았으므로 배제 한다. 고려되지 않은 경우의 수가 있다면 디지털 제어 시스템에서 큰 문제를 초래할 수도 있다.

Processing에서 마우스 클릭을 사용하여 LED를 ON OFF하는 동영상을 관찰하자
https://youtu.be/tqc42Dw5LLA

사이트에 첨부된 코드를 실행시켜 보자.
//Client_Ethernet_Mouse_Red_Green_LED_ON_OFF_01
import processing.net.*;
Client c;
String data;
void setup() {
size(400,400);
background(255);
}

void draw() {

}
void mousePressed() {
if (mouseButton == LEFT && mouseX<200) {
background(255, 0, 0);
c = new Client(this, "192.168.0.11", 80);
c.write("Ron\n");
delay(10);
}
else if (mouseButton == LEFT && mouseX>200) {
background(0, 255, 0);
c = new Client(this, "192.168.0.11", 80);
c.write("Gon\n");
delay(10);
}
else {
background(0);
c = new Client(this, "192.168.0.11", 80);
c.write("OFF\n");
delay(10);
}
}//end of program

//Webserver_ethernet_Red_Green_LED_ON_OFF_01
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 0, 11 }; // fixed IP addr in LAN

EthernetServer server(80); //server port
String readString;
int red_Pin = 3;
int green_Pin = 4;

void setup(){
pinMode(red_Pin, OUTPUT);
pinMode(green_Pin, OUTPUT);

Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop(){
EthernetClient client = server.available();

if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 100) {
//store characters to string
readString += c;
//Serial.print(c);
}

if (c == '\n') {
Serial.println(readString);
if(readString.indexOf("Ron") != -1) {
digitalWrite(red_Pin, HIGH);
digitalWrite(green_Pin, LOW);
}
if(readString.indexOf("Gon") != -1) {
digitalWrite(green_Pin, HIGH);
digitalWrite(red_Pin, LOW);
}
if(readString.indexOf("OFF") != -1) {
digitalWrite(red_Pin, LOW);
digitalWrite(green_Pin, LOW);
}
delay(1);
client.stop();
readString=""; //clearing string for next read
}//if (c == '\n') {

  }//if (client.available()) {
}//while (client.connected()) {

}// if (client) {
}//끝

Reposting: Processing 클라이언트 Ethernet 웹서버 Red & Green LED ON OFF 제어 | Ecency