본문 바로가기 주메뉴 바로가기

1. 개요


다양한 보드를 이용하여 간단히 스마트팜을 구현해 볼 수 있는 키트입니다.


제품 구매 링크 클릭!


 

2. 기본 형태 조립


2.1. 부품 리스트



 

2.2. 조립 방법


1. 기둥을 받침대에 조립합니다.


 

2. 투광판 ①,②를 기둥 사이에 조립하니다.



3. 일자 지지대①을 기둥에 먼저 끼우고 일자 지지대②를 조립합니다.



4. 일자 지지대② 홈에 삼각 투광판을 조립합니다.


5. 삼각 투광판에 삼각 지지대를 조립합니다.


6. 상단 고정 지지대를 삼각 지지대 위에 조립합니다.


7. 루프 투광판에 루프 지지대를 조립합니다.


8. 루프 투광판을 일자 지지대①의 걸쇠에 끼워주세요. 이때 지지대의 방향에 주의합니다.

  

루프 지지대의 위치를 조정하여 투광창을 열거나 닫을 수 있습니다. 


9. 배너에 스티커를 붙이고 상단 지지대에 꽂아 완성합니다.


3. 씨앗 심기


3.1. 씨앗의 성장


식물의 씨앗은 자라기 적합한 환경이 갖추어지면 싹을 틔웁니다.

이 현상을 '발아'라고 부릅니다. 씨앗에서 자라 나온 뿌리는 영양분을 흡수하고, 줄기와 잎으로 광합성을 합니다.

무럭무럭 자라난 식물은 꽃을 피우고 씨앗을 맺습니다.

씨앗들은 식물에서 떨어져 나와 다시 발아하여 새로운 생명을 움트게 합니다.

씨앗 뿐만 아니라 균류, 박테리아 등에서 포자가 나와 성장을 시작하는 것도 발아라고 부릅니다.


 


3.2. 씨앗의 발아에 필요한 3가지 조건


1. 수분
 씨앗은 충분한 수분을 흡수해야 발아할 수 있습니다. 물을 흡수한 씨앗의 세포들이 팽창하면 대사 활동이 시작됩니다. 어린 뿌리와 떡잎이 자라는 도중 수분 보충이 끊기면 씨앗의 발아 과정은 멈추게 되고, 수분 부족이 오래 지속된다면 식물이 말라 죽을 수도 있습니다.

2. 공기(산소)
 산소는 씨앗이 자라나 광합성을 하기 전까지 필요한 에너지를 낼 수 있도록 도와줍니다. 씨앗 세포의 물질 대사와 에너지 연소를 위해 산소는 필수적입니다.

3. 온도
 너무 춥거나 더우면 씨앗은 발아하지 못합니다. 식물의 종류에 따라 발아 온도가 다르므로 식물을 키우기 위해선 적정 온도를 꼭 확인해야 합니다. 온대성 식물은 12~15도, 아열대성, 열대성 식물을 25~30도가 적당합니다.

 

3.3. 식물을 키울 때 주의사항

1. 빛
 대부분의 식물의 묘목은 충분한 빛을 받는 환경에서 자라기에 적합하며 빛이 없으면 잎이 노랗게 변할 수 있습니다. 식물이 정상적으로 광합석을 할 수 있도록 적절한 빛을 제공해야 하며, 반대로 빛이 너무 강할 경우 제때 차광 처리를 해야 합니다. 너무 강한 빛이나 과하게 긴 시간 동안 빛에 노출될 경우 식물이 마르고 물이 부족하게 될 수 있습니다.

2. 수분
 물을 너무 자주 주면 식물이 정상적으로 자라지 못하고 잎이 노랗게 변하거나 뿌리가 썩을 수 있습니다. 반대로 너무 건조하면 식물이 말라버립니다. 각 식물의 습성에 맞게 적당한 수분을 제공해 주세요.

3. 비료
 식물의 성장에 영양소는 꼭 필요하지만 과하게 주게 되면 불필요한 영양분을 흡수하게 되어 되려 성장을 방해하고, 토양의 화학적 조성을 방해하여 식물이 필요로 하는 영양분을 흡수 못하게 합니다. 비료를 주기 원할 때는 양을 조절해 주세요.

