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");
  如果要 讀 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);
}


 

 


 





留言

  1. 您好我在ide中加入JsonObject& MyTestObject = jsonBuffer.createObject();//先產生個JSON
    會顯示錯誤,是否是需要define甚麼呢?

    回覆刪除
    回覆
    1. 我把整段程式碼貼上去 你參考看看

      刪除
    2. 謝謝您的協助,問題解決的!

      但是目前遇到
      //JsonObject& humidTime = humidityObject.createNestedObject("timestamp");
      //humidTime[".sv"] = "timestamp"; 這個是產生日期時間用
      我使用這個,他會出現
      ArduinoJson::DynamicJsonBuffer' has no member named 'createNestedObject'
      想詢問如何呈現上傳到firebase時間呢??

      刪除
    3. 你應該是少了宣告
      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 欄位
      }

      刪除
    4. 您好,經過編譯後是正確,但是上傳firebase後出現的時間是一串數字,是否哪裡需要做轉換呢??

      刪除
  2. JsonObject& tempTime = temperatureObject.createNestedObject("timestamp");
    這不是日期時間..我認知錯了
    另外
    IOT: Firebase 最近問題已解決 作者 已更新 firebase-arduino

    回覆刪除
  3. 您好~我想用來做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);
    }

    回覆刪除
  4. 您好,我用esp8266接max30100測血氧但是值都傳不上去,序列阜顯示為pushing /MyTest failed

    回覆刪除

張貼留言

熱門文章