10주차 : Firebase를 활용한 ESP32 IoT 프로젝트 - dhryu60/SmartDevice_2025-1 GitHub Wiki

챕터 7: Firebase를 활용한 ESP32 IoT 프로젝트

1. 학습 목표 및 개요

  • 학습목표: ESP32에서 수집한 센서 데이터를 Firebase Realtime Database에 저장하고 이를 활용해 데이터를 시각화 및 제어하는 방법을 익힌다.
  • 핵심 키워드: ESP32, IoT, Firebase, 실시간 데이터베이스, 빛 센서, 웹앱 호스팅

2. Firebase를 사용하는 이유

  • 데이터 저장: 장기간의 데이터 보존 및 분석 가능
  • 데이터 공유: 여러 디바이스 간 실시간 데이터 공유 가능
  • 데이터 분석: 추세 파악 및 장치 성능 개선
  • 데이터 보안 및 백업: 안전하고 안정적인 서비스 제공

3. 사전 준비

  • ESP32 보드
  • ESP32 확장 쉴드
  • 빛 감지 센서
  • Firebase 계정 (구글 아이디 사용)

4. Firebase 프로젝트 설정

(1) 프로젝트 생성

(2) Realtime Database 생성

  • 메뉴에서 ‘Build > Realtime Database’ 선택
  • 테스트 모드로 설정
  • 데이터베이스 URL 복사

(3) 인증(Authentication)

  • 익명(Anonymous) 로그인 설정을 활성화

(4) 웹 API 키 확인

  • 프로젝트 설정 > 일반 탭 > 웹 API 키 복사

5. ESP32 코드 구현 (기본 LED 제어)

헤더 정의 및 설정

#define FIREBASE_HOST "your_database_url"
#define FIREBASE_AUTH "your_api_key"

FirebaseData firebaseData;
FirebaseAuth auth;
FirebaseConfig config;
bool signupOK = false;

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);

  config.api_key = FIREBASE_AUTH;
  config.database_url = FIREBASE_HOST;

  if (Firebase.signUp(&config, &auth, "", "")) {
    Serial.println("Firebase sign-up 성공");
    signupOK = true;
  } else {
    Serial.println("Sign-up 실패: " + config.signer.signupError.message);
  }

  config.token_status_callback = tokenStatusCallback;
  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);
}

LED 제어를 위한 Loop 함수

unsigned long sendDataPrevMillis = 0;

void loop() {
  if (Firebase.ready() && signupOK &&
      (millis() - sendDataPrevMillis > 2000 || sendDataPrevMillis == 0)) {
    
    sendDataPrevMillis = millis();

    int ledState = 0;
    if (Firebase.RTDB.getInt(&firebaseData, "/ledState")) {
      ledState = firebaseData.intData();
      digitalWrite(LED_BUILTIN, ledState == 1 ? HIGH : LOW);
      Serial.println("LED 상태: " + String(ledState));
    } else {
      Serial.println("Firebase 읽기 실패: " + firebaseData.errorReason());
    }
  }
}

6. 빛 감지 센서 값 수집 및 로깅

센서값 측정 코드

int sensorPin = 34;
int value = 0;

void loop() {
  value = analogRead(sensorPin);
  Serial.println("빛 센서값: " + String(value));
  delay(500);
}

타임스탬프 기반 로깅 코드

configTime(0, 0, "pool.ntp.org");  // NTP 서버로 시간 동기화

unsigned long timestamp = getTime();
String parentPath = "/room1/" + String(timestamp);

json.set("lightsensor", String(analogRead(sensorPin)));
json.set("timestamp", String(timestamp));

if (Firebase.setJSON(firebaseData, parentPath.c_str(), json)) {
  Serial.println("데이터 저장 성공");
} else {
  Serial.println("에러: " + firebaseData.errorReason());
}

7. 웹 앱 구현 및 데이터 시각화

Firebase 웹앱 등록

  • Firebase Console > Web App 등록
  • <script> 코드 복사 → index.html에 포함

주요 자바스크립트 코드 (요약)

const dbRef = firebase.database().ref("room1");
dbRef.orderByKey().limitToLast(20).on('child_added', snapshot => {
  let data = snapshot.val();
  let value = Number(data.lightsensor);
  let time = epochToDateTime(data.timestamp);

  dataTable.addRow([time, value]);
  chart.draw(dataTable, options);
});

8. Firebase Hosting을 통한 웹 배포

CLI 설치 및 초기화

firebase login
firebase init
# hosting 설정 시 기존 프로젝트 선택 및 기본 옵션 사용
firebase deploy

결과

  • CLI에 표시된 Hosting URL에 접속 → 실시간 데이터 시각화 확인

마무리 정리

  • Firebase는 IoT 센서 데이터를 안정적으로 수집, 저장, 시각화할 수 있는 강력한 플랫폼
  • ESP32는 실시간 데이터 수집 장치로서 매우 적합하며, Firebase와 함께 활용하면 높은 가시성과 기능성을 제공할 수 있음

PPT 및 소스코드 : 단톡방에...

⚠️ **GitHub.com Fallback** ⚠️