아두이노프로세싱 프로그래밍

Processing 클라이언트에 의한 Ethernet 웹서버 Red & Green LED ON OFF

coding art 2018. 7. 11. 20:37
728x90

______________________________________________________________________________________________________________________________


Processing 의 HTTP 기능을 사용하여 이더넷 쉴드가 설치된 아두이노 우노 보드에 설치된 2개의 LED 즉 Red LED 와 Green LED를 제어하여 보자. 이더넷 쉴드가 설치된 아두이노 우노 보드에서 아래처럼 LED를 배선하자.



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 시키도록 클라이언트 통신 신호를 보내도록 하자.



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 한 칩이라는 느낌이 든다.


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



입력 버퍼 내용이 “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) {
}//끝