본문 바로가기
아두이노(Arduino)/사물인터넷(ESP8266)

[ESP8266.011] 앱과 Firebase로 스마트홈 제어하기

by 긱펀 2022. 3. 27.
반응형

< 이번 시간에 다루는 실습 내용은 "아두이노 통신 프로젝트(디지털북스, 우지윤 저)" 책의 내용으로서, 더 다양하고 자세한 내용을 알고 싶으시면 아래의 링크에서 책을 구매하시면 됩니다 >

 

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788960883925&orderClick=LAG&Kc=

 

아두이노 통신 프로젝트 - 교보문고

이 책의 구성 Chapter 01 아두이노 개론 아두이노란 무엇인지 알아보고 아두이노를 제어하기 위해 필요한 하드웨어와 소프트웨어를 준비해 봅니다. 그리고 아두이노 프로그램을 코딩하기 위해 필

www.kyobobook.co.kr

 


 

 

[ESP8266.011] 앱과 Firebase로 스마트홈 제어하기

 

 

🏠 스마트홈 제어용 ESP8266 프로그램 설계

 

스마트홈 앱

 

 

 

 

🚩 오늘의 실습 회로도

 

 

ESP8266과 Easy module shield

 

 

 

스마트홈 제어용 앱

 

 

* 회로도 부품 구매처

 

https://www.devicemart.co.kr/goods/view?no=1312096

https://www.devicemart.co.kr/goods/view?no=1279493 


  

 

🚩 파이어베이스란(Firebase)

  • 파이어 베이스는 실시간으로 데이터를 온라인에 저장하고 가져올 수 있는 기능을 제공합니다.
  • 파이어베이스에 대해 자세히 설명하는 아래의 유튜브 영상을 참고해 주세요.
What is Firebase ?

 

Firebase 기능

 

 

 

🚩 Firebase 설정하기

(1) Firebase에 로그인하고 콘솔로 이동합니다.

 

(2) 프로젝트 만들기 or 프로젝트 추가 버튼을 누릅니다.

 

(3) 프로젝트를 시작하기 위해 이름을 입력하고 "프로젝트 만들기"를 클릭 합니다.

 

(4) 프로젝트가 준비되면, 데이터를 저장할 데이터베이스를 만들기 위해 "데이터베이스 만들기"를 클릭합니다.

그리고 테스트모드로 설정하고 "사용설정"을 클릭하면 나만의 구글 데이터베이스가 만들어집니다.

 

(5) 나만의 구글 데이터베이스의 비밀번호를 복사하여 아두이노 코드의 "DATABASE_SECRET"에 붙여넣습니다.

[아두이노 코드 다운받기]
아두이노 실습 코드는 다음의 링크에 접속하여, 책 "아두이노 통신 프로젝트"의 실습코드를 다운받아 code_5.3을 열면 확인할 수 있습니다.
-링크: https://wooduino.tistory.com/71?category=512042
 

003. 책 실습 예제&정답 코드

[1] 아두이노 통신 프로젝트 책에서 각 챕터별로 다루는 모든 실습예제의 코드를 아래에서 다운 받으실 수 있습니다. [2] 확인문제 정답 코드는 아래에서 다운 받으실 수 있습니다.

wooduino.tistory.com

 

 

(6) Firebase의 데이터베이스 주소를 복사하여 아두이노 코드에 붙여넣습니다.

 

 

 

🚩 나만의 스마트홈 앱 만들기(with Firebase)

(1) 앱을 만들기 위한 앱인벤터 실습파일은 다음의 링크에 접속하여, "code_5_3_1_App_Only_Design.aia"파일을 다운받아 앱인벤터에서 열면 확인할 수 있습니다.

https://wooduino.tistory.com/37?category=512042 

 

002.책 실습 참고자료 다운로드