4. 통풍
 광합성에 꼭 필요한 이산화탄소 공급을 위해 통풍과 환기를 주기적으로 해주세요. 충분한 통풍이 이뤄지지 않으면 식물에서 증발된 수분으로 주위 공기가 습해질 수 있습니다. 습한 공기에서는 해충과 질병이(공팡이, 진드기, 뿌리 파리 등) 빠르게 퍼질 수 있습니다.

5. 온도
 보통 식물 생육온도는 15~35도 사이입니다. 날씨가 따뜻한 봄, 여름, 가을은 괜찮지만 겨울에는 기온이 낮아 식물이 얼 수 있습니다. 베란다나 외부에 있는 식물을 집안으로 들이거나 천이나 스티로품 등으로 감싸 보온에 신경 써주세요.

3.4. 씨앗 심기

1. 원예 도구를 이용하여 화분에 흙을 적당량 담습니다. 보통 상토 1L 정도가 들어갑니다.

2. 원예 도구로 표면을 평평하게 다집니다.

3. 원하는 위치에 적아한 깊이와 크기로 씨앗을 심을 구멍을 만듭니다.


4. 파놓은 구멍에 씨앗을 심습니다.


5. 원예 도구를 이용하여 씨앗 위에 흙을 덮습니다.

6. 훍이 촉촉해지도록 물을 줍니다.

7. 스마트팜의 루프를 열고 화분을 넣습니다.


8. 통풍이 잘되고 온도와 햇빛이 적당한 곳에 놓습니다.

9. 새싹이 자라나기 전까지 흙이 마르지 않게 합니다.

※ 종자 재배
 면포, 티슈 등 물에 충분히 적신 후 씨앗을 올린 후 씨앗이 발아할 때까지 스포이드로 물을 떨어뜨려 일정한 습도를 유지합니다.

4. 헥사보드


4.1. 헥사보드 기본형


헥사보드를 연결한 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의 가상핀에 온도, 습도, 토양수분_백분율을 전송하기.




 -. 원하는 자리에 표시하도록 설정합니다. 그리고 값은 3초마다 측정하여 보내도록 합니다. 사실 교육을 위해 시간이 짧은 것이지 실제 스마트팜의 측정은 더 긴 시간 단위로 하겠지요^^
 그리고, Blynk 무료 버전의 경우 데이터를 너무 빠르게 자주 보내면 약간의 시간 뒤 연결이 끊어지는 경우가 많습니다. 





2. Blynk


 이전 헥사보드 코딩에서 우리가 기억해야되는 사항은 LED -> V0, 온도 -> V1, 습도 -> V2,  토양수분_백분율 -> V3 으로 각각의 핀에 대응시켰다는 겁니다. 


 ① 데이타스트림


   units은 필수 사항은 아니고, 우리는 모두 정수(Integer)로 하면 됩니다.


  -. LED



 -. 온도


 -. 습도


 -. 토양수분


 저장하면 모두 간편하게 확인할 수 있습니다.




 ② 웹 대시보드

    

  위젯은 자신이 넣고 싶은 모양으로 넣습니다. 일단 저는 아래와 같이 하였습니다.




  -. LED


  -. 온도 


  -. 습도


 -. 토양 수분



스마트기기의 Blynk App은 PC와 별도로 세팅이 됩니다. App은 아래처럼 해 보았습니다.


 ③ 자동화

자동화를 하기 위해서는 먼저 자동화 타입과 상태 변화, 동작 등의 설정이 필요합니다. 아래처럼 합니다.




 -. 물주기

 토양의 적정 수분량은 식물마다 다르지만 대부분 약 40% 보다 떨어지면 건조하다고 합니다. 그래서, 토양수분이 40% 이하로 떨어지면 App 알람으로 물을 달라고 알람을 보내는 것을 해봅니다.





헥사보드의 기본 프로그래밍을 학습하고자 하실 때는 아래 링크를 참조하세요.


헥사보드 Blynk 관련 이매뉴얼 보기 클릭!

4.2. 헥사보드 자동급수형


헥사보드에 모터 쉴드를 연결하여 사용합니다.




4.2.1. 기구부 제작



4.2.2. 코드 작성 및 동작확인


코드는 일반형에 자동 급수를 위한 워터펌프 동작 스위치만 추가하면 됩니다.


1. EasyBlocks




 


2. Blynk

수중 모터를 V4번에 대응시켜 데이타 스트림과 웹 대시보드를 만들어 줍니다.

 ① 데이타스트림



 ② 웹대시보드

 

