우당탕탕 배움 일기
ESP8266 이용해 Firebase에 데이터 올리기 본문
첫 번째 포스팅으로 esp8266을 이용해 Firebase에 데이터를 올리는 예제를 적어보려 한다.
초보자인 나는 모르는 것이 많아서 참 많이 헤매고 삽질하고.. 며칠을 고생했다..
다른 사람들의 포스팅과 강의도 봤지만 하나씩 막히는 부분이 있어서 제자리를 빙빙 돌기만 했다ㅜㅜ
아무튼 삽질 끝에 성공했고, 그 과정을 정리 겸 기록하려 한다.
이 예제는 ESP8266를 이용해 Firebase에 데이터를 올리는 것이고,
코드의 형태는 15초마다 데이터베이스에 int와 float 숫자를 삽입하는 형태이다.
https://randomnerdtutorials.com/esp8266-nodemcu-firebase-realtime-database/
이 포스팅에서 부족한 부분은 위 포스팅을 참고하면 된다.
˙ Firebase
먼저 파이어베이스쪽 설정 과정이다.
1. 아래 링크를 통해 파이어베이스를 들어간다.
2. 시작하기를 누른다.
3. 프로젝트를 추가해준다.
4. 프로젝트를 만들어준다.
여기까지 하고 프로젝트 만들기 클릭!
프로젝트는 간단하게 만들어진다. ㅎㅎ
5. Authentication 설정
이메일 설정을 해줘야 API키가 발급되기 때문에 먼저 진행을 해준다.
시작하기 클릭
먼저 이메일/비밀번호 들어간다.
저장!
이메일 설정 완료 됐고 바로 익명 접속 허용까지 해준다.
저장까지 해주면 끝이다.
익명 접속 허용에 관한 부분이 대부분 언급되어 있지 않아서 오류 잡는데 힘을 많이 썼다..ㅠㅠ
내가 겪은 오류에 관한 건 포스팅 끝에 추가해도록 하겠다.
6. Realtime Database 만들기
빌드-Realtime Database 들어가 데이터베이스 만들기를 누른다.
여기까지 설정 후 사용 설정을 누르면 실시간 데이터베이스가 생성된다!
이런 형태이다.
이제 아두이노 측에 넣어야 할 부분의 정보들을 추출한다.
7. Firebase URL, API 저장
먼저 url 을 복사해둔다. 왼쪽 클립 모양을 누르면 복사가 뜬다.
이제 API키를 복사할 차례다.
왼쪽 프로젝트 개요 옆 톱니바퀴를 누른 후 프로젝트 설정을 클릭한다.
프로젝트 정보들이 이곳에 저장되어 있다.
정보 보안을 위해 지워뒀지만 영문과 숫자로 된 API키가 발급되어 있는 것을 확인 할 수 있다.
(*이는 이메일 설정을 완료해야만 발급된다!!)
여기까지 하면 파이어베이스쪽 설정은 완료다.
˙ ESP8266(Arduino IDE)
1. 스케치 > 라이브러리 포함 > 라이브러리 관리
firebase esp 검색 후 Firebase Arduino Client Library for ESP8266 and ESP32 라이브러리를 설치해 준다.
버전은 2.3.7로 install 해준다.
보드는 Node MCU1.0 으로 설정해주고, 포트도 본인에 맞게 설정해준다.
2. 코드 업로드
/*
Rui Santos
Complete project details at our blog.
- ESP32: https://RandomNerdTutorials.com/esp32-firebase-realtime-database/
- ESP8266: https://RandomNerdTutorials.com/esp8266-nodemcu-firebase-realtime-database/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
Based in the RTDB Basic Example by Firebase-ESP-Client library by mobizt
https://github.com/mobizt/Firebase-ESP-Client/blob/main/examples/RTDB/Basic/Basic.ino
*/
#include <Arduino.h>
#if defined(ESP32)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <Firebase_ESP_Client.h>
//Provide the token generation process info.
#include "addons/TokenHelper.h"
//Provide the RTDB payload printing info and other helper functions.
#include "addons/RTDBHelper.h"
// Insert your network credentials
#define WIFI_SSID "와이파이 이름"
#define WIFI_PASSWORD "와이파이 비밀번호"
// Insert Firebase project API Key
#define API_KEY "본인 Firebase API키"
#define DATABASE_URL "본인 Firebase URL"
//Define Firebase Data object
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
unsigned long sendDataPrevMillis = 0;
int count = 0;
bool signupOK = false;
void setup(){
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(1000);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
/* Assign the api key (required) */
config.api_key = API_KEY;
/* Assign the RTDB URL (required) */
config.database_url = DATABASE_URL;
/* Sign up */
if (Firebase.signUp(&config, &auth, "", "")){
Serial.println("ok");
signupOK = true;
}
else{
Serial.printf("%s\n", config.signer.signupError.message.c_str());
}
/* Assign the callback function for the long running token generation task */
config.token_status_callback = tokenStatusCallback; //see addons/TokenHelper.h
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
}
void loop(){
if (Firebase.ready() && signupOK && (millis() - sendDataPrevMillis > 15000 || sendDataPrevMillis == 0)){
sendDataPrevMillis = millis();
// Write an Int number on the database path test/int
if (Firebase.RTDB.setInt(&fbdo, "test/int", count)){
Serial.println("PASSED");
Serial.println("PATH: " + fbdo.dataPath());
Serial.println("TYPE: " + fbdo.dataType());
}
else {
Serial.println("FAILED");
Serial.println("REASON: " + fbdo.errorReason());
}
count++;
// Write an Float number on the database path test/float
if (Firebase.RTDB.setFloat(&fbdo, "test/float", 0.01 + random(0,100))){
Serial.println("PASSED");
Serial.println("PATH: " + fbdo.dataPath());
Serial.println("TYPE: " + fbdo.dataType());
}
else {
Serial.println("FAILED");
Serial.println("REASON: " + fbdo.errorReason());
}
}
}
위 코드를 삽입하고 업로드한 후 모니터를 보면
와이파이를 연결 후 파이어베이스측에 정상적으로 접속하면 ok를 보내고 숫자를 발급한다.
그리고 파이어베이스 쪽을 보면
이렇게 float값과 int값이 계속적으로 업데이트 되며 보여지는 걸 확인 할 수 있다 !!
-
여기까진 정상적이고 해피한 스토리이지만.. 이 결과를 얻기까지 꽤나 오랜 시간 삽질했다ㅜㅜ
초보자인 나에게 오류를 보고 무슨 오류인지 예상하는 건 힘들었고.. 또 오류에 관한 내용이 구글에 많지 않아 이리저리 물어보고 물어보고.. 물어봤다..
막 API키가 잘못 발급 되었다, 복사가 잘못되었다 등등.. 보이는데로 다 다시 해보고 갈아엎고 반복했고.. 이 쉬운 예제를 해결 못하나 싶어서 자신감도 뚝뚝 떨어졌다ㅜㅜ
하지만 고생한 거보다 간단하게 문제는 해결됐고.. 문제가 해결되자마자 고생했던 마음은 다 사라졌다ㅠ
이게 내가 계속 떴던 오류이다.. token info: type = id token, status = on request error
구글에선 API 문제라고만 나오고 제대로 된 해결 방법을 찾지 못했다.
이 문제 해결은 아두이노에 설치했던 firebase 라이브러리를 다운그레이드 하는 것으로 해결했다!
먼저 파이어베이스를 다뤄본 사람에게 물어봤고.. 라이브러리를 다운그레이드 해보라는 조언을 얻고 해결했다ㅠㅠ
또 이게 해결되자마자 admin_only_operation 라는 오류가 떴는데, 이건 자격에 대한 오류로
파이어베이스 설정하며 설정했던 익명 접속 허용에 관한 것이었다.
내가 봤던 포스팅들엔 익명접속에 대한 언급이 없어서 몰랐었다..
이렇게 적어보니 별 거 아닌 오류이지만 그때 당시 나에겐 세상 제일 큰 문제였다ㅜㅜ
그래도 해결되니 감사하지만.. ^^
이제는 라즈베리파이-파이어베이스도 해보고 데이터 쌓는 것도 해보고..
갈 길이 아~주 멀다..