// 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 -> 참이면 조건문 계속 수행 delayMicroseconds(30); if(PINF & _BV(RHT01_PIN)) // while은 1(참)일때 루프 돈다. 근데 코딩은 0이다가 1이 되면 루프 돈다. 만약 ex) if(!x 면 x가 거짓일때 실행한다. result |=(1< 입출력 핀의 방향을 결정함. (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 -> 찾고자 하는 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 응답 -> 라이브러리 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<6; i++) { client.print(""); if(signal[i] == 1){ client.print("<span style="color: black; font-size:14pt;"><b>"); client.print("Setting Button =>"); 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 =>"); 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 &= ~_BV(RHT01_PIN); // 특정 비트에 0을 만들기 위한 용도 delay(18); // delay millisecond PORTF |= _BV(RHT01_PIN); // 특정 비트에 1을 만들기 위한 용도 delayMicroseconds(40); // delay microsecond DDRF &= ~_BV(RHT01_PIN); delayMicroseconds(40); // delay microsecond rht01_in = PINF & _BV(RHT01_PIN); if(rht01_in) { Serial.println("start condition 1 not met"); return; // return 0; 이면 반환값 0을 통해 정상적 종료를 했는지 확인. 그냥 return이면 반환할 값 없으니 그냥 종료 } delayMicroseconds(80); rht01_in = PINF & _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 && switchState2 == LOW) { digitalWrite(in2, HIGH); digitalWrite(in4, LOW); digitalWrite(in1, LOW); digitalWrite(in3, HIGH); // UP } else if(switchState1 == LOW && 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; } }
'아두이노 > IoT 아두이노 프로젝트!' 카테고리의 다른 글
[Part 3] 쉽게 화분 키우기 !!(스마트 농장) (6) | 2016.10.10 |
---|---|
[Part 2] 쉽게 화분 키우기 !!(스마트 농장) (2) | 2016.09.01 |
[Part 1] 쉽게 화분 키우기 !!(스마트 농장) (5) | 2016.08.05 |
아두이노 IoT 주차시스템을 만들어보자 !! (22) | 2016.06.01 |
[Home-Automation] Wizwiki-W7500 + RFID-RC522 + Web Server 구현하기 (0) | 2016.05.31 |