"아두이노 통신 프로젝트" 책의 실습에 필요한 자료를 다운 받을 수 있는 곳입니다. [1] CH2.2 I2C LCD 실습에 필요한 라이브러리를 아래 링크에서 다운받으세요. [2] CH340 드라이버 프로그램을 아래

wooduino.tistory.com

*앱인벤터란?
=> 앱인벤터는 안드로이드용 스마트폰 앱을 블록코딩으로 빠르고 쉽게 만들 수 있는 온라인 사이트입니다.
=> 앱인벤터에 대한 기초 학습과 아두이노에 활용하는 방법에 대해서는 아래 책의 내용을 참고해 주세요.

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788960882201&orderClick=LAG&Kc= 

 

앱인벤터+아두이노 스마트폰 앱 프로젝트 - 교보문고

앱인벤터로 스마트폰 앱을 직접 만들고 아두이노와 연동하는 11가지 프로젝트 수록생활 속 스마트 제품을 아두이노와 앱인벤터를 통해 직접 만들고 싶은 분께 추천!2018년을 맞아 드디어 우리나

www.kyobobook.co.kr

 

 

(2) "code_5_3_1_App_Only_Design.aia"를 앱인벤터에 불러와서 아래 그림과 같이 비밀번호와 URL주소를 복사하여 앱 개발 환경의 Firebase 요소에 붙여넣어줍니다.

 

 

🚩 앱인벤터와 아두이노 Full 코드

 

📱 앱인벤터 코드

파이어베이스 앱인벤터 Full코드

 

💻 아두이노 코드

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
//실습코드 5.3.1_Arduino
#include <ESP8266WiFi.h>          // WiFi 통신용 라이브러리
#include <Firebase_ESP_Client.h>  // Firebase 통신용 라이브러리
#include <addons/RTDBHelper.h>    // Firebase의 Realtime Database에 대한 정보처리 라이브러리
#include <SimpleDHT.h>            // DHT 센서 라이브러리
 
#define WIFI_SSID "KT_asdfd_G4412"    // 우리집 WiFi 이름
#define WIFI_PASSWORD "abcd1234"  // 우리집 WiFi 비밀번호
#define DATABASE_URL "adds8453-firebase-default-rtdb.firebaseio.com" // RTDB의 URL
#define DATABASE_SECRET "4d14adsafadfdsafdsaf12dsz"    // RTDB의 비밀번호
#define LED1_PIN    D13   // LED 13번 핀
#define LED2_PIN    D12   // LED 12번 핀
#define DHT_PIN     D4    // 센서 4번핀
SimpleDHT11 dht11(DHT_PIN); // DHT 센서 객체      
FirebaseData fbdo;  // Firebase 데이터 객체
FirebaseAuth auth;  // Firebase 인증용 객체
FirebaseConfig config;  // Firebase 설정용 객체
unsigned long dataMillis = 0// 시간 업데이트 변수
int LED1_value, LED2_value, Temp_value, Humi_value;  // LED와 센서 상태값 변수
 
