Adafruit.io


Adafruit.io 用於即時線上顯示物聯網專案的 資料。它是一個雲伺服器,可用於透過 Wi-Fi 連線物聯網裝置,並透過儀表板控制這些裝置。它可以作為免費服務使用,並且擁有簡單易用的介面來設計儀表板。身份驗證金鑰可以直接從使用者的帳戶生成,並可以包含在程式中以將物聯網元件連線到相應的儀表板。資料流對於建立連線非常重要,它使用將物聯網電路連線到 Adafruit 儀表板的程式。資料流是用於儲存在儀表板和物聯網電路之間來回傳輸的資料和相關資訊的容器。

本文透過一個簡單的示例,介紹了將物聯網裝置連線到使用 Adafruit.io 建立的線上儀表板的過程。連線是使用 Wi-Fi 建立的。

將物聯網裝置與 Adafruit 儀表板連線的步驟

步驟 1 - 使用 ESP32、BMP180 感測器和一個藍色 LED 製造電路圖。

步驟 2 - 在 Arduino IDE 中編寫 C 語言程式。

步驟 3 - 開啟 https://io.adafruit.com/ 並註冊。登入帳戶並獲取金鑰。

步驟 4 - 為溫度、壓力、海拔高度和藍光設定資料流,然後建立一個儀表板並設定這些資料流的佈局。

步驟 5 - 使用 USB 資料線將電路連線到計算機並執行程式。

步驟 6 - 使用序列埠監視器檢查結果,並檢查儀表板上的讀數。

在 Adafruit.io 上設定資料流

下面介紹了在 Adafruit.io 上設定溫度、壓力、海拔高度和藍光資料流的設定。這些資料流將連線到 Adafruit.io 儀表板以及 BMP180 感測器讀數和藍色 LED。

圖 1:連線儀表板和物聯網裝置資料的所需資料流。

製作電路

將 BMP180 感測器連線到 ESP32。將 SCL 連線到 ESP32 的 D22,將 SDA 連線到 ESP32 的 D21。另外,使用 ESP32 的 D18 引腳連線藍色 LED。將 GND 連線到負軌,將 Vin 連線到正軌。將 ESP32 的 3v3 連線到正軌,將 ESP32 的 GND 連線到負軌。

圖 2:Adafruit.io 專案的電路圖。

編寫程式碼

在 Arduino IDE 中編寫 C 語言程式。程式碼如下:

// Required library to make the connection of Arduino board through internet
#include <WiFi.h>

//required for using BMP180 sensor
#include <Adafruit_BMP085.h>
//required message queue telemetry transport protocol to subscribe and publish feeds
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

/************************* WiFi Access Point *********************************/
//use your own SSID and password
#define WLAN_SSID    "Write SSID Here"
#define WLAN_PASS    "Write Wifi Password here"

/************************* Adafruit.io Setup *********************************/
// the adafruit server to connect
#define AIO_SERVER    "io.adafruit.com"

// the port to connect
#define AIO_SERVERPORT 1883

// get this key from your own Adafruit Account
#define AIO_USERNAME "Write your Adafruit IO username here"
#define AIO_KEY "Write Your Adafruit IO key here"

WiFiClient wclient;

Adafruit_MQTT_Client mqtt(&wclient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

//Feeds Settings

//temperature value that will be read through BMP180 sensor
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

//pressure value that will be read through BMP180 sensor
Adafruit_MQTT_Publish pressure = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/pressure");

//altitude value that will be read through BMP180 sensor
Adafruit_MQTT_Publish altitude = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/altitude");

// Setup a feed called 'bluelight' for subscribing to changes.
Adafruit_MQTT_Subscribe bluelight = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/bluelight");

void MQTT_connect();

const int BLUE_LED = 18;

float t;
float p;
float a;

String stringOne;

Adafruit_BMP085 bmpObj;

void setup() {
   Serial.begin(9600);
   delay(10);
   
   pinMode(BLUE_LED, OUTPUT);
   digitalWrite(BLUE_LED, LOW);
   
   Serial.println("Adafruit MQTT demo");
   
   // Connect to WiFi access point.
   Serial.println(); Serial.println();
   Serial.print("Connecting to ");
   Serial.println(WLAN_SSID);
   
   WiFi.begin(WLAN_SSID, WLAN_PASS);
   while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
   }
   Serial.println();
   
   Serial.println("WiFi connected");
   Serial.println("IP address: "); Serial.println(WiFi.localIP());
   
   // Setup MQTT subscription for bluelight feed.
   mqtt.subscribe(&bluelight);
   if (!bmpObj.begin()) {
      Serial.println("BMP180 Sensor not detected ! ! !");
      while (1) {}
   }
}
uint32_t x = 0;

void loop() {
   t = bmpObj.readTemperature();
   p = bmpObj.readPressure();
   a = bmpObj.readAltitude();
   // a = bmpObj.readAltitude(102000);
   Serial.println(t);
   Serial.println(p);
   Serial.println(a);
   
   delay(100);
   
   MQTT_connect();
   
   Adafruit_MQTT_Subscribe *subscription;
   while ((subscription = mqtt.readSubscription(5000))) {
      if (subscription == &bluelight) {
         Serial.print("Got: ");
         Serial.println((char *)bluelight.lastread);
         digitalWrite(BLUE_LED, HIGH);
         
         stringOne = (char *)bluelight.lastread;
         Serial.print("stringOne: ");
         Serial.println(stringOne);
         
         if (stringOne == "ON") {
            digitalWrite(BLUE_LED, HIGH);
         }
         if (stringOne == "OFF") {
            digitalWrite(BLUE_LED, LOW);
         }
      }
   }
   if (! temperature.publish(t)) {
      Serial.println("Temperature measure Failed");
   } else {
      Serial.println("Temperature measure OK!");
   }
   if (! pressure.publish(p)) {
      Serial.println("pressure measure Failed");
   } else {
      Serial.println("pressure measure OK!");
   }
   if (! altitude.publish(a)) {
      Serial.println("Altitude measure Failed");
   } else {
      Serial.println("Altitude measure OK!");
   }
}
void MQTT_connect() {
   int8_t retvar;
   if (mqtt.connected()) {
      return;
   }
   Serial.print("Connecting to MQTT... ");
   uint8_t trytimes = 3;
   while ((retvar = mqtt.connect()) != 0) {
      Serial.println(mqtt.connectErrorString(retvar));
      Serial.println("retrying MQTT connection in 5500 mseconds...");
      mqtt.disconnect();
      delay(5500); // wait 5 seconds
      trytimes--;
      if (trytimes == 0) {
         while (1);
      }
   }
}

檢視結果 - 在 Adafruit.io 儀表板

圖 3:顯示 Adafruit.io 上的儀表板,其中包含 BMP180 感測器讀數和 LED 控制按鈕。

檢視結果 - 在序列埠監視器

圖 4:顯示執行程式時在序列埠監視器上看到的結果。

本文介紹瞭如何使用 BMP180 感測器、LED 和 ESP32 來使用 Adafruit.io。首先,製作電路。然後登入 Adafruit.io 並建立資料流,然後使用資料流在 Adafruit 上建立一個儀表板。然後使用 Arduino IDE 中的 C 語言編寫程式並執行它,以便在 Adafruit 儀表板和序列埠監視器上檢視結果。

更新於:2023年4月18日

瀏覽量 1K+

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.