資料介紹
描述
使用這個 Activewear Suggestion 站,在晨跑時根據室內和室外熱指數之間的差異來尋找合適的衣服變得更加容易。這是使用帶有格羅夫防護罩和開放天氣地圖“當前天氣數據”API 的粒子硼構建的。
我連接了一個 DHT 11 傳感器來收集室內溫度/相對濕度和一個 OLED 屏幕來顯示從開放天氣地圖收集的室內和室外溫度/相對濕度。最后,一個 RGB LED 會根據使用我們的室內熱指數和室外熱指數函數計算的室內和室外熱指數之間的差異來改變顏色。
對于這個項目,我將使用 Particle Workbench,它在一個易于安裝的軟件包中提供了物聯網開發所需的所有工具、庫和擴展。
此外,通過單擊此鏈接,您將被帶到作為集成開發環境的 Particle Web IDE;它恰好在您的網絡瀏覽器中運行。這將包含為您預加載的所有代碼。您需要做的就是復制項目。
由于 Grove 系統的易用性,即使您剛剛開始,這也應該是一個簡單易懂的項目。
目標:
該項目的目標是收集和比較室內和室外熱量指數。熱量指數結合了空氣溫度和相對濕度,因為“重要的不是熱量,而是濕度”。這讓我可以在早上快速決定是否應該在晨跑之前穿額外的運動服。
代碼亮點
雖然復制代碼和調用項目完成很容易,但有必要查看一些程序邏輯部分以了解發生了什么。
步驟1:
該項目的第一步是在 Grove FeatherWing 上添加硼并連接所有傳感器。使用 Grove 不需要焊接。只需插入傳感器,您就可以專注于編碼和集成!
下面是 Grove FeatherWing 上的傳感器連接圖表:
連接:
有關詳細信息,請查看頁面底部的示意圖↓
第2步:
成功連接傳感器后,現在我們將預先設置庫的包含和變量定義。
在代碼的開頭,您將看到#include
哪些用于在您的工作臺中包含外部庫。這使您可以訪問大量標準 C 庫(一組預制函數),以及專門為 Arduino 編寫的庫。同樣,您將看到#define
哪個是有用的 C++ 組件,它允許您為常量命名程序編譯前的值。
這些聲明將根據用于每個傳感器的引腳配置指定在此“Activewear Suggestion Station”項目中使用的庫。
#include <Adafruit_DHT.h>
#include <Grove_ChainableLED.h>
#include <Grove_OLED_128x64.h>
#include <Ubidots.h>
// Defining Temp Humd pin
#define DHTPIN A0
// Defining DHT11
#define DHTTYPE DHT11
// Defining Ubidots webhook name
const char *WEBHOOK_NAME = "Ubidots";
// Ubidots constant
Ubidots ubidots("webhook", UBI_PARTICLE);
// Temp Humi object
DHT dht(DHTPIN, DHTTYPE);
// LED object with respective pins
ChainableLED leds (RX, TX, 1);
void updateDisplay (double inside, double outside);
// global outdoor temp variable
float tempOutdoor = -100;
// global outdoor humditiy variable
float humidityOutdoor = -1;
// Read Humidity Data
float humidity = dht.getHumidity();
// Read Temp Data
float temp = dht.getTempFarenheit();
第 3 步:
在設置#include
和#define
聲明之后,是時候在用于初始化我們的庫和配置對象的部分中初始化和設置初始值了,setup()
這些設置您稍后將在代碼中使用。
void setup() {
Serial.begin(9600);
Serial.println("Active Wear Station");
// initialize DHT library
dht.begin();
// initialize LED library
leds.init();
Wire.begin();
// initialize display library
SeeedOled.init();
// Clearing display
SeeedOled.clearDisplay();
SeeedOled.setNormalDisplay();
SeeedOled.setPageMode();
// Adding Active Wear Station at setup
SeeedOled.setTextXY(2, 0);
SeeedOled.putString("Active");
SeeedOled.setTextXY(3, 0);
SeeedOled.putString("Wear");
SeeedOled.setTextXY(4, 0);
SeeedOled.putString("Suggestion");
SeeedOled.setTextXY(5, 0);
SeeedOled.putString("Station");
最后,最后一部分setup()
是Particle.subscribe
; 訂閱允許云向許多設備發送消息。在這種情況下,是我們的setCurrentWeather webhook 將室外溫度和濕度從 Open Weather Map API 事件發送到我們的 Boron。更多信息可以在這里找到。
// Subscribing to GetWeatherForecast webhook
Particle.subscribe(System.deviceID() + "/GetWeatherForecast/", setCurrentWeather, MY_DEVICES);
}
第4步:
了解主要代碼loop():
在創建一個setup()
初始化并設置初始值的函數之后,該loop()
函數完全按照其名稱所暗示的那樣工作,并連續循環,允許您的程序進行更改和響應。這用于主動控制您的粒子設備。
對于這個項目,我們正在收集 2 個數據源:
1-測量室內溫度和濕度
本項目采集的室內數據來自于附在的溫濕度傳感器A0
,在代碼開頭定義為:
-
float temp = dht.getTempFarenheit();
-
float humidity = dht.getHumidity();
首先要做的是驗證傳感器數據是否有效。如果有任何無效數據,代碼將使用Serial.println()
輸出,“Failed to read from DHT11 sensor!”。
// Check if any indoor data reads have failed
if (isnan(temp) || isnan(humidity)){
Serial.println("Failed to read from DHT sensor");
return;
}
2- 收集室外溫度和濕度數據
接下來是創建發布周期變量并檢查自上次發布以來的最后時間,以便有效地從 Open Weather Maps 使用我們的 API 調用。
millis()
time 函數返回自 Particle 設備開始運行當前程序以來經過的毫秒數,并用 減去它LastPublish
。這使我們能夠確定是否Last publish >= publishPeriod
大于或等于 15 分鐘才能再次發布。
如果這是真的,If 語句將分配lastPublish = millis();
天氣預報數據并將其發布到粒子控制臺,使用Particle.publish
.
// Publishing every 15 min
const unsigned long publishPeriod = 15 * 60 * 1000;
// Last publish variable
static unsigned long lastPublish = 10000 - publishPeriod;
// Check time since last publish occurred and publish collected Webhook Outdoor weather forecast data
if (millis() - lastPublish >= publishPeriod) {
lastPublish = millis();
Particle.publish("GetWeatherForecast", PRIVATE);
}
Particle.publish
; 允許您通過 Particle Device Cloud 發布事件,該事件將轉發給所有注冊的偵聽器,例如回調、訂閱的服務器發送事件流以及其他通過Particle.subscribe
. 更多信息可以在這里找到。
LED燈邏輯:
如果室內熱指數“ inside ”低于室外熱指數,則指示燈變為藍色,表示:不需要額外的運動服。
如果室內熱量指數“戶外”大于室外熱量指數,則指示燈變為紅色,表示:需要額外的運動服。
// LED light logic based on indoor vs outdoor heat indexes
// Indoor heat index lower than outdoor heat index turn blue
if (inside < outside){
leds.setColorRGB(0,0,0,255);
}
// Indoor heat index greater than outdoor heat index turn red
if (inside > outside){
leds.setColorRGB(0,255,0,0);
}
繼上一步之后,當我們有更多數據時,我們會更新 OLED 顯示屏,以在本地顯示 Activewear Suggestion Station 上的熱量指數。
// Updating OLED Display
updateDisplay (inside, outside);
最后,我們的最后loop()
一部分是添加將發布到 Ubidots 的數據:
// Ubidots Variables publish into Ubidots dashboard
ubidots.add("Indoor Temp", temp);
ubidots.add("Indoor Humidity", humidity);
ubidots.add("Outdoor Temp", tempOutdoor);
ubidots.add("Outdoor Humidity", humidityOutdoor);
ubidots.add("Indoor Heat Index",indoorHeatIndex(temp, humidity));
ubidots.add("Outdoor Heat Index", outdoorHeatIndex(tempOutdoor, humidityOutdoor));
bool bufferSent = false;
bufferSent = ubidots.send(WEBHOOK_NAME, PUBLIC);
和粒子控制臺:
// Particle publish temperatures, humidities and heat indexes into console
Particle.publish("Indoor Temp",String (temp));
Particle.publish("Indoor Humidity", String (humidity));
Particle.publish("Outdoor Temp",String (tempOutdoor));
Particle.publish("Outdoor Humidity", String (humidity));
Particle.publish("Indoor Heat Index",String(indoorHeatIndex(temp, humidity)));
Particle.publish("Outdoor Heat Index",String(outdoorHeatIndex(tempOutdoor, humidityOutdoor)));
我們的 Webhook 的亮點:
Webhook 是一種簡單而靈活的方式,可以將數據從您的 Particle 設備發送到 Internet 上的其他應用程序和服務。
Webhook 彌合了物理世界和數字世界之間的鴻溝,幫助您將數據放在需要的地方。更多信息在這里。
在這個項目中,我們使用了兩個 webhook 集成:
1-第一個 webhook 是我們的GetWeatherForecast :它從openweathermap.org中提取數據,并允許我們按城市名稱訪問當前天氣數據。
在本節中,我們收集室外溫度和室外濕度。
{
"event": "GetWeatherForecast",
"responseTopic": "{{PARTICLE_DEVICE_ID}}/{{PARTICLE_EVENT_NAME}}",
"url": "https://api.openweathermap.org/data/2.5/weather",
"requestType": "GET",
"noDefaults": true,
"rejectUnauthorized": true,
"responseTemplate": "{"temp":{{{main.temp}}},"hum":{{{main.humidity}}}}",
"query": {
"q": "Boston",
"units": "imperial",
"appid": "Your Open Weather Map API KEY"
}
}
在創建GetWeatherForecast webhook 并開始收集數據后,我們使用這個 JSON 解析器“ setCurrentWeather ”函數來收集數據,因為收集的所有數據都是 JSON 格式,不能用于邏輯和顯示。
// Json Parser for data collected from Open Weather API
void setCurrentWeather(const char *event, const char *data) {
Log.info("subscriptionHandler %s", data);
JSONValue outerObj = JSONValue::parseCopy(data);
JSONObjectIterator iter(outerObj);
while (iter.next()) {
if (iter.name() == "temp") {
tempOutdoor = iter.value().toDouble();
}
if (iter.name() == "hum") {
humidityOutdoor = iter.value().toDouble();
}
}}
2-第二個 webhook 是Ubidots :這是我們使用 Ubidots 圖形、圖表和表格可視化我們的粒子設備收集的數據的地方。
要了解更多如何在此處集成您的設備,請參閱使用 Particle Webhooks 將您的 Particle 設備連接到 Ubidots的指南。
{
"event": "Ubidots",
"url": "https://industrial.api.ubidots.com/api/v1.6/devices/{{{PARTICLE_DEVICE_ID}}}",
"requestType": "POST",
"noDefaults": false,
"rejectUnauthorized": true,
"headers": {
"X-Auth-Token": "YOUR_UBIDOTS_TOKEN_HERE",
"Content-Type": "application/json"
},
"body": "{{{PARTICLE_EVENT_VALUE}}}"
}
最后 :
收集室內溫度/濕度和室外溫度/濕度后。我們創建了兩個函數來計算室內熱量指數和室外熱量指數:下面是室內熱量指數方程:
// Indoor heat index equation
double indoorHeatIndex (float temp, float humidity) {
const double c1 = -42.379;
const double c2 = 2.04901523;
const double c3 = 10.14333127;
const double c4 = -.22475541;
const double c5 = -0.00683783;
const double c6 = -0.05481717;
const double c7 = 0.00122874;
const double c8 = 0.00085282;
const double c9 = -0.00000199;
double heatIndex = c1 + (c2 * temp) +
(c3 * humidity) +
(c4 * temp*humidity) +
(c5 * (temp*temp)) +
(c6 * (humidity * humidity)) +
(c7 * (temp * temp) * humidity) +
(c8 * temp * (humidity * humidity)) +
(c9 * (temp * temp) * (humidity * humidity));
return heatIndex;
}
下面是室外熱指數方程:
// Outdoor heat index equation
double outdoorHeatIndex (float tempOutdoor, float humidityOutdoor) {
const double c1 = -42.379;
const double c2 = 2.04901523;
const double c3 = 10.14333127;
const double c4 = -.22475541;
const double c5 = -0.00683783;
const double c6 = -0.05481717;
const double c7 = 0.00122874;
const double c8 = 0.00085282;
const double c9 = -0.00000199;
double outHeatIndex = c1 + (c2 * tempOutdoor) +
(c3 * humidityOutdoor) +
(c4 * tempOutdoor*humidityOutdoor) +
(c5 * (tempOutdoor*tempOutdoor)) +
(c6 * (humidityOutdoor * humidityOutdoor)) +
(c7 * (tempOutdoor * tempOutdoor) * humidityOutdoor) +
(c8 * tempOutdoor * (humidityOutdoor * humidityOutdoor)) +
(c9 * (tempOutdoor * tempOutdoor) * (humidityOutdoor * humidityOutdoor));
return outHeatIndex;
}
如果您正確按照說明進行操作,您現在應該擁有一個帶有本地顯示器的有效運動服建議站。
多虧了Particle.publish
你也可以在室內看到;溫度、濕度和熱量指數。除此之外,您還可以看到戶外;通過轉到粒子控制臺并在我的設備選項卡上選擇設備或檢查事件選項卡(您將能夠在其中一次查看所有設備的發布)遠程溫度、濕度和熱量指數。
如何找到 Activewear Suggestion Station 的用途:1- Ubidots Dashboard 是一個有用的可視化工具;您可以創建一個免費帳戶來使用Ubidots STEM構建、開發、測試和學習。
我創建了一個服裝分類儀表板,通過實時更新指標來幫助我做出早上的決定,顯示與室內和室外熱量指數相關的數據。
該儀表板的主要目的是提供熱量指數差異的綜合快照,以及我應該在晨跑時穿什么類型的服裝。
2- 在站本身上使用本地顯示器 + RGB LED 將有助于:
- 根據 RGB Light 邏輯確定哪個熱指數更高:
Blue --> good to go
Red --> Wear additional active wear
- 以華氏度顯示的室內和室外熱指數的可視化顯示
** 請記住:該站不突出降水量,因此請穿著相應的衣服以保持安全和溫暖。
未來的工作
- 對于接下來的步驟,我將為這個項目創建一個第 2 部分,其中包括:一個 Google Firebase webhook,用于使用 Firebase 的實時數據庫開始實時存儲數據。
- 在線氣象站開源分享
- Chaac氣象站開源項目
- 太陽能氣象站開源項目
- 天窗充電站開源分享
- 私人實時氣象站開源分享
- WhatsApp通知站開源分享
- 獨特的桌面氣象站開源設計
- WIFI氣象站開源分享
- 屏幕上的氣象站開源案例
- 自動收費站開源分享
- 便攜式氣象站開源分享
- 無人機氣象站開源分享
- 小型光傳感器站開源分享
- Arduino Nano氣象站開源
- 消息站開源資料分享
- 機器人運動學中的非完整約束與運動模型推導 1211次閱讀
- SMT鋼網開孔設計與DFM建議 725次閱讀
- 利用開源軟件的最佳實踐 464次閱讀
- RQS_CLOCK-12時鐘設置建議 622次閱讀
- 運動控制系統的核心應用 1629次閱讀
- PLC編程規范及建議 807次閱讀
- 前沿開源技術領域的開源大數據一一解讀 1005次閱讀
- AAR 矩形優勢和安裝建議 329次閱讀
- 如何制作一個健身運動手環 4992次閱讀
- 運動控制器分類_運動控制器選型 5407次閱讀
- 如何通過人體運動能量采集為可穿戴設備供電 3624次閱讀
- NASA的開源軟件是什么?NASA的開源軟件的詳細分析 7186次閱讀
- 中國人工智能開源軟件前生今生到底如何? 5563次閱讀
- 什么是運動控制器_運動控制器的工作原理及應用 3.6w次閱讀
- 帶有LED警示燈的騎行夜服設計 3736次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多