void setup() {
  pinMode(LED1_PIN, OUTPUT); pinMode(LED2_PIN, OUTPUT);    // LED 출력모드
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);   // WiFi 접속 시작
  while (WiFi.status() != WL_CONNECTED) {
      Serial.print(".");  delay(1000);
  }
  Serial.println();
  Serial.print("Connected with IP: ");
  Serial.println(WiFi.localIP());     // 로컬 IP주소 확인
  Serial.printf("Firebase Client v%s\n\n", FIREBASE_CLIENT_VERSION);  // 클라이언트 버전확인
  config.database_url = DATABASE_URL;                   // RTDB의 URL 적용
  config.signer.tokens.legacy_token = DATABASE_SECRET;  // RTDB의 비밀번호 적용
  Firebase.reconnectWiFi(true);                         // Firebase 재접속 허용
  Firebase.begin(&config, &auth);                       // 인증과 설정을 적용하여 Firebase 시작
  delay(1000);
  /***** Firebase RTDB 저장소에 LED와 센서의 첫 상태값을 업데이트 하기 *****/
  if(Firebase.RTDB.setInt(&fbdo,"/LED1",digitalRead(LED1_PIN))==true) Serial.println("LED1 set ok");
  if(Firebase.RTDB.setInt(&fbdo,"/LED2",digitalRead(LED2_PIN))==true) Serial.println("LED2 set ok");
}
void loop() {
  if (millis() - dataMillis > 3000) { // 3초에 1번씩 실행
    dataMillis = millis();  // 시간 타이머 업데이트
    /***** Firebase에서 LED 상태값 읽어와 LED on, off 제어하기 *****/
    if( Firebase.RTDB.getInt(&fbdo, "/LED1"== true ) {    // LED1태그의 값을 읽어 왔다면,
      String temp = fbdo.to<const char *>();                // 그 값을 temp에 저장하고,
      LED1_value = temp.toInt();                            // temp값을 정수형으로 바꿔,
      Serial.print("LED1: "); Serial.println(LED1_value);   // 시리얼 모니터에 출력하기
    } else Serial.println(fbdo.errorReason().c_str());        // 에러 발생시 이유 출력하기
    
    if( Firebase.RTDB.getInt(&fbdo, "/LED2"== true ) {    // LED2태그의 값을 읽어 왔다면,
      String temp = fbdo.to<const char *>();                // 그 값을 temp에 저장하고,
      LED2_value = temp.toInt();                            // temp값을 정수형으로 바꿔,
      Serial.print("LED2: "); Serial.println(LED2_value);   // 시리얼 모니터에 출력하기
    } else Serial.println(fbdo.errorReason().c_str());        // 에러 발생시 이유 출력하기
    digitalWrite(LED1_PIN, LED1_value);   // LED1에 상태값 적용하여 on, off 하기
    digitalWrite(LED2_PIN, LED2_value);   // LED2에 상태값 적용하여 on, off 하기
 
    /***** Firebase에 온습도 센서값을 보내어 저장하기 *****/
    byte temperature = 0byte humidity = 0int err = SimpleDHTErrSuccess;
    // 온도와 습도 센서값을 측정하여 변수에 저장하기
    if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
      Serial.print("Read DHT11 failed"); return;
    }
    // Firebase의 Temperature태그에 온도 센서값 저장하기
    if(Firebase.RTDB.setInt(&fbdo,"/Temperature",temperature)==true
      Serial.println("Temperature set ok");  
    else  Serial.println(fbdo.errorReason().c_str());
    // Firebase의 Humidity태그에 습도 센서값 저장하기
    if(Firebase.RTDB.setInt(&fbdo,"/Humidity",humidity) == true) Serial.println("Humidity set ok");  
    else  Serial.println(fbdo.errorReason().c_str());
  }
}
cs

 

🌈 위 코드에 대한 라이브러리 설치 및 자세한 사용법에 대한 문의는 댓글을 달아주시거나 아래 책을 구매해서 참고하시면 됩니다.

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788960883925&orderClick=LAG&Kc=

 

아두이노 통신 프로젝트 - 교보문고

이 책의 구성 Chapter 01 아두이노 개론 아두이노란 무엇인지 알아보고 아두이노를 제어하기 위해 필요한 하드웨어와 소프트웨어를 준비해 봅니다. 그리고 아두이노 프로그램을 코딩하기 위해 필

www.kyobobook.co.kr

 

 

 

🚩 실행결과 확인하기

 

 

 

 

 

🏁 퀴즈

  • ESP8266 보드에 2개의 LED를 더 연결하고, 앱인벤터에도 그 LED를 제어할 버턴을 추가하여 총 LED 4개를 제어해 보세요.
  • 가변저항 센서를 ESP8266 보드의 A0 핀에 연결하여 앱에서 센서값을 확인할 수 있게 만들어 보세요. 
728x90
반응형

댓글