IOT Arduino 控制 Firebase 資料庫筆記
前面控制LED 就是遠端存取資料庫的變化 只是這資料庫不用自己架
但重點還是如何存取 Firebase
開發SQL 也是要裝函式庫才能存取 不是說動就動
Arduino 既然已有人開發出 FirebaseArduino
那就研究一下 怎麼用
Firebase 跟 Arduino IDE 怎麼架? 前面有講
這邊專注怎麼用
我是先用DHT11 或 22 取得 溫度 濕度
1.存資料
不用像SQL要建立新增欄位幹嘛的 他就是一個JSON檔案存取
Firebase.setFloat("relal_t", t);
//字串 Firebase.setString("message", "hello world");
//布林 Firebase.setBool("truth", false);
//檢查錯誤 每個後面加一下 保險一點
if (Firebase.failed()) {
Serial.print("setting /relal_t failed:");
Serial.println(Firebase.error());
return;
}
這時去看 Firebase 資料庫 就會有個欄位 relal_t:23.9
就是這樣簡單
但特別的地方在於 他有 Log 跟 結構存取
JsonObject& MyTestObject = jsonBuffer.createObject();//先產生個JSON
//JsonObject& humidTime = humidityObject.createNestedObject("timestamp");
//humidTime[".sv"] = "timestamp"; 這個是產生日期時間用
MyTestObject["t"] = t;//加欄位 溫度值
MyTestObject["h"] = h;//加欄位 濕度值
//Firebase.push("MyTest", MyTestObject);// MyTestObject 放到 humidity 下
這個會一直產生新標籤 一筆一筆 往下寫
Firebase.set("MyTest", MyTestObject);// MyTestObject 放到 humidity 下
這個會就只寫一筆
注意: 因為是同名字 所以如果前面 LOG記了一堆
用同名字 不是用 push 直接 set
LOG會被蓋掉
2.取資料
Firebase.getFloat("relal_t")
同樣也有
//字串 Firebase.getString("relal_t");
//布林 Firebase.getBool("relal_t");
*******************************************
簡單存取是沒問題
現在有幾個 問題 我還再找
基本都是Log問題
Firebase Log格式 怎麼畫出表格?
像 http://ubidots.com 就會幫你畫
Firebase 好像要自己搞?
怎麼讀LOG最後一筆 ? 這也牽涉到 怎麼讀一個範圍? 一次讀 量多會死人的
目前會的功能 已足夠
遠端控制 Esp8266 IO
讀取 感應器 應該都沒問題.
整段程式碼 只是讀感應傳上去資料
#include "DHT.h"
//將 https://github.com/adafruit/Adafruit_Sensor 複製到
//$ARDUINO_HOME$/libraries/Adafruit_Sensor/Adafruit_Sensor.h。
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#define DHTPIN D4 //D4=2 what digital pin we're connected to
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Set these to run example.
#define FIREBASE_HOST "你申請時FIREBASE給的"
#define FIREBASE_AUTH "你申請時FIREBASE給的"
#define WIFI_SSID "你家WiFi"
#define WIFI_PASSWORD "你家WiFi"
DHT dht(DHTPIN, DHTTYPE);
int counti=0;
void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");
dht.begin();
// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
//read DHT
float h = dht.readHumidity();//濕度
float t = dht.readTemperature();//讀取溫度達攝氏
float f = dht.readTemperature(true);//華氏
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (the default)計算熱量指數在華氏
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false) 計算熱量指數在攝氏
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
//****************************
//**** 上傳 Firebase *****
//****************************
DynamicJsonBuffer jsonBuffer;
JsonObject& MyTestObject = jsonBuffer.createObject();
MyTestObject["n"] =counti++;
MyTestObject["t"] = t;//濕度值
MyTestObject["h"] = h;//濕度值
//Firebase.push("MyTest", MyTestObject);// MyTestObject 放到 humidity 下
Firebase.set("MyTest", MyTestObject);// MyTestObject 放到 humidity 下
// handle error
if (Firebase.failed()) {
Serial.print("pushing /MyTest failed:");
Serial.println(Firebase.error());
return;
}
Serial.println("Push success");
delay(5000);
}
但重點還是如何存取 Firebase
開發SQL 也是要裝函式庫才能存取 不是說動就動
Arduino 既然已有人開發出 FirebaseArduino
那就研究一下 怎麼用
Firebase 跟 Arduino IDE 怎麼架? 前面有講
這邊專注怎麼用
我是先用DHT11 或 22 取得 溫度 濕度
1.存資料
不用像SQL要建立新增欄位幹嘛的 他就是一個JSON檔案存取
Firebase.setFloat("relal_t", t);
//字串 Firebase.setString("message", "hello world");
//布林 Firebase.setBool("truth", false);
//檢查錯誤 每個後面加一下 保險一點
if (Firebase.failed()) {
Serial.print("setting /relal_t failed:");
Serial.println(Firebase.error());
return;
}
這時去看 Firebase 資料庫 就會有個欄位 relal_t:23.9
就是這樣簡單
但特別的地方在於 他有 Log 跟 結構存取
JsonObject& MyTestObject = jsonBuffer.createObject();//先產生個JSON
//JsonObject& humidTime = humidityObject.createNestedObject("timestamp");
//humidTime[".sv"] = "timestamp"; 這個是產生日期時間用
MyTestObject["t"] = t;//加欄位 溫度值
MyTestObject["h"] = h;//加欄位 濕度值
//Firebase.push("MyTest", MyTestObject);// MyTestObject 放到 humidity 下
這個會一直產生新標籤 一筆一筆 往下寫
Firebase.set("MyTest", MyTestObject);// MyTestObject 放到 humidity 下
這個會就只寫一筆
注意: 因為是同名字 所以如果前面 LOG記了一堆
用同名字 不是用 push 直接 set
LOG會被蓋掉
Firebase.getFloat("relal_t")
同樣也有
//字串 Firebase.getString("relal_t");
//布林 Firebase.getBool("relal_t");
如果要 讀 MyTest 下的 h
Firebase.getFloat("MyTest/h");*******************************************
簡單存取是沒問題
現在有幾個 問題 我還再找
基本都是Log問題
Firebase Log格式 怎麼畫出表格?
像 http://ubidots.com 就會幫你畫
Firebase 好像要自己搞?
怎麼讀LOG最後一筆 ? 這也牽涉到 怎麼讀一個範圍? 一次讀 量多會死人的
目前會的功能 已足夠
遠端控制 Esp8266 IO
讀取 感應器 應該都沒問題.
整段程式碼 只是讀感應傳上去資料
#include "DHT.h"
//將 https://github.com/adafruit/Adafruit_Sensor 複製到
//$ARDUINO_HOME$/libraries/Adafruit_Sensor/Adafruit_Sensor.h。
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#define DHTPIN D4 //D4=2 what digital pin we're connected to
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Set these to run example.
#define FIREBASE_HOST "你申請時FIREBASE給的"
#define FIREBASE_AUTH "你申請時FIREBASE給的"
#define WIFI_SSID "你家WiFi"
#define WIFI_PASSWORD "你家WiFi"
DHT dht(DHTPIN, DHTTYPE);
int counti=0;
void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");
dht.begin();
// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
//read DHT
float h = dht.readHumidity();//濕度
float t = dht.readTemperature();//讀取溫度達攝氏
float f = dht.readTemperature(true);//華氏
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (the default)計算熱量指數在華氏
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false) 計算熱量指數在攝氏
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
//****************************
//**** 上傳 Firebase *****
//****************************
DynamicJsonBuffer jsonBuffer;
JsonObject& MyTestObject = jsonBuffer.createObject();
MyTestObject["n"] =counti++;
MyTestObject["t"] = t;//濕度值
MyTestObject["h"] = h;//濕度值
//Firebase.push("MyTest", MyTestObject);// MyTestObject 放到 humidity 下
Firebase.set("MyTest", MyTestObject);// MyTestObject 放到 humidity 下
// handle error
if (Firebase.failed()) {
Serial.print("pushing /MyTest failed:");
Serial.println(Firebase.error());
return;
}
Serial.println("Push success");
delay(5000);
}
您好我在ide中加入JsonObject& MyTestObject = jsonBuffer.createObject();//先產生個JSON
回覆刪除會顯示錯誤,是否是需要define甚麼呢?
我把整段程式碼貼上去 你參考看看
刪除謝謝您的協助,問題解決的!
刪除但是目前遇到
//JsonObject& humidTime = humidityObject.createNestedObject("timestamp");
//humidTime[".sv"] = "timestamp"; 這個是產生日期時間用
我使用這個,他會出現
ArduinoJson::DynamicJsonBuffer' has no member named 'createNestedObject'
想詢問如何呈現上傳到firebase時間呢??
你應該是少了宣告
刪除DynamicJsonBuffer jsonBuffer;
以下是我 擷取一段Code 只是測試(不能跑)
你貼上試試看 編譯可不可通過
#include
void setup() {
// put your setup code here, to run once:
}
void loop() {
float h = 0;//濕度
float t = 0;//讀取溫度達攝氏
DynamicJsonBuffer jsonBuffer; //要宣告
/*產生 時間的 log*/
JsonObject& temperatureObject = jsonBuffer.createObject();//開一個 Json
JsonObject& tempTime = temperatureObject.createNestedObject("timestamp");//Json 下 開一個 timestamp 日期時間
temperatureObject["value"] = t;//攝氏值
tempTime[".sv"] = "timestamp";
Firebase.push("temperature", temperatureObject);//推上去 temperature 欄位
//濕度
JsonObject& humidityObject = jsonBuffer.createObject();
JsonObject& humidTime = humidityObject.createNestedObject("timestamp");
humidityObject["value"] = h;//濕度值
humidTime[".sv"] = "timestamp";
Firebase.push("humidity", humidityObject);//推上去 temperature 欄位
}
您好,經過編譯後是正確,但是上傳firebase後出現的時間是一串數字,是否哪裡需要做轉換呢??
刪除JsonObject& tempTime = temperatureObject.createNestedObject("timestamp");
回覆刪除這不是日期時間..我認知錯了
另外
IOT: Firebase 最近問題已解決 作者 已更新 firebase-arduino
您好~我想用來做RFID將卡的內碼上傳到FIREBASE資料庫卡片是讀取成功但是上傳一直失敗
回覆刪除顯示pushing /rfidoit failed:可以請問一下出了什麼問題嗎?
/*
PINOUT:
RC522 MODULE Uno/Nano MEGA
SDA D4 D9
SCK D13 D52
MOSI D11 D51
MISO D12 D50
IRQ N/A N/A
GND GND GND
RST D2 D8
3.3V 3.3V 3.3V
*/
#include
#include
#include
/* Include the standard Arduino SPI library */
#include
/* Include the RFID library */
#include
/* Define the DIO used for the SDA (SS) and RST (reset) pins. */
#define SDA_DIO 4
#define RESET_DIO 2
/* Create an instance of the RFID library */
RFID RC522(SDA_DIO, RESET_DIO);
// Set these to run example.
#define FIREBASE_HOST "https://rfidoit.firebaseio.com"
#define FIREBASE_AUTH "AIzaSyBELhCRWhhLP7toQg1cSh795wtIZho0avE"
#define WIFI_SSID "ZIEN"
#define WIFI_PASSWORD "94871234"
void setup()
{
Serial.begin(9600);
/* Enable the SPI interface */
SPI.begin();
/* Initialise the RFID reader */
RC522.init();
// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop()
{
/* Has a card been detected? */
if (RC522.isCard())
{
/* If so then get its serial number */
RC522.readCardSerial();
Serial.println("Card detected:");
for(int i=0;i<5;i++)
{
Serial.print(RC522.serNum[i],DEC);
//Serial.print(RC522.serNum[i],HEX); //to print card detail in Hexa Decimal format
}
Serial.println();
Serial.println();
DynamicJsonBuffer jsonBuffer;
JsonObject&rfidoitObject = jsonBuffer.createObject();
rfidoitObject["i"];
Firebase.push("rfidoit",rfidoitObject);// MyTestObject 放到 humidity 下
//Firebase.setFloat("rfidoit/object",rfidoitObject);// MyTestObject 放到 humidity 下
// handle error
if (Firebase.failed()) {
Serial.print("pushing /rfidoit failed:");
Serial.println(Firebase.error());
return;
}
Serial.println("Push success");
delay(5000);
}
delay(1000);
}
您好,我用esp8266接max30100測血氧但是值都傳不上去,序列阜顯示為pushing /MyTest failed
回覆刪除