챕터 7: Firebase를 활용한 ESP32 IoT 프로젝트
-
학습목표: ESP32에서 수집한 센서 데이터를 Firebase Realtime Database에 저장하고 이를 활용해 데이터를 시각화 및 제어하는 방법을 익힌다.
-
핵심 키워드: ESP32, IoT, Firebase, 실시간 데이터베이스, 빛 센서, 웹앱 호스팅
-
데이터 저장: 장기간의 데이터 보존 및 분석 가능
-
데이터 공유: 여러 디바이스 간 실시간 데이터 공유 가능
-
데이터 분석: 추세 파악 및 장치 성능 개선
-
데이터 보안 및 백업: 안전하고 안정적인 서비스 제공
- ESP32 보드
- ESP32 확장 쉴드
- 빛 감지 센서
- Firebase 계정 (구글 아이디 사용)
- 메뉴에서 ‘Build > Realtime Database’ 선택
- 테스트 모드로 설정
- 데이터베이스 URL 복사
- 익명(Anonymous) 로그인 설정을 활성화
- 프로젝트 설정 > 일반 탭 > 웹 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);
}
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());
}
}
}
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());
}
- 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을 통한 웹 배포
firebase login
firebase init
# hosting 설정 시 기존 프로젝트 선택 및 기본 옵션 사용
firebase deploy
- CLI에 표시된 Hosting URL에 접속 → 실시간 데이터 시각화 확인
- Firebase는 IoT 센서 데이터를 안정적으로 수집, 저장, 시각화할 수 있는 강력한 플랫폼
- ESP32는 실시간 데이터 수집 장치로서 매우 적합하며, Firebase와 함께 활용하면 높은 가시성과 기능성을 제공할 수 있음