電子發(fā)燒友App

硬聲App

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

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

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

運(yùn)動服建議站開源分享

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

資料介紹

描述

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

連接:

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

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

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

如何找到 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)該在晨跑時穿什么類型的服裝。

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

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

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

Blue --> good to go

Red --> Wear additional active wear

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

** 請記住:該站不突出降水量,因此請穿著相應(yīng)的衣服以保持安全和溫暖。

未來的工作

  • 對于接下來的步驟,我將為這個項目創(chuàng)建一個第 2 部分,其中包括:一個 Google Firebase webhook,用于使用 Firebase 的實時數(shù)據(jù)庫開始實時存儲數(shù)據(jù)。

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

評論

查看更多

下載排行

本周

  1. 1感應(yīng)筆電路圖
  2. 0.06 MB   |  6次下載  |  免費(fèi)
  3. 2美的電磁爐維修手冊大全
  4. 1.56 MB   |  4次下載  |  5 積分
  5. 3Cortex-M3/M4F指令集技術(shù)用戶手冊
  6. 2.28MB   |  3次下載  |  免費(fèi)
  7. 4基于PLC的拉絲機(jī)張力控制系統(tǒng)研究
  8. 0.14 MB   |  2次下載  |  5 積分
  9. 5LZC3106G高性能諧振控制器中文手冊
  10. 1.29 MB   |  1次下載  |  1 積分
  11. 6JL2233B集成電平轉(zhuǎn)換功能的LDO中文手冊
  12. 0.50 MB   |  1次下載  |  免費(fèi)
  13. 7如何PC訪問內(nèi)網(wǎng)及VPN
  14. 19.15 MB   |  1次下載  |  1 積分
  15. 8萬用表UT58A原理圖
  16. 0.09 MB   |  1次下載  |  5 積分

本月

  1. 1使用單片機(jī)實現(xiàn)七人表決器的程序和仿真資料免費(fèi)下載
  2. 2.96 MB   |  44次下載  |  免費(fèi)
  3. 2UC3842/3/4/5電源管理芯片中文手冊
  4. 1.75 MB   |  17次下載  |  免費(fèi)
  5. 3DMT0660數(shù)字萬用表產(chǎn)品說明書
  6. 0.70 MB   |  13次下載  |  免費(fèi)
  7. 43314A函數(shù)發(fā)生器維修手冊
  8. 16.30 MB   |  13次下載  |  免費(fèi)
  9. 5華瑞昇CR216芯片數(shù)字萬用表規(guī)格書附原理圖及校正流程方法
  10. 0.74 MB   |  12次下載  |  3 積分
  11. 6TPS54202H降壓轉(zhuǎn)換器評估模塊用戶指南
  12. 1.02MB   |  8次下載  |  免費(fèi)
  13. 7STM32F101x8/STM32F101xB手冊
  14. 1.69 MB   |  8次下載  |  1 積分
  15. 8使用TL431設(shè)計電源
  16. 0.67 MB   |  6次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935119次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420062次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233084次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費(fèi)下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
  10. 158M  |  183335次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具M(jìn)DK-Arm免費(fèi)下載
  14. 0.02 MB  |  73807次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65987次下載  |  10 積分