5. 아두이노 우노


5.1. 기본형


온도, 습도, 토양 수분, 조도 센서 입력값을 LCD에 표시하고, 밝기에 따라 식물생장 LED를 점멸하는 스마트팜입니다.



5.1.1 기구부 제작

1. 16*2 LCD 조립


 ① LCD 고정판과 볼트, 너트를 준비하고 LCD 고정판에 볼트와 너트를 조립한다.



 ② LCD를 조립된 볼트에 끼우고 너트로 고정한 뒤, 케이블을 색상에 유의하여 아래와 같이 연결한다. 


 

2. 아두이노 우노 보드 거치대 조립


 ① 릴레이와 아두이노 우노 보드에 볼트와 너트를 조립한다.


 ② 보드 고정판에 릴레이와 아두이노 우노 보드를 끼운 뒤 너트로 고정한다.

 

③ 보드 고정판 거치대를 볼트 너트를 이용하여 조립한다. 이 때, 볼트의 방향에 주의한다. 그리고, 센서 쉴드 보드를 아두이노 보드에 조립한다. 



3. 센서 모듈 조립


※ 커넥터는 방향이 있어 거꾸로 끼워지지 않습니다. 아래 사진의 방향대로 연결하면 됩니다.


 ① DIY 선샤인 스마트팜 키트에서 배너와 상단 고정 지지대를 분해한다.


 ② 온습도 센서를 케이블과 연결한 뒤 양면테이프를 붙이고 케이블은 구멍을 통해 밖으로 빼낸다.


 

③ 토양수분 센서의 케이블로 구멍으로 통해 밖으로 빼낸다.



 

 ④ 식물생장 LED를 상단 고정 지지대의 아랫면에 부착한다.


 

⑤ LCD 모듈에 연결된 케이블을 상단 고정 지지대의 구멍으로 하나씩(2개가 동시에 들어가지 않습니다^^) 넣은 뒤 LCD 고정판을 조립한다.


 

⑥ 상단 고정 지지대를 스마트팜에 조립하고 식물생장 LED와 LCD의 케이블은 구멍을 통해 밖으로 빼준다.


 

⑦ 조도센서를 양면테이프로 보드 고정판 거치대에 부착한다. 케이블을 연결하여 보드 고정판 오른쪽 구멍으로 빼내어 정리한다.


 

⑧ 보드 고정판 왼쪽 구멍으로는 토양수분 센서와 식물생장 LED 케이블을, 오른쪽 구멍으로는 LCD와 온습도 센서의 케이블을 빼낸다. 



⑨ 보드 고정판 거치대를 스마트팜에 조립한다.


 ⑩ 아래와 같이 케이블을 연결한다.


