電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>運(yùn)動(dòng)服建議站開(kāi)源分享

運(yùn)動(dòng)服建議站開(kāi)源分享

2022-11-03 | zip | 0.58 MB | 次下載 | 免費(fèi)

資料介紹

描述

使用這個(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 上的傳感器連接圖表:

連接:

  • Grove DHT 11 --> A0
  • Grove RGB LED --> UART
  • Grove OLED --> I2C_1
pYYBAGNiSd2AEO5iAAJf1r_t-1I421.png
Active Wear Station 連接
?

有關(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ù)。

pYYBAGNiSeGAFNDsAAOTKiYevHI411.png
推入粒子控制臺(tái)的數(shù)據(jù)截圖
?

如何找到 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í)穿什么類型的服裝。

poYBAGNiSeSAFczVAAIxYxEAjUE975.png
Ubidots 服裝分類儀表板
?

2- 在站本身上使用本地顯示器 + RGB LED 將有助于:

  • 根據(jù) RGB Light 邏輯確定哪個(gè)熱指數(shù)更高:

Blue --> good to go

Red --> Wear additional active wear

  • 以華氏度顯示的室內(nèi)和室外熱指數(shù)的可視化顯示
?
?
?
pYYBAGNiSgWAPY1mABQiwfg1cgY401.jpg
?
1 / 3 ? Station 上的藍(lán)色 RGB 指示燈
?

** 請(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ù)。

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)