본문 바로가기

아두이노/IoT 아두이노 프로젝트!

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:18pt;"><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:18pt;"><b>");
client.print("Humidity = "); // 현재 습도 출력
client.print(humi);
client.print(" %");
client.print("</b></span>

");

client.print("");
client.println("<span style="color: black; font-size:24pt;"><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:14pt;"><b>");
client.println("st_Temp : ");
client.println(temp_st); // 설정한 온도 나타내기
client.print(" ");
client.print(" ");
client.print(" ");
client.println("<span style="color: blue; font-size:14pt;"><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:14pt;"><b>");
client.print("Setting Button =&gt;");
client.print(" </b></span>");
if (i == 1) client.print("");

}
else{
client.print("<span style="color: blue; font-size:14pt;"> <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;
}
}