資料介紹
描述
使用這個 Activewear Suggestion 站,在晨跑時根據(jù)室內(nèi)和室外熱指數(shù)之間的差異來尋找合適的衣服變得更加容易。這是使用帶有格羅夫防護(hù)罩和開放天氣地圖“當(dāng)前天氣數(shù)據(jù)”API 的粒子硼構(gòu)建的。
我連接了一個 DHT 11 傳感器來收集室內(nèi)溫度/相對濕度和一個 OLED 屏幕來顯示從開放天氣地圖收集的室內(nèi)和室外溫度/相對濕度。最后,一個 RGB LED 會根據(jù)使用我們的室內(nèi)熱指數(shù)和室外熱指數(shù)函數(shù)計算的室內(nèi)和室外熱指數(shù)之間的差異來改變顏色。
對于這個項目,我將使用 Particle Workbench,它在一個易于安裝的軟件包中提供了物聯(lián)網(wǎng)開發(fā)所需的所有工具、庫和擴(kuò)展。
此外,通過單擊此鏈接,您將被帶到作為集成開發(fā)環(huán)境的 Particle Web IDE;它恰好在您的網(wǎng)絡(luò)瀏覽器中運(yùn)行。這將包含為您預(yù)加載的所有代碼。您需要做的就是復(fù)制項目。
由于 Grove 系統(tǒng)的易用性,即使您剛剛開始,這也應(yīng)該是一個簡單易懂的項目。
目標(biāo):
該項目的目標(biāo)是收集和比較室內(nèi)和室外熱量指數(shù)。熱量指數(shù)結(jié)合了空氣溫度和相對濕度,因為“重要的不是熱量,而是濕度”。這讓我可以在早上快速決定是否應(yīng)該在晨跑之前穿額外的運(yùn)動服。
代碼亮點
雖然復(fù)制代碼和調(diào)用項目完成很容易,但有必要查看一些程序邏輯部分以了解發(fā)生了什么。
步驟1:
該項目的第一步是在 Grove FeatherWing 上添加硼并連接所有傳感器。使用 Grove 不需要焊接。只需插入傳感器,您就可以專注于編碼和集成!
下面是 Grove FeatherWing 上的傳感器連接圖表:
連接:
有關(guān)詳細(xì)信息,請查看頁面底部的示意圖↓
第2步:
成功連接傳感器后,現(xiàn)在我們將預(yù)先設(shè)置庫的包含和變量定義。
在代碼的開頭,您將看到#include
哪些用于在您的工作臺中包含外部庫。這使您可以訪問大量標(biāo)準(zhǔn) C 庫(一組預(yù)制函數(shù)),以及專門為 Arduino 編寫的庫。同樣,您將看到#define
哪個是有用的 C++ 組件,它允許您為常量命名程序編譯前的值。
這些聲明將根據(jù)用于每個傳感器的引腳配置指定在此“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 步:
在設(shè)置#include
和#define
聲明之后,是時候在用于初始化我們的庫和配置對象的部分中初始化和設(shè)置初始值了,setup()
這些設(shè)置您稍后將在代碼中使用。
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
; 訂閱允許云向許多設(shè)備發(fā)送消息。在這種情況下,是我們的setCurrentWeather webhook 將室外溫度和濕度從 Open Weather Map API 事件發(fā)送到我們的 Boron。更多信息可以在這里找到。
// Subscribing to GetWeatherForecast webhook
Particle.subscribe(System.deviceID() + "/GetWeatherForecast/", setCurrentWeather, MY_DEVICES);
}
第4步:
了解主要代碼loop():
在創(chuàng)建一個setup()
初始化并設(shè)置初始值的函數(shù)之后,該loop()
函數(shù)完全按照其名稱所暗示的那樣工作,并連續(xù)循環(huán),允許您的程序進(jìn)行更改和響應(yīng)。這用于主動控制您的粒子設(shè)備。
對于這個項目,我們正在收集 2 個數(shù)據(jù)源:
1-測量室內(nèi)溫度和濕度
本項目采集的室內(nèi)數(shù)據(jù)來自于附在的溫濕度傳感器A0
,在代碼開頭定義為:
-
float temp = dht.getTempFarenheit();
-
float humidity = dht.getHumidity();
首先要做的是驗證傳感器數(shù)據(jù)是否有效。如果有任何無效數(shù)據(jù),代碼將使用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- 收集室外溫度和濕度數(shù)據(jù)
接下來是創(chuàng)建發(fā)布周期變量并檢查自上次發(fā)布以來的最后時間,以便有效地從 Open Weather Maps 使用我們的 API 調(diào)用。
millis()
time 函數(shù)返回自 Particle 設(shè)備開始運(yùn)行當(dāng)前程序以來經(jīng)過的毫秒數(shù),并用 減去它LastPublish
。這使我們能夠確定是否Last publish >= publishPeriod
大于或等于 15 分鐘才能再次發(fā)布。
如果這是真的,If 語句將分配lastPublish = millis();
天氣預(yù)報數(shù)據(jù)并將其發(fā)布到粒子控制臺,使用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 發(fā)布事件,該事件將轉(zhuǎn)發(fā)給所有注冊的偵聽器,例如回調(diào)、訂閱的服務(wù)器發(fā)送事件流以及其他通過Particle.subscribe
. 更多信息可以在這里找到。
LED燈邏輯:
如果室內(nèi)熱指數(shù)“ inside ”低于室外熱指數(shù),則指示燈變?yōu)樗{(lán)色,表示:不需要額外的運(yùn)動服。
如果室內(nèi)熱量指數(shù)“戶外”大于室外熱量指數(shù),則指示燈變?yōu)榧t色,表示:需要額外的運(yùn)動服。
// 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);
}
繼上一步之后,當(dāng)我們有更多數(shù)據(jù)時,我們會更新 OLED 顯示屏,以在本地顯示 Activewear Suggestion Station 上的熱量指數(shù)。
// Updating OLED Display
updateDisplay (inside, outside);
最后,我們的最后loop()
一部分是添加將發(fā)布到 Ubidots 的數(shù)據(jù):
// 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 是一種簡單而靈活的方式,可以將數(shù)據(jù)從您的 Particle 設(shè)備發(fā)送到 Internet 上的其他應(yīng)用程序和服務(wù)。
Webhook 彌合了物理世界和數(shù)字世界之間的鴻溝,幫助您將數(shù)據(jù)放在需要的地方。更多信息在這里。
在這個項目中,我們使用了兩個 webhook 集成:
1-第一個 webhook 是我們的GetWeatherForecast :它從openweathermap.org中提取數(shù)據(jù),并允許我們按城市名稱訪問當(dāng)前天氣數(shù)據(jù)。
在本節(jié)中,我們收集室外溫度和室外濕度。
{
"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"
}
}
在創(chuàng)建GetWeatherForecast webhook 并開始收集數(shù)據(jù)后,我們使用這個 JSON 解析器“ setCurrentWeather ”函數(shù)來收集數(shù)據(jù),因為收集的所有數(shù)據(jù)都是 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 圖形、圖表和表格可視化我們的粒子設(shè)備收集的數(shù)據(jù)的地方。
要了解更多如何在此處集成您的設(shè)備,請參閱使用 Particle Webhooks 將您的 Particle 設(shè)備連接到 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}}}"
}
最后 :
收集室內(nèi)溫度/濕度和室外溫度/濕度后。我們創(chuàng)建了兩個函數(shù)來計算室內(nèi)熱量指數(shù)和室外熱量指數(shù):下面是室內(nèi)熱量指數(shù)方程:
// 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;
}
下面是室外熱指數(shù)方程:
// 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;
}
如果您正確按照說明進(jìn)行操作,您現(xiàn)在應(yīng)該擁有一個帶有本地顯示器的有效運(yùn)動服建議站。
多虧了Particle.publish
你也可以在室內(nèi)看到;溫度、濕度和熱量指數(shù)。除此之外,您還可以看到戶外;通過轉(zhuǎn)到粒子控制臺并在我的設(shè)備選項卡上選擇設(shè)備或檢查事件選項卡(您將能夠在其中一次查看所有設(shè)備的發(fā)布)遠(yuǎn)程溫度、濕度和熱量指數(shù)。
如何找到 Activewear Suggestion Station 的用途:1- Ubidots Dashboard 是一個有用的可視化工具;您可以創(chuàng)建一個免費(fèi)帳戶來使用Ubidots STEM構(gòu)建、開發(fā)、測試和學(xué)習(xí)。
我創(chuàng)建了一個服裝分類儀表板,通過實時更新指標(biāo)來幫助我做出早上的決定,顯示與室內(nèi)和室外熱量指數(shù)相關(guān)的數(shù)據(jù)。
該儀表板的主要目的是提供熱量指數(shù)差異的綜合快照,以及我應(yīng)該在晨跑時穿什么類型的服裝。
2- 在站本身上使用本地顯示器 + RGB LED 將有助于:
- 根據(jù) RGB Light 邏輯確定哪個熱指數(shù)更高:
Blue --> good to go
Red --> Wear additional active wear
- 以華氏度顯示的室內(nèi)和室外熱指數(shù)的可視化顯示
** 請記住:該站不突出降水量,因此請穿著相應(yīng)的衣服以保持安全和溫暖。
未來的工作
- 對于接下來的步驟,我將為這個項目創(chuàng)建一個第 2 部分,其中包括:一個 Google Firebase webhook,用于使用 Firebase 的實時數(shù)據(jù)庫開始實時存儲數(shù)據(jù)。
- 在線氣象站開源分享
- Chaac氣象站開源項目
- 太陽能氣象站開源項目
- 天窗充電站開源分享
- 私人實時氣象站開源分享
- WhatsApp通知站開源分享
- 獨特的桌面氣象站開源設(shè)計
- WIFI氣象站開源分享
- 屏幕上的氣象站開源案例
- 自動收費(fèi)站開源分享
- 便攜式氣象站開源分享
- 無人機(jī)氣象站開源分享
- 小型光傳感器站開源分享
- Arduino Nano氣象站開源
- 消息站開源資料分享
- 機(jī)器人運(yùn)動學(xué)中的非完整約束與運(yùn)動模型推導(dǎo) 1211次閱讀
- SMT鋼網(wǎng)開孔設(shè)計與DFM建議 725次閱讀
- 利用開源軟件的最佳實踐 464次閱讀
- RQS_CLOCK-12時鐘設(shè)置建議 622次閱讀
- 運(yùn)動控制系統(tǒng)的核心應(yīng)用 1629次閱讀
- PLC編程規(guī)范及建議 807次閱讀
- 前沿開源技術(shù)領(lǐng)域的開源大數(shù)據(jù)一一解讀 1005次閱讀
- AAR 矩形優(yōu)勢和安裝建議 329次閱讀
- 如何制作一個健身運(yùn)動手環(huán) 4992次閱讀
- 運(yùn)動控制器分類_運(yùn)動控制器選型 5407次閱讀
- 如何通過人體運(yùn)動能量采集為可穿戴設(shè)備供電 3624次閱讀
- NASA的開源軟件是什么?NASA的開源軟件的詳細(xì)分析 7186次閱讀
- 中國人工智能開源軟件前生今生到底如何? 5563次閱讀
- 什么是運(yùn)動控制器_運(yùn)動控制器的工作原理及應(yīng)用 3.6w次閱讀
- 帶有LED警示燈的騎行夜服設(shè)計 3736次閱讀
下載排行
本周
- 1感應(yīng)筆電路圖
- 0.06 MB | 6次下載 | 免費(fèi)
- 2美的電磁爐維修手冊大全
- 1.56 MB | 4次下載 | 5 積分
- 3Cortex-M3/M4F指令集技術(shù)用戶手冊
- 2.28MB | 3次下載 | 免費(fèi)
- 4基于PLC的拉絲機(jī)張力控制系統(tǒng)研究
- 0.14 MB | 2次下載 | 5 積分
- 5LZC3106G高性能諧振控制器中文手冊
- 1.29 MB | 1次下載 | 1 積分
- 6JL2233B集成電平轉(zhuǎn)換功能的LDO中文手冊
- 0.50 MB | 1次下載 | 免費(fèi)
- 7如何PC訪問內(nèi)網(wǎng)及VPN
- 19.15 MB | 1次下載 | 1 積分
- 8萬用表UT58A原理圖
- 0.09 MB | 1次下載 | 5 積分
本月
- 1使用單片機(jī)實現(xiàn)七人表決器的程序和仿真資料免費(fèi)下載
- 2.96 MB | 44次下載 | 免費(fèi)
- 2UC3842/3/4/5電源管理芯片中文手冊
- 1.75 MB | 17次下載 | 免費(fèi)
- 3DMT0660數(shù)字萬用表產(chǎn)品說明書
- 0.70 MB | 13次下載 | 免費(fèi)
- 43314A函數(shù)發(fā)生器維修手冊
- 16.30 MB | 13次下載 | 免費(fèi)
- 5華瑞昇CR216芯片數(shù)字萬用表規(guī)格書附原理圖及校正流程方法
- 0.74 MB | 12次下載 | 3 積分
- 6TPS54202H降壓轉(zhuǎn)換器評估模塊用戶指南
- 1.02MB | 8次下載 | 免費(fèi)
- 7STM32F101x8/STM32F101xB手冊
- 1.69 MB | 8次下載 | 1 積分
- 8使用TL431設(shè)計電源
- 0.67 MB | 6次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935119次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420062次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191367次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73807次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65987次下載 | 10 積分
評論
查看更多