5.1.2. 코드 작성 및 동작 확인

  ※ 라이브러리 추가하는 방법 보기→  https://happycreative.co.kr/manual/detail.php?idx=29#811 


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(0x27162); // 화면이 안나오면 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, 1505001000);  
  /* 센서 값을 퍼센트로 변경, 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(00);  // (X축 넘길 갯수, 라인번호) 첫 번째 칸, 첫 번째 줄에 표시
  lcd.print("T : ");
  lcd.print((int)tempValue);
  lcd.print("C");
  lcd.setCursor(80);  // (1칸 띄고, 첫번째 라인)
  lcd.print("H : ");
  lcd.print((int)humValue);
  lcd.print("%");
  lcd.setCursor(21);  // (2칸 띄고, 2번째 라인)
  lcd.print("Soil_M : ");
  lcd.print(SoilValue_per);
  lcd.setCursor(131);  // (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


아두이노 설치, 기본 및 각각의 센서 사용법은 아두이노 페이지를 참조바랍니다.

 -> https://www.happycreative.co.kr/manual/detail.php?idx=29

5.2. 자동 급수형


스마트팜 LCD에 릴레이, 수중모터, 급수 장치 등을 추가하여 수중모터를 토양 수분량에 따라 자동 급수를 하는 스마트팜입니다.


아래 영상입니다.

테스트를 여러번 했더니 흙에 물이 가득이네요^^;;



5.2.1 기구부 제작

1. 16*2 LCD 조립
 ① LCD 고정판과 볼트, 너트를 준비하고 LCD 고정판에 볼트와 너트를 조립한다.



 ② LCD를 조립된 볼트에 끼우고 너트로 고정한 뒤, 케이블을 색상에 유의하여 아래와 같이 연결한다. 


 

2. 아두이노 우노 보드 거치대 조립


 ① 릴레이 2개와 아두이노 우노 보드에 볼트와 너트를 조립한다.




 ② 보드 고정판에 릴레이와 아두이노 우노 보드를 끼운 뒤 너트로 고정한다.

 

③ 보드 고정판 거치대를 볼트 너트를 이용하여 조립한다. 이 때, 볼트의 방향에 주의한다. 그리고, 센서 쉴드 보드를 아두이노 보드에 조립한다. 




3. 센서 모듈 조립


※ 커넥터는 방향이 있어 거꾸로 끼워지지 않습니다. 아래 사진의 방향대로 연결하면 됩니다.


 ① DIY 선샤인 스마트팜 키트에서 배너와 상단 고정 지지대를 분해한다.


 ② 온습도 센서를 케이블과 연결한 뒤 양면테이프를 붙이고 케이블은 구멍을 통해 밖으로 빼낸다.


 

③ 토양수분 센서의 케이블로 구멍으로 통해 밖으로 빼낸다.



 

 ④ 급수 장치 상,하판을 볼트와 너트를 이용하여 조립한다.



 ⑤ 식물생장 LED를 방향에 유의하여 급수 장치에 부착한다.



⑥ 호스에 연결용 젠더를 연결하고 급수 장치에 조립한다.


 ⑦ 급수 장치 양쪽 홈으로 수중펌프 연결 케이블(40cm/ 2Pin/ 검정,빨강)을 넣는다.


 

 ⑧ LCD 모듈에 연결 된 케이블은 상단 고정 지지대의 구멍에 하나씩 넣어 빼낸 후, 급수 장치 상판 중앙의 사각 홈에 넣어 LED 케이블이 있는 방향으로 빼낸다.


 

 ⑨ 상단 고정 지지대에 LCD 고정판을 조립하고, 스마트팜에 조립한다. 케이블과 호스는 양 옆의 구멍으로 빼내어 준다.



 ⑩ 수중 펌프에 연결용 젠더가 끼워진 호스와 케이블을 연결한다.



 ⑪ 조도 센서를 양면테이프로 보드 고정판 거치대에 부착하고, 3Pin 케이블을 연결하여 보드 고정판 오른쪽 구멍으로 빼내어 정리한다.



⑫ 보드 고정판 왼쪽 구멍으로는 토양수분 센서, 식물생장 LED, 수중 펌프 연결 케이블을, 오른쪽 구멍으로는 LCD와 온습도 센서의 케이블을 빼낸다. 




⑬ 보드 고정판 거치대를 스마트팜에 조립한다.




 ⑭ 아래와 같이 케이블을 연결한다.






      -. 모터 스펙을 보면 동작을 위한 전류는 100~200mA 정도로 표시가 되지만, 물 안에서는 부하가 더 걸려 꽤 많은 양이 필요하니 외부 전원을 릴레이에 연결하는 것이 좋습니다. 모터 동작 확인을 할 때는 9V 건전지를 추가로 배럴잭에 연결하고, 본 키트의 실제 활용 시에는 9V 2A의 아답터 사용을 권장합니다.



5.2.2. 코드 작성 및 동작 확인 


모터 동작을 확인을 위해서 배럴잭에 외부 전원으로 9V 건전지(꼭 알카라인으로)를 연결해 줍니다.

9V 건전지는 단순히 동작을 확인하는 것일 뿐, 정상적인 동작을 위해서는 9V 2A  정도의 어댑터 전원을 이용합니다. 수중모터의 노이즈 문제로 간혹 동작 중 온습도가 측정이 되지 않을 수 있습니다.


 ※ 라이브러리 추가하는 방법 보기→  https://happycreative.co.kr/manual/detail.php?idx=29#811


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(0x27162); // 화면이 안나오면 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, 1505001000);  
  /* 센서 값을 퍼센트로 변경, 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(00);  // (X축 넘길 갯수, 라인번호) 첫 번째 칸, 첫 번째 줄에 표시
  lcd.print("T : ");
  lcd.print((int)tempValue);
  lcd.print("C");
  lcd.setCursor(80);  // (1칸 띄고, 첫번째 라인)
  lcd.print("H : ");
  lcd.print((int)humValue);
  lcd.print("%");
  lcd.setCursor(21);  // (2칸 띄고, 2번째 라인)
  lcd.print("Soil_M : ");
  lcd.print(SoilValue_per);
  lcd.setCursor(131);  // (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


아두이노 설치, 기본 및 각각의 센서 사용법은 아두이노 페이지를 참조바랍니다.

6. ESP32 Devkit v1


ESP32 Devkit V1과 Blynk를 활용하여 IoT로 온도, 습도, 토양수분값을 실시간 모니터링하고, 식물생장 LED와 FAN을 제어합니다.

토양수분이 부족하면 비가 내리는 형태로 자동급수하는 기능을 추가하여 재미를 더했습니다.



6.1. 전자부 연결


6.2. 개발환경 구축


아두이노 IDE를 이용하여 개발환경을 구축합니다.



1. 추가 보드 관리자 URL 추가


 -. 기본 설정 



 -. 추가 보드 관리자 URL 찾아보기 클릭



 -. '비공식 보드 지원 URL 목록을 보려면 클릭하십시요' 클릭



 -. 'ctrl + F' 눌러 espressif 검색 후 아래 링크 복사


 주소 복사


 -. 복사된 주소를 붙여넣고, 확인 클릭



 -. 추가 보드 관리자 URL에 주소가 정확하게 삽입이 된 것을 확인 후 확인 클릭



2. 보드 매니저 ESP32 설치

  -. 보드매니저 → esp32 검색 →  esp32 by Espressif Systems 설치


3. 보드 및 포트 선택

 -. 보드 및 포트 선택 클릭


 -. doit 검색 후 DOIT ESP32 DEVKIT V1 선택 후 연결된 포트 번호 선택 


4. Blynk 라이브러리 추가


5. 확인하기

 -. 2번핀은 보드에 장착된 내장 LED 핀입니다. 이 LED를 1초 간격으로 깜빡이는 프로그램 작성 후 업로드 및 동작 확인하여 개발환경 구축이 잘 되었는지 확인합니다.

 
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.3. 코드 작성


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'가 뜨고 클릭하면 접속 코드가 복사됩니다.




  -. 아두이노 스케치의 접속 코드 기재 부분에 붙여 넣습니다.



 3) ESP32 WiFi 연결
 
  -. ESP32가 접속할 WiFi 이름 및 비밀번호를 입력합니다.


 4) 업로드 및 연결 확인 메세지


 -. 업로드 후 시리얼 모니터로 보면 연결 확인 메세지를 볼 수 있습니다.



 -. 메세지가 나타나지 않으면 보드의 'EN' 버튼을 누릅니다.



​코드 작성은 모두 각각의 함수로 만들고 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, 95026001000);  // 물티슈 등을 이용하여 최대 최소값 측정 후 변경
  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(0x3F162); // 화면이 안나오면 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, 95026001000);  // 물티슈 등을 이용하여 최대 최소값 측정 후 변경
  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(00);  // (X축 넘길 갯수, 라인번호) 첫 번째 칸, 첫 번째 줄에 표시
  lcd.print("T : ");
  lcd.print(tempValue);
  lcd.print("C");
  lcd.setCursor(80);  // (1칸 띄고, 첫번째 라인)
  lcd.print("H : ");
  lcd.print(humValue);
  lcd.print("%");
  lcd.setCursor(21);  // (2칸 띄고, 2번째 라인)
  lcd.print("Soil_M : ");
  lcd.print(soilValue_p);
  lcd.setCursor(141);  // (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(0x3F162); // 화면이 안나오면 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, 95026001000);  // 물티슈 등을 이용하여 최대 최소값 측정 후 변경
  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(00);  // (X축 넘길 갯수, 라인번호) 첫 번째 칸, 첫 번째 줄에 표시
  lcd.print("T : ");
  lcd.print(tempValue);
  lcd.print("C");
  lcd.setCursor(80);  // (1칸 띄고, 첫번째 라인)
  lcd.print("H : ");
  lcd.print(humValue);
  lcd.print("%");
  lcd.setCursor(21);  // (2칸 띄고, 2번째 라인)
  lcd.print("Soil_M : ");
  lcd.print(soilValue_p);
  lcd.setCursor(141);  // (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

TOP