資料介紹
描述
使用這個(gè) Activewear Suggestion 站,在晨跑時(shí)根據(jù)室內(nèi)和室外熱指數(shù)之間的差異來(lái)尋找合適的衣服變得更加容易。這是使用帶有格羅夫防護(hù)罩和開(kāi)放天氣地圖“當(dāng)前天氣數(shù)據(jù)”API 的粒子硼構(gòu)建的。
我連接了一個(gè) DHT 11 傳感器來(lái)收集室內(nèi)溫度/相對(duì)濕度和一個(gè) OLED 屏幕來(lái)顯示從開(kāi)放天氣地圖收集的室內(nèi)和室外溫度/相對(duì)濕度。最后,一個(gè) RGB LED 會(huì)根據(jù)使用我們的室內(nèi)熱指數(shù)和室外熱指數(shù)函數(shù)計(jì)算的室內(nèi)和室外熱指數(shù)之間的差異來(lái)改變顏色。
對(duì)于這個(gè)項(xiàng)目,我將使用 Particle Workbench,它在一個(gè)易于安裝的軟件包中提供了物聯(lián)網(wǎng)開(kāi)發(fā)所需的所有工具、庫(kù)和擴(kuò)展。
此外,通過(guò)單擊此鏈接,您將被帶到作為集成開(kāi)發(fā)環(huán)境的 Particle Web IDE;它恰好在您的網(wǎng)絡(luò)瀏覽器中運(yùn)行。這將包含為您預(yù)加載的所有代碼。您需要做的就是復(fù)制項(xiàng)目。
由于 Grove 系統(tǒng)的易用性,即使您剛剛開(kāi)始,這也應(yīng)該是一個(gè)簡(jiǎn)單易懂的項(xiàng)目。
目標(biāo):
該項(xiàng)目的目標(biāo)是收集和比較室內(nèi)和室外熱量指數(shù)。熱量指數(shù)結(jié)合了空氣溫度和相對(duì)濕度,因?yàn)椤爸匾牟皇菬崃浚菨穸取薄?/font>這讓我可以在早上快速?zèng)Q定是否應(yīng)該在晨跑之前穿額外的運(yùn)動(dòng)服。
代碼亮點(diǎn)
雖然復(fù)制代碼和調(diào)用項(xiàng)目完成很容易,但有必要查看一些程序邏輯部分以了解發(fā)生了什么。
步驟1:
該項(xiàng)目的第一步是在 Grove FeatherWing 上添加硼并連接所有傳感器。使用 Grove 不需要焊接。只需插入傳感器,您就可以專注于編碼和集成!
下面是 Grove FeatherWing 上的傳感器連接圖表:
連接:
有關(guān)詳細(xì)信息,請(qǐng)查看頁(yè)面底部的示意圖↓
第2步:
成功連接傳感器后,現(xiàn)在我們將預(yù)先設(shè)置庫(kù)的包含和變量定義。
在代碼的開(kāi)頭,您將看到#include
哪些用于在您的工作臺(tái)中包含外部庫(kù)。這使您可以訪問(wèn)大量標(biāo)準(zhǔn) C 庫(kù)(一組預(yù)制函數(shù)),以及專門(mén)為 Arduino 編寫(xiě)的庫(kù)。同樣,您將看到#define
哪個(gè)是有用的 C++ 組件,它允許您為常量命名程序編譯前的值。
這些聲明將根據(jù)用于每個(gè)傳感器的引腳配置指定在此“Activewear Suggestion Station”項(xiàng)目中使用的庫(kù)。
#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í)候在用于初始化我們的庫(kù)和配置對(duì)象的部分中初始化和設(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)建一個(gè)setup()
初始化并設(shè)置初始值的函數(shù)之后,該loop()
函數(shù)完全按照其名稱所暗示的那樣工作,并連續(xù)循環(huán),允許您的程序進(jìn)行更改和響應(yīng)。這用于主動(dòng)控制您的粒子設(shè)備。
對(duì)于這個(gè)項(xiàng)目,我們正在收集 2 個(gè)數(shù)據(jù)源:
1-測(cè)量室內(nèi)溫度和濕度
本項(xiàng)目采集的室內(nèi)數(shù)據(jù)來(lái)自于附在的溫濕度傳感器A0
,在代碼開(kāi)頭定義為:
-
float temp = dht.getTempFarenheit();
-
float humidity = dht.getHumidity();
首先要做的是驗(yàn)證傳感器數(shù)據(jù)是否有效。如果有任何無(wú)效數(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ù)
接下來(lái)是創(chuàng)建發(fā)布周期變量并檢查自上次發(fā)布以來(lái)的最后時(shí)間,以便有效地從 Open Weather Maps 使用我們的 API 調(diào)用。
millis()
time 函數(shù)返回自 Particle 設(shè)備開(kāi)始運(yùn)行當(dāng)前程序以來(lái)經(jīng)過(guò)的毫秒數(shù),并用 減去它LastPublish
。這使我們能夠確定是否Last publish >= publishPeriod
大于或等于 15 分鐘才能再次發(fā)布。
如果這是真的,If 語(yǔ)句將分配lastPublish = millis();
天氣預(yù)報(bào)數(shù)據(jù)并將其發(fā)布到粒子控制臺(tái),使用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
; 允許您通過(guò) Particle Device Cloud 發(fā)布事件,該事件將轉(zhuǎn)發(fā)給所有注冊(cè)的偵聽(tīng)器,例如回調(diào)、訂閱的服務(wù)器發(fā)送事件流以及其他通過(guò)Particle.subscribe
. 更多信息可以在這里找到。
LED燈邏輯:
如果室內(nèi)熱指數(shù)“ inside ”低于室外熱指數(shù),則指示燈變?yōu)樗{(lán)色,表示:不需要額外的運(yùn)動(dòng)服。
如果室內(nèi)熱量指數(shù)“戶外”大于室外熱量指數(shù),則指示燈變?yōu)榧t色,表示:需要額外的運(yùn)動(dòng)服。
// 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ù)時(shí),我們會(huì)更新 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);
和粒子控制臺(tái):
// 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 的亮點(diǎn):
Webhook 是一種簡(jiǎn)單而靈活的方式,可以將數(shù)據(jù)從您的 Particle 設(shè)備發(fā)送到 Internet 上的其他應(yīng)用程序和服務(wù)。
Webhook 彌合了物理世界和數(shù)字世界之間的鴻溝,幫助您將數(shù)據(jù)放在需要的地方。更多信息在這里。
在這個(gè)項(xiàng)目中,我們使用了兩個(gè) webhook 集成:
1-第一個(gè) webhook 是我們的GetWeatherForecast :它從openweathermap.org中提取數(shù)據(jù),并允許我們按城市名稱訪問(wèn)當(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 并開(kāi)始收集數(shù)據(jù)后,我們使用這個(gè) JSON 解析器“ setCurrentWeather ”函數(shù)來(lái)收集數(shù)據(jù),因?yàn)槭占乃袛?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-第二個(gè) webhook 是Ubidots :這是我們使用 Ubidots 圖形、圖表和表格可視化我們的粒子設(shè)備收集的數(shù)據(jù)的地方。
要了解更多如何在此處集成您的設(shè)備,請(qǐng)參閱使用 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)建了兩個(gè)函數(shù)來(lái)計(jì)算室內(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;
}
如果您正確按照說(shuō)明進(jìn)行操作,您現(xiàn)在應(yīng)該擁有一個(gè)帶有本地顯示器的有效運(yùn)動(dòng)服建議站。
多虧了Particle.publish
你也可以在室內(nèi)看到;溫度、濕度和熱量指數(shù)。除此之外,您還可以看到戶外;通過(guò)轉(zhuǎn)到粒子控制臺(tái)并在我的設(shè)備選項(xiàng)卡上選擇設(shè)備或檢查事件選項(xiàng)卡(您將能夠在其中一次查看所有設(shè)備的發(fā)布)遠(yuǎn)程溫度、濕度和熱量指數(shù)。
如何找到 Activewear Suggestion Station 的用途:1- Ubidots Dashboard 是一個(gè)有用的可視化工具;您可以創(chuàng)建一個(gè)免費(fèi)帳戶來(lái)使用Ubidots STEM構(gòu)建、開(kāi)發(fā)、測(cè)試和學(xué)習(xí)。
我創(chuàng)建了一個(gè)服裝分類儀表板,通過(guò)實(shí)時(shí)更新指標(biāo)來(lái)幫助我做出早上的決定,顯示與室內(nèi)和室外熱量指數(shù)相關(guān)的數(shù)據(jù)。
該儀表板的主要目的是提供熱量指數(shù)差異的綜合快照,以及我應(yīng)該在晨跑時(shí)穿什么類型的服裝。
2- 在站本身上使用本地顯示器 + RGB LED 將有助于:
- 根據(jù) RGB Light 邏輯確定哪個(gè)熱指數(shù)更高:
Blue --> good to go
Red --> Wear additional active wear
- 以華氏度顯示的室內(nèi)和室外熱指數(shù)的可視化顯示
** 請(qǐng)記?。涸撜静煌怀鼋邓?,因此請(qǐng)穿著相應(yīng)的衣服以保持安全和溫暖。
未來(lái)的工作
- 對(duì)于接下來(lái)的步驟,我將為這個(gè)項(xiàng)目創(chuàng)建一個(gè)第 2 部分,其中包括:一個(gè) Google Firebase webhook,用于使用 Firebase 的實(shí)時(shí)數(shù)據(jù)庫(kù)開(kāi)始實(shí)時(shí)存儲(chǔ)數(shù)據(jù)。
- 在線氣象站開(kāi)源分享
- Chaac氣象站開(kāi)源項(xiàng)目
- 太陽(yáng)能氣象站開(kāi)源項(xiàng)目
- 天窗充電站開(kāi)源分享
- 私人實(shí)時(shí)氣象站開(kāi)源分享
- WhatsApp通知站開(kāi)源分享
- 獨(dú)特的桌面氣象站開(kāi)源設(shè)計(jì)
- WIFI氣象站開(kāi)源分享
- 屏幕上的氣象站開(kāi)源案例
- 自動(dòng)收費(fèi)站開(kāi)源分享
- 便攜式氣象站開(kāi)源分享
- 無(wú)人機(jī)氣象站開(kāi)源分享
- 小型光傳感器站開(kāi)源分享
- Arduino Nano氣象站開(kāi)源
- 消息站開(kāi)源資料分享
- 機(jī)器人運(yùn)動(dòng)學(xué)中的非完整約束與運(yùn)動(dòng)模型推導(dǎo) 1211次閱讀
- SMT鋼網(wǎng)開(kāi)孔設(shè)計(jì)與DFM建議 725次閱讀
- 利用開(kāi)源軟件的最佳實(shí)踐 464次閱讀
- RQS_CLOCK-12時(shí)鐘設(shè)置建議 622次閱讀
- 運(yùn)動(dòng)控制系統(tǒng)的核心應(yīng)用 1629次閱讀
- PLC編程規(guī)范及建議 807次閱讀
- 前沿開(kāi)源技術(shù)領(lǐng)域的開(kāi)源大數(shù)據(jù)一一解讀 1005次閱讀
- AAR 矩形優(yōu)勢(shì)和安裝建議 329次閱讀
- 如何制作一個(gè)健身運(yùn)動(dòng)手環(huán) 4992次閱讀
- 運(yùn)動(dòng)控制器分類_運(yùn)動(dòng)控制器選型 5407次閱讀
- 如何通過(guò)人體運(yùn)動(dòng)能量采集為可穿戴設(shè)備供電 3624次閱讀
- NASA的開(kāi)源軟件是什么?NASA的開(kāi)源軟件的詳細(xì)分析 7186次閱讀
- 中國(guó)人工智能開(kāi)源軟件前生今生到底如何? 5563次閱讀
- 什么是運(yùn)動(dòng)控制器_運(yùn)動(dòng)控制器的工作原理及應(yīng)用 3.6w次閱讀
- 帶有LED警示燈的騎行夜服設(shè)計(jì) 3736次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多