1. 개요
다양한 보드를 이용하여 간단히 스마트팜을 구현해 볼 수 있는 키트입니다.
2.1. 부품 리스트
2.2. 조립 방법
1. 기둥을 받침대에 조립합니다.
2. 투광판 ①,②를 기둥 사이에 조립하니다.
3. 일자 지지대①을 기둥에 먼저 끼우고 일자 지지대②를 조립합니다.
4. 일자 지지대② 홈에 삼각 투광판을 조립합니다.
5. 삼각 투광판에 삼각 지지대를 조립합니다.
6. 상단 고정 지지대를 삼각 지지대 위에 조립합니다.
7. 루프 투광판에 루프 지지대를 조립합니다.
루프 지지대의 위치를 조정하여 투광창을 열거나 닫을 수 있습니다.
9. 배너에 스티커를 붙이고 상단 지지대에 꽂아 완성합니다.
3.1. 씨앗의 성장
식물의 씨앗은 자라기 적합한 환경이 갖추어지면 싹을 틔웁니다.
이 현상을 '발아'라고 부릅니다. 씨앗에서 자라 나온 뿌리는 영양분을 흡수하고, 줄기와 잎으로 광합성을 합니다.
무럭무럭 자라난 식물은 꽃을 피우고 씨앗을 맺습니다.
씨앗들은 식물에서 떨어져 나와 다시 발아하여 새로운 생명을 움트게 합니다.
씨앗 뿐만 아니라 균류, 박테리아 등에서 포자가 나와 성장을 시작하는 것도 발아라고 부릅니다.
3.2. 씨앗의 발아에 필요한 3가지 조건
3. 원하는 위치에 적아한 깊이와 크기로 씨앗을 심을 구멍을 만듭니다.
4. 파놓은 구멍에 씨앗을 심습니다.
헥사보드를 연결한 DIY 선샤인 스마트팜입니다.
온도, 습도, 토양 수분량을 LCD에 표시하고, Blynk App을 이용하여 스마트기기로 실시간 모니터링 및 제어를 할 수 있습니다.
헥사보드와 연결할 WiFi가 필수입니다.
4.1.1. 기구부 제작
1. 16*2 LCD 조립
① LCD 고정판과 볼트, 너트를 준비하고 LCD 고정판에 볼트와 너트를 조립한다.
② LCD를 조립된 볼트에 끼우고 너트로 고정한다.
2. 헥사보드 거치대 조립
① 보드 고정판 거치대와 보드 고정판을 긴 볼트와 너트로 조립한다.
② 헥사보드를 보드 고정판에 짧은 볼트로 조립한다.
3. 센서 모듈 조립
※ 커넥터는 방향이 있어 거꾸로 끼워지지 않습니다^^
① DIY 선샤인 스마트팜 키트에서 배너와 상단 고정 지지대를 분해한다.
② 온습도 센서를 케이블과 연결한 뒤 양면테이프를 붙이고 케이블은 구멍을 통해 밖으로 빼낸다.
③ 토양수분 센서의 케이블로 구멍으로 통해 밖으로 빼낸다.
④ RGB LED 바를 상단 고정 지지대의 아랫면에 부착한다.
⑤ LCD 모듈에 연결된 케이블을 상단 고정 지지대의 구멍으로 하나씩(2개가 동시에 들어가지 않습니다^^) 넣은 뒤 미리 조립해 둔 LCD에 케이블을 연결한다.
⑥ LCD를 상단 고정 지지대에 조립한 후, RGB LED바와 LCD와 연결된 케이블은 모두 구멍을 통해 밖으로 빼준다.
⑦ 아래와 같이 헥사보드에 케이블을 연결한다.
토양수분 센서 -> PIN1, 온습도센서 -> PIN2, RGB LED바 -> PIN3, LCD -> I2C
⑧ 헥사보드를 스마프팜에 걸어줍니다.
4.1.2. 코드 작성 및 동작 확인
1. 헥사보드
-. Blynk 연결/ Blynk 연결 시 미소 표시/ Blynk에서 스위치 (V0) 동작 시 RGB LED바 홀수는 빨강, 짝수는 파랑으로 켜고 끄기(식물 생장에 도움을 주는 파장)
-. 아래 코드를 보면 V0 값은 '문자'로 전송이 됩니다. 그래서 문자열로 "1" 로 넣은 것을 확인합니다.
-. 식물은 청색, 적색일 때 생장이 좋아서, 홀수는 빨강, 짝수는 파랑으로 LED가 켜지게 합니다. 계속 사용하기 편하게 함수로 만들었습니다. 밝기는 가장 밝은 100으로 합니다.
-. 온도, 습도, 토양수분 변수를 만들고, 각각의 값을 가져옵니다. 그리고, 토양수분 값은 물이나 물티슈 등을 이용하여 시리얼 모니터에서 최대, 최소 값을 확인한 후, 백분율로 바꾸어 줍니다.
(수분이 많을 수록 숫자가 작습니다.)
-. Blynk의 가상핀에 온도, 습도, 토양수분_백분율을 전송하기.
2. Blynk
이전 헥사보드 코딩에서 우리가 기억해야되는 사항은 LED -> V0, 온도 -> V1, 습도 -> V2, 토양수분_백분율 -> V3 으로 각각의 핀에 대응시켰다는 겁니다.
① 데이타스트림
units은 필수 사항은 아니고, 우리는 모두 정수(Integer)로 하면 됩니다.
-. LED
② 웹 대시보드
위젯은 자신이 넣고 싶은 모양으로 넣습니다. 일단 저는 아래와 같이 하였습니다.
-. LED
헥사보드의 기본 프로그래밍을 학습하고자 하실 때는 아래 링크를 참조하세요.
헥사보드에 모터 쉴드를 연결하여 사용합니다.
4.2.1. 기구부 제작
조립 매뉴얼 다운 받기 -> http://naver.me/5apJigjk
4.2.2. 코드 작성 및 동작확인
코드는 일반형에 자동 급수를 위한 워터펌프 동작 스위치만 추가하면 됩니다.
1. EasyBlocks
온도, 습도, 토양 수분, 조도 센서 입력값을 LCD에 표시하고, 밝기에 따라 식물생장 LED를 점멸하는 스마트팜입니다.
① LCD 고정판과 볼트, 너트를 준비하고 LCD 고정판에 볼트와 너트를 조립한다.
② LCD를 조립된 볼트에 끼우고 너트로 고정한 뒤, 케이블을 색상에 유의하여 아래와 같이 연결한다.
2. 아두이노 우노 보드 거치대 조립
① 릴레이와 아두이노 우노 보드에 볼트와 너트를 조립한다.
③ 보드 고정판 거치대를 볼트 너트를 이용하여 조립한다. 이 때, 볼트의 방향에 주의한다. 그리고, 센서 쉴드 보드를 아두이노 보드에 조립한다.
3. 센서 모듈 조립
※ 커넥터는 방향이 있어 거꾸로 끼워지지 않습니다. 아래 사진의 방향대로 연결하면 됩니다.
① DIY 선샤인 스마트팜 키트에서 배너와 상단 고정 지지대를 분해한다.
② 온습도 센서를 케이블과 연결한 뒤 양면테이프를 붙이고 케이블은 구멍을 통해 밖으로 빼낸다.
③ 토양수분 센서의 케이블로 구멍으로 통해 밖으로 빼낸다.
④ 식물생장 LED를 상단 고정 지지대의 아랫면에 부착한다.
⑤ LCD 모듈에 연결된 케이블을 상단 고정 지지대의 구멍으로 하나씩(2개가 동시에 들어가지 않습니다^^) 넣은 뒤 LCD 고정판을 조립한다.
⑥ 상단 고정 지지대를 스마트팜에 조립하고 식물생장 LED와 LCD의 케이블은 구멍을 통해 밖으로 빼준다.
⑦ 조도센서를 양면테이프로 보드 고정판 거치대에 부착한다. 케이블을 연결하여 보드 고정판 오른쪽 구멍으로 빼내어 정리한다.
⑧ 보드 고정판 왼쪽 구멍으로는 토양수분 센서와 식물생장 LED 케이블을, 오른쪽 구멍으로는 LCD와 온습도 센서의 케이블을 빼낸다.
⑨ 보드 고정판 거치대를 스마트팜에 조립한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <DHT.h> // 온습도 센서 라이브러리 #include <Wire.h> // i2C 통신을 위한 라이브러리 #include <LiquidCrystal_I2C.h> // LCD 1602 I2C용 라이브러리 LiquidCrystal_I2C lcd(0x27, 16, 2); // 화면이 안나오면 0x27 <-> 0x3F 로 변경 #define SoilPin A0 // 토양수분센서 A0번 핀에 연결 #define CdsPin A1 // 조도센서 A1번 핀에 연결 #define LedPin 3 // LED 릴레이 3번 핀에 연결 #define DHTPin 4 // 온습도 센서 4번 핀에 연결 #define DHTTYPE DHT11 // 온습도 센서타입 DHT dht(DHTPin,DHTTYPE); // 온습도 센서 함수 선언 void setup() { Serial.begin(9600); //시리얼 통신 속도 9600bps으로 설정 dht.begin(); //온습도 센서 초기화 및 통신 시작 pinMode(LedPin,OUTPUT); //릴레이핀(3번핀) 출력으로 설정 lcd.begin(); // LCD 초기화 } void loop() { float tempValue = dht.readTemperature(); // 온도 측정값을 tempValue에 저장 float humValue = dht.readHumidity(); // 습도 측정값을 humValue에 저장 int CdsValue = analogRead(CdsPin); // 조도 측정값을 CdsValue에 저장 int SoilValue = analogRead(SoilPin); // 토양수분 측정값을 SoilValue에 저장 int SoilValue_per = map(SoilValue, 150, 500, 100, 0); /* 센서 값을 퍼센트로 변경, 0~1023의 값이나, 물티슈로 센서를 감싼 상태로 최소값과 그냥 대기중의 최대값을 확인 후 기재 map(SoilValue, 최소값_물티슈, 최대값_대기, 100, 0) */ // 어두우면 LED 조명 켜기 if(CdsValue > 600){ // 조도 측정값에 따른 릴레이핀 동작(생장LED 동작) digitalWrite(LedPin,HIGH); // 밝을 때와 어두울 때의 값을 시리얼모니터로 확인 후 중간 값을 기준으로 사용 } else if(CdsValue <= 600){ digitalWrite(LedPin,LOW); } // LCD에 온도, 습도, 토양수분 표시하기 lcd.begin(); // 잔상제거용, 자리수를 고정하는 방법을 간소화함. lcd.backlight(); // 백라이트 켜기 lcd.setCursor(0, 0); // (X축 넘길 갯수, 라인번호) 첫 번째 칸, 첫 번째 줄에 표시 lcd.print("T : "); lcd.print((int)tempValue); lcd.print("C"); lcd.setCursor(8, 0); // (1칸 띄고, 첫번째 라인) lcd.print("H : "); lcd.print((int)humValue); lcd.print("%"); lcd.setCursor(2, 1); // (2칸 띄고, 2번째 라인) lcd.print("Soil_M : "); lcd.print(SoilValue_per); lcd.setCursor(13, 1); // (13칸 띄고, 2번째 라인) lcd.print("%"); // 시리얼 모니터에 온도, 습도, 조도, 토양수분 아날로그 입력값, 토양수분 %로 변경값 표시하 Serial.print("temp : "); Serial.print((int)tempValue); Serial.print(" °C, "); Serial.print("humi : "); Serial.print((int)humValue); Serial.print(" %, "); Serial.print("Cds : "); Serial.print(CdsValue); Serial.print(" "); Serial.print("Soil : "); Serial.print(SoilValue); Serial.print(" "); Serial.print("Soil_M : "); Serial.print((int)SoilValue_per); Serial.println(" % "); //다음 측정값은 줄바꿈하여 시리얼모니터 표시 delay(300); } | cs |
스마트팜 LCD에 릴레이, 수중모터, 급수 장치 등을 추가하여 수중모터를 토양 수분량에 따라 자동 급수를 하는 스마트팜입니다.
아래 영상입니다.
테스트를 여러번 했더니 흙에 물이 가득이네요^^;;
② LCD를 조립된 볼트에 끼우고 너트로 고정한 뒤, 케이블을 색상에 유의하여 아래와 같이 연결한다.
2. 아두이노 우노 보드 거치대 조립
① 릴레이 2개와 아두이노 우노 보드에 볼트와 너트를 조립한다.
③ 보드 고정판 거치대를 볼트 너트를 이용하여 조립한다. 이 때, 볼트의 방향에 주의한다. 그리고, 센서 쉴드 보드를 아두이노 보드에 조립한다.
3. 센서 모듈 조립
※ 커넥터는 방향이 있어 거꾸로 끼워지지 않습니다. 아래 사진의 방향대로 연결하면 됩니다.
① DIY 선샤인 스마트팜 키트에서 배너와 상단 고정 지지대를 분해한다.
② 온습도 센서를 케이블과 연결한 뒤 양면테이프를 붙이고 케이블은 구멍을 통해 밖으로 빼낸다.
③ 토양수분 센서의 케이블로 구멍으로 통해 밖으로 빼낸다.
④ 급수 장치 상,하판을 볼트와 너트를 이용하여 조립한다.
⑤ 식물생장 LED를 방향에 유의하여 급수 장치에 부착한다.
⑦ 급수 장치 양쪽 홈으로 수중펌프 연결 케이블(40cm/ 2Pin/ 검정,빨강)을 넣는다.
⑧ LCD 모듈에 연결 된 케이블은 상단 고정 지지대의 구멍에 하나씩 넣어 빼낸 후, 급수 장치 상판 중앙의 사각 홈에 넣어 LED 케이블이 있는 방향으로 빼낸다.
⑨ 상단 고정 지지대에 LCD 고정판을 조립하고, 스마트팜에 조립한다. 케이블과 호스는 양 옆의 구멍으로 빼내어 준다.
⑩ 수중 펌프에 연결용 젠더가 끼워진 호스와 케이블을 연결한다.
⑪ 조도 센서를 양면테이프로 보드 고정판 거치대에 부착하고, 3Pin 케이블을 연결하여 보드 고정판 오른쪽 구멍으로 빼내어 정리한다.
⑫ 보드 고정판 왼쪽 구멍으로는 토양수분 센서, 식물생장 LED, 수중 펌프 연결 케이블을, 오른쪽 구멍으로는 LCD와 온습도 센서의 케이블을 빼낸다.
⑬ 보드 고정판 거치대를 스마트팜에 조립한다.
모터 동작을 확인을 위해서 배럴잭에 외부 전원으로 9V 건전지(꼭 알카라인으로)를 연결해 줍니다.
9V 건전지는 단순히 동작을 확인하는 것일 뿐, 정상적인 동작을 위해서는 9V 2A 정도의 어댑터 전원을 이용합니다. 수중모터의 노이즈 문제로 간혹 동작 중 온습도가 측정이 되지 않을 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include <DHT.h> // 온습도 센서 라이브러리 #include <Wire.h> // i2C 통신을 위한 라이브러리 #include <LiquidCrystal_I2C.h> // LCD 1602 I2C용 라이브러리 LiquidCrystal_I2C lcd(0x27, 16, 2); // 화면이 안나오면 0x27 <-> 0x3F 로 변경 #define SoilPin A0 // 토양수분센서 A0번 핀에 연결 #define CdsPin A1 // 조도센서 A1번 핀에 연결 #define LedPin 3 // LED 릴레이 3번 핀에 연결 #define DHTPin 4 // 온습도 센서 4번 핀에 연결 #define DHTTYPE DHT11 // 온습도 센서타입 DHT dht(DHTPin,DHTTYPE); // 온습도 센서 함수 선언 #define PumpPin 9 // 수중 펌프 릴레이 9번 핀에 연결 void setup() { Serial.begin(9600); //시리얼 통신 속도 9600bps으로 설정 dht.begin(); //온습도 센서 초기화 및 통신 시작 pinMode(LedPin,OUTPUT); //릴레이핀(3번핀) 출력으로 설정 pinMode(PumpPin,OUTPUT); //릴레이핀(3번핀) 출력으로 설정 lcd.begin(); // LCD 초기화 } void loop() { float tempValue = dht.readTemperature(); // 온도 측정값을 tempValue에 저장 float humValue = dht.readHumidity(); // 습도 측정값을 humValue에 저장 int CdsValue = analogRead(CdsPin); // 조도 측정값을 CdsValue에 저장 int SoilValue = analogRead(SoilPin); // 토양수분 측정값을 SoilValue에 저장 int SoilValue_per = map(SoilValue, 150, 500, 100, 0); /* 센서 값을 퍼센트로 변경, 0~1023의 값이나, 물티슈로 센서를 감싼 상태로 최소값과 그냥 대기중의 최대값을 확인 후 기재 map(SoilValue, 최소값_물티슈, 최대값_대기, 100, 0) */ // 어두우면 LED 조명 켜기 if(CdsValue > 600){ // 조도 측정값에 따른 릴레이핀 동작(생장LED 동작) digitalWrite(LedPin,HIGH); // 밝을 때와 어두울 때의 값을 시리얼모니터로 확인 후 중간 값을 기준으로 사용 } else if(CdsValue <= 600){ digitalWrite(LedPin,LOW); } // 토양 수분이 40% 미만이면 수중모터 동작하기 (급수) if(SoilValue_per < 40){ // 토양수분 % 측정 값에 따른 릴레이핀 동작(수중모터 동작) digitalWrite(PumpPin,HIGH); // 40% 를 기준으로 사용 } else if(SoilValue_per >= 40){ digitalWrite(PumpPin,LOW); } // LCD에 온도, 습도, 토양수분 표시하기 lcd.begin(); // 잔상제거용, 자리수 만들기 간소화 lcd.backlight(); // 백라이트 켜기 lcd.setCursor(0, 0); // (X축 넘길 갯수, 라인번호) 첫 번째 칸, 첫 번째 줄에 표시 lcd.print("T : "); lcd.print((int)tempValue); lcd.print("C"); lcd.setCursor(8, 0); // (1칸 띄고, 첫번째 라인) lcd.print("H : "); lcd.print((int)humValue); lcd.print("%"); lcd.setCursor(2, 1); // (2칸 띄고, 2번째 라인) lcd.print("Soil_M : "); lcd.print(SoilValue_per); lcd.setCursor(13, 1); // (13칸 띄고, 2번째 라인) lcd.print("%"); // 시리얼 모니터에 온도, 습도, 조도, 토양수분 아날로그 입력값, 토양수분 %로 변경값 표시하 Serial.print("temp : "); Serial.print((int)tempValue); Serial.print(" °C, "); Serial.print("humi : "); Serial.print((int)humValue); Serial.print(" %, "); Serial.print("Cds : "); Serial.print(CdsValue); Serial.print(" "); Serial.print("Soil : "); Serial.print(SoilValue); Serial.print(" "); Serial.print("Soil_M : "); Serial.print((int)SoilValue_per); Serial.println(" % "); //다음 측정값은 줄바꿈하여 시리얼모니터 표시 delay(300); } | cs |
아두이노 설치, 기본 및 각각의 센서 사용법은 아두이노 페이지를 참조바랍니다.
ESP32 Devkit V1과 Blynk를 활용하여 IoT로 온도, 습도, 토양수분값을 실시간 모니터링하고, 식물생장 LED와 FAN을 제어합니다.
토양수분이 부족하면 비가 내리는 형태로 자동급수하는 기능을 추가하여 재미를 더했습니다.
아두이노 IDE를 이용하여 개발환경을 구축합니다.
1. 추가 보드 관리자 URL 추가
-. 기본 설정
-. 추가 보드 관리자 URL 찾아보기 클릭
-. '비공식 보드 지원 URL 목록을 보려면 클릭하십시요' 클릭
-. 'ctrl + F' 눌러 espressif 검색 후 아래 링크 복사
주소 복사
-. 복사된 주소를 붙여넣고, 확인 클릭
1 2 3 4 5 6 7 8 9 10 | void setup() { pinMode(2, OUTPUT); } void loop() { digitalWrite(2, HIGH); delay(1000); digitalWrite(2, LOW); delay(1000); } | cs |
6.2.1. 기구부 제작
6.2.2. 코드 작성 및 동작 확인
6.3.1. 기구부 제작
6.3.2 코드 작성 및 동작 확인
Blynk에서 이후에 아래와 같이 핀을 연결합니다.
V0 → 식물생장 LED (제어)
V1 → 온도 (모니터링)
V2 → 습도 (모니터링)
V3 → 토양수분 (모니터링)
V4 → Fan (제어)
토양수분에 따른 자동급수 펌프는 블링크에서 제어하지 않고, 토양수분 40% 이하일 때 동작하도록 합니다.
1. Blynk와 연동
1) Blynk WiFi 연결 예제 불러오기
-. 파일 → 예제 → Blynk → Board_WiFi → ESP32_WiFi
-. 윗 부분 주석(30번째 줄까지) 지워서 깔끔하게 만들기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #define BLYNK_PRINT Serial /* Fill in information from Blynk Device Info here */ //#define BLYNK_TEMPLATE_ID "TMPxxxxxx" //#define BLYNK_TEMPLATE_NAME "Device" //#define BLYNK_AUTH_TOKEN "YourAuthToken" #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h> // Your WiFi credentials. // Set password to "" for open networks. char ssid[] = "YourNetworkName"; char pass[] = "YourPassword"; void setup() { // Debug console Serial.begin(9600); Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); } void loop() { Blynk.run(); } | cs |
2) Blynk 접속코드
블링크 접속코드와 ESP32보드가 연결할 WiFi 정보를 넣습니다. WiFi는 5G는 접속이 안됩니다.
-. 디바이스에서 도구모양 아이콘 클릭
-. General 에서 오른쪽 아래 접속 코드(검정색 바탕에 있는 코드) 있는 곳에 마우스를 대면 'Click to copy Code'가 뜨고 클릭하면 접속 코드가 복사됩니다.
-. 아두이노 스케치의 접속 코드 기재 부분에 붙여 넣습니다.
4) 업로드 및 연결 확인 메세지
-. 업로드 후 시리얼 모니터로 보면 연결 확인 메세지를 볼 수 있습니다.
코드 작성은 모두 각각의 함수로 만들고 timer로 불러와서 실행을 합니다.
2. 식물생장 LED
-. 첫 번째하는 것으로 블링크 타이머 함수 사용 작성
-. V0 핀의 상태로 LED 릴레이핀을 제어합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | //// 와이파이이름, 비밀번호 이후 작성 BlynkTimer timer; //블링크 타이머함수 사용 // LED 작동 #define relayPin_L 18 //LED 릴레이핀 bool led_state; //led_state 선언 BLYNK_WRITE(V0){ // 블링크 V0 핀 상태 int로 가져오기 led_state = param.asInt(); } void ledControl(){ // 1일 때 on, 0일 때 off if(led_state){ digitalWrite(relayPin_L, HIGH); } else{ digitalWrite(relayPin_L, LOW); } } void setup() { Serial.begin(9600); Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); pinMode(relayPin_L, OUTPUT); // LED 릴레이핀 output으로 설정 timer.setInterval(300L, ledControl); //함수 호출하여 0.3초마다 LED 동작 버튼 체크 } void loop() { Blynk.run(); timer.run(); //timer 사용 } | cs |
3. Fan 동작
-. V4번핀의 상태로 Fan 릴레이를 제어합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | // ledControl() 함수 설정 이후 작성 // fan 작동 #define relayPin_F 19 //GPIO 19번 핀에 Fan동작 릴레이 bool fan_state; // fan_state 선 BLYNK_WRITE(V4){ // 블링크 V4 핀 상태 int로 가져오기 fan_state = param.asInt(); } void fanControl(){ // 1일 때 on, 0일 때 off if(fan_state){ digitalWrite(relayPin_F, HIGH); } else{ digitalWrite(relayPin_F, LOW); } } void setup() { Serial.begin(9600); Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); pinMode(relayPin_L, OUTPUT); // LED 릴레이핀 output으로 설정 timer.setInterval(300L, ledControl); //함수 호출하여 0.3초마다 LED 동작 버튼 체크 pinMode(relayPin_F, OUTPUT); // Fan 릴레이핀 output으로 설정 timer.setInterval(300L, fanControl); //함수 호출하여 0.3초마다 fan 동작 버튼 체크 } void loop() { Blynk.run(); timer.run(); //timer 사용 } | cs |
4. 온습도 센서
-. 온습도 센서를 사용하기 위해서는 라이브러리를 추가하여야 합니다.
-. 온도를 V1, 습도를 V2로 전송합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | // fanControl() 함수 설정 이후 작성 // 온습도 센서 #include <DHT.h> // 온습도 센서 라이브러리 #define DHTPin 25 //25번 핀에 연결 #define DHTTYPE DHT11 // 온습도 센서타입 DHT dht(DHTPin,DHTTYPE); // 온습도 센서 함수 선언 void dhtEvent(){ int tempValue = dht.readTemperature(); // 온도 측정값을 tempValue에 저장 int humValue = dht.readHumidity(); // 습도 측정값을 humValue에 저장 Blynk.virtualWrite(V1, tempValue); // 온도 값을 블링크의 V1핀으로 전송 Blynk.virtualWrite(V2, humValue); // 습도 값을 블링크의 V2번핀으로 전송 } void setup() { Serial.begin(9600); Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); pinMode(relayPin_L, OUTPUT); // LED 릴레이핀 output으로 설정 timer.setInterval(300L, ledControl); //함수 호출하여 0.3초마다 LED 동작 버튼 체크 pinMode(relayPin_F, OUTPUT); // Fan 릴레이핀 output으로 설정 timer.setInterval(300L, fanControl); //함수 호출하여 0.3초마다 fan 동작 버튼 체크 timer.setInterval(1000L, dhtEvent); // 1초마다 온습도 데이터 확인 } void loop() { Blynk.run(); timer.run(); //timer 사용 } | cs |
5. 토양수분센서
-. map 함수를 이용하여 백분율로 변환합니다.
-. 40% 미만 시 펌프 릴레이 동작
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | //dhtEvent() 함수 설정 이후 작성 // 토양수분센서 #define soilPin 34 // 34번 핀에 토양수분센서 #define relayPin_P 23 // 23번 핀에 펌프 동작 릴레이 void soilEvent(){ int soilValue = analogRead(soilPin); int soilValue_p = map(soilValue, 950, 2600, 100, 0); // 물티슈 등을 이용하여 최대 최소값 측정 후 변경 Serial.print("S : "); // map 함수 값을 넣기 위해 측정값을 시리얼 모니터로 값 출력 Serial.print(soilValue); Serial.print(" , S_P : "); Serial.println(soilValue_p); Blynk.virtualWrite(V3, soilValue_p); // 토양수분 백분율 블링크 V3번 핀으로 전송 if(soilValue_p < 40){ // 토양수분 % 측정 값에 따른 릴레이핀 동작(수중모터 동작) digitalWrite(relayPin_P,HIGH); // 40% 를 기준으로 사용 } else if(soilValue_p >= 40){ digitalWrite(relayPin_P,LOW); } } void setup() { Serial.begin(9600); Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); pinMode(relayPin_L, OUTPUT); // LED 릴레이핀 output으로 설정 timer.setInterval(300L, ledControl); //함수 호출하여 0.3초마다 LED 동작 버튼 체크 pinMode(relayPin_F, OUTPUT); // Fan 릴레이핀 output으로 설정 timer.setInterval(300L, fanControl); //함수 호출하여 0.3초마다 fan 동작 버튼 체크 timer.setInterval(1000L, dhtEvent); // 1초마다 온습도 데이터 확인 pinMode(relayPin_P, OUTPUT); // 펌프 릴레이핀 output으로 설정 timer.setInterval(1000L, soilEvent); // 1초마다 토양수분 백분율 확인 및 동작 } void loop() { Blynk.run(); timer.run(); //timer 사용 } | cs |
6. 1602 LCD 연결
-. 함수로 만들어 타이머로 호출하는 형식으로 프로그램을 하였습니다. LCD에 온습도, 토양수분값을 표시되는 값은 같은 변수이기에 온습도, 토양수분, LCD를 합쳐서 함수로 만듭니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | // 온습도 센서, 토양수분, LCD #include <DHT.h> // 온습도 센서 라이브러리 #define DHTPin 25 //18번 핀에 연결 #define DHTTYPE DHT11 // 온습도 센서타입 DHT dht(DHTPin,DHTTYPE); // 온습도 센서 함수 선언 #define soilPin 34 // 34번 핀에 토양수분센서 #define relayPin_P 23 // 23번 핀에 펌프 동작 릴레이 #include <Wire.h> // i2C 통신을 위한 라이브러리 #include <LiquidCrystal_I2C.h> // LCD 1602 I2C용 라이브러리 LiquidCrystal_I2C lcd(0x3F, 16, 2); // 화면이 안나오면 0x27 -> 0x3F 로 변경 void sensorEvent(){ int tempValue = dht.readTemperature(); // 온도 측정값을 tempValue에 저장 int humValue = dht.readHumidity(); // 습도 측정값을 humValue에 저장 Blynk.virtualWrite(V1, tempValue); // 온도 값을 블링크의 V1핀으로 전송 Blynk.virtualWrite(V2, humValue); // 습도 값을 블링크의 V2번핀으로 전송 int soilValue = analogRead(soilPin); int soilValue_p = map(soilValue, 950, 2600, 100, 0); // 물티슈 등을 이용하여 최대 최소값 측정 후 변경 Serial.print("S : "); // map 함수 값을 넣기 위해 측정값을 시리얼 모니터로 값 출력 Serial.print(soilValue); Serial.print(" , S_P : "); Serial.println(soilValue_p); Blynk.virtualWrite(V3, soilValue_p); // 토양수분 백분율 블링크 V3번 핀으로 전송 if(soilValue_p < 40){ // 토양수분 % 측정 값에 따른 릴레이핀 동작(수중모터 동작) digitalWrite(relayPin_P,HIGH); // 40% 를 기준으로 사용 } else if(soilValue_p >= 40){ digitalWrite(relayPin_P,LOW); } lcd.begin(); // 리셋(자리수 수정 함수 안넣기;; -> 간소화) lcd.backlight(); // 백라이트 켜기 lcd.setCursor(0, 0); // (X축 넘길 갯수, 라인번호) 첫 번째 칸, 첫 번째 줄에 표시 lcd.print("T : "); lcd.print(tempValue); lcd.print("C"); lcd.setCursor(8, 0); // (1칸 띄고, 첫번째 라인) lcd.print("H : "); lcd.print(humValue); lcd.print("%"); lcd.setCursor(2, 1); // (2칸 띄고, 2번째 라인) lcd.print("Soil_M : "); lcd.print(soilValue_p); lcd.setCursor(14, 1); // (14칸 띄고, 2번째 라인) lcd.print("%"); } void setup() { Serial.begin(9600); Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); pinMode(relayPin_L, OUTPUT); // LED 릴레이핀 output으로 설정 timer.setInterval(300L, ledControl); //함수 호출하여 0.3초마다 LED 동작 버튼 체크 pinMode(relayPin_F, OUTPUT); // Fan 릴레이핀 output으로 설정 timer.setInterval(300L, fanControl); //함수 호출하여 0.3초마다 fan 동작 버튼 체크 pinMode(relayPin_P, OUTPUT); timer.setInterval(1000L, sensorEvent); // 1초마다 데이터 확인, 전송 및 동작 } void loop() { Blynk.run(); timer.run(); //timer 사용 } | cs |
7. 전체 소스 정리
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #define BLYNK_PRINT Serial // 블링크 연동 정보 기재 //#define BLYNK_TEMPLATE_ID "TMPxxxxxx" //#define BLYNK_TEMPLATE_NAME "Device" //#define BLYNK_AUTH_TOKEN "YourAuthToken" #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h> char ssid[] = "modoitda"; char pass[] = "3838383838"; BlynkTimer timer; //블링크 타이머함수 사용 // LED 작동 #define relayPin_L 18 //LED 릴레이핀 bool led_state; //led_state 선언 BLYNK_WRITE(V0){ // 블링크 V0 핀 상태 int로 가져오기 led_state = param.asInt(); } void ledControl(){ // 1일 때 on, 0일 때 off if(led_state){ digitalWrite(relayPin_L, HIGH); } else{ digitalWrite(relayPin_L, LOW); } } // fan 작동 #define relayPin_F 19 //GPIO 19번 핀에 fan 동작 릴레이 bool fan_state; // fan_state 선언 BLYNK_WRITE(V4){ // 블링크 V4 핀 상태 int로 가져오기 fan_state = param.asInt(); } void fanControl(){ // 1일 때 on, 0일 때 off if(fan_state){ digitalWrite(relayPin_F, HIGH); } else{ digitalWrite(relayPin_F, LOW); } } // 온습도 센서, 토양수분, LCD #include <DHT.h> // 온습도 센서 라이브러리 #define DHTPin 25 //25번 핀에 연결 #define DHTTYPE DHT11 // 온습도 센서타입 DHT dht(DHTPin,DHTTYPE); // 온습도 센서 함수 선언 #define soilPin 34 // 34번 핀에 토양수분센서 #define relayPin_P 23 // 23번 핀에 펌프 동작 릴레이 #include <Wire.h> // i2C 통신을 위한 라이브러리 #include <LiquidCrystal_I2C.h> // LCD 1602 I2C용 라이브러리 LiquidCrystal_I2C lcd(0x3F, 16, 2); // 화면이 안나오면 0x27 -> 0x3F 로 변경 void sensorEvent(){ int tempValue = dht.readTemperature(); // 온도 측정값을 tempValue에 저장 int humValue = dht.readHumidity(); // 습도 측정값을 humValue에 저장 Blynk.virtualWrite(V1, tempValue); // 온도 값을 블링크의 V1핀으로 전송 Blynk.virtualWrite(V2, humValue); // 습도 값을 블링크의 V2번핀으로 전송 int soilValue = analogRead(soilPin); int soilValue_p = map(soilValue, 950, 2600, 100, 0); // 물티슈 등을 이용하여 최대 최소값 측정 후 변경 Serial.print("S : "); // map 함수 값을 넣기 위해 측정값을 시리얼 모니터로 값 출력 Serial.print(soilValue); Serial.print(" , S_P : "); Serial.println(soilValue_p); Blynk.virtualWrite(V3, soilValue_p); // 토양수분 백분율 블링크 V3번 핀으로 전송 if(soilValue_p < 40){ // 토양수분 % 측정 값에 따른 릴레이핀 동작(수중모터 동작) digitalWrite(relayPin_P,HIGH); // 40% 를 기준으로 사용 } else if(soilValue_p >= 40){ digitalWrite(relayPin_P,LOW); } lcd.begin(); // 리셋(자리수 수정 함수 안넣기;; -> 간소화) lcd.backlight(); // 백라이트 켜기 lcd.setCursor(0, 0); // (X축 넘길 갯수, 라인번호) 첫 번째 칸, 첫 번째 줄에 표시 lcd.print("T : "); lcd.print(tempValue); lcd.print("C"); lcd.setCursor(8, 0); // (1칸 띄고, 첫번째 라인) lcd.print("H : "); lcd.print(humValue); lcd.print("%"); lcd.setCursor(2, 1); // (2칸 띄고, 2번째 라인) lcd.print("Soil_M : "); lcd.print(soilValue_p); lcd.setCursor(14, 1); // (14칸 띄고, 2번째 라인) lcd.print("%"); } void setup() { Serial.begin(9600); Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); pinMode(relayPin_L, OUTPUT); // LED 릴레이핀 output으로 설정 timer.setInterval(300L, ledControl); //함수 호출하여 0.3초마다 LED 동작 버튼 체크 pinMode(relayPin_F, OUTPUT); // Fan 릴레이핀 output으로 설정 timer.setInterval(300L, fanControl); //함수 호출하여 0.3초마다 fan 동작 버튼 체크 pinMode(relayPin_P, OUTPUT); timer.setInterval(1000L, sensorEvent); // 1초마다 데이터 확인, 전송 및 동작 } void loop() { Blynk.run(); timer.run(); //timer 사용 } | cs |
상품소개