資料介紹
描述
作為一個(gè)量化的自我愛好者,我想跟蹤我在站立式辦公桌上坐著和站著的時(shí)間,并在圖表中很好地可視化。
我也一直想使用 Microsoft Azure 開展個(gè)人物聯(lián)網(wǎng)項(xiàng)目,因此我將我的 Genuino MKR1000 撣掉,將其連接到超聲波傳感器并提出了這個(gè)項(xiàng)目。
這個(gè)概念很簡單:
- 使用超聲波傳感器通過將桌子放在桌面下方來測量桌子的高度并計(jì)算到地板的距離
- 定期將該數(shù)據(jù)發(fā)送到 Azure IoT 中心,并將其路由到隊(duì)列服務(wù)(Azure 服務(wù)總線隊(duì)列)
- 使用 Python 應(yīng)用程序使用數(shù)據(jù)來構(gòu)建實(shí)時(shí)儀表板
接線非常簡單:
設(shè)置:
您只需確保將傳感器放置在桌子上與地板之間沒有障礙物的位置(例如:地板上的任何物體、椅子或您坐著時(shí)的腿)。所以把它放在一個(gè)角落里。
為了避免計(jì)算中的“噪音”(即您的腿或手臂可能在傳感器下方的短暫時(shí)刻,或者由于測量高度較低而暫時(shí)阻礙程序認(rèn)為您處于坐姿的任何東西),進(jìn)行了測量每 5 秒一次,并且僅使用最后 12 次測量的平均值來確定當(dāng)前位置并計(jì)算坐/站時(shí)間,然后將該數(shù)據(jù)發(fā)送到 azure(12 * 5 = 60 秒,因此每分鐘)。
/*******************************************************************
This code implements the Quantified Desk project, which consists of
an Arduino/Genuino MKR1000 hooked up to an ultrasonic sensor to measure
the distance to the floor (height) of a standing desk.
It keeps track of the time duration (in minutes) in each state (Sitting/Standing)
which is defined by a distance threshold above which the desk is considered to be
in standing position, and below which it is considered in sitting position.
A time counter for each state increases if the corresponding state is the current state.
This data is periodically sent to Azure IoT Hub along with a timestamp.
Complete Project with Dashboard visualization
https://github.com/vmehmeri/az-iot/QuantifiedDesk
PRE-REQUISITE
Setup Azure IoT Hub and upload SSL certificate to device (for your
IoT Hub hostname). With older firmware versions the HTTP Post function
will be unreliable and may fail on several requests, so it's recommended
to update your MKR1000 firmware to the latest version.
- Instructions for setting up Azure IoT Hub:
https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-create-through-portal
- Instructions for updating Firmware and adding SSL certificate to device:
https://www.arduino.cc/en/Tutorial/FirmwareUpdater
*******************************************************************/
#include
#include
#include
#include
#include "arduino_secrets.h"
// SECRETS CONFIG -- PLEASE SET THESE IN arduino_secrets.h FILE
//WiFi creds -------------------------------------------------------------------------------------------
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_WIFIPASSWD; // your network password (use for WPA, or use as key for WEP)
//Azure IoT Hub Secrets Config -------------------------------------------------------------------------
char hostname[] = SECRET_IOTHUB_HOSTNAME;
char uri[]= SECRET_DEVICE_POST_URI;
char authSAS[] = SECRET_DEVICE_SAS;
//------------------------------------------------------------------------------------------------------
#define slotNumber 1 //This will vary for multi slot devices
// Project Config variables
unsigned int distanceThreshold = 82; // Define here the distance (in cm) that marks the threshold between sitting and standing
const int GMT = 2; //change this to adapt it to your time zone
const int TrigPin = 4; //number of the Trigger pin
const int EchoPin = 5; //number of the Echo pin
RTCZero rtc;
WiFiSSLClient client;
Ultrasonic ultrasonic(TrigPin, EchoPin);
unsigned int count = 0;
unsigned long distanceSum = 0;
unsigned int timeStanding = 0;
unsigned int timeSitting = 0;
unsigned long startMillis;
unsigned long distanceAvg;
unsigned long distance;
int status = WL_IDLE_STATUS;
void setup() {
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
startMillis = millis();
rtc.begin();
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
// don't continue:
while (true);
}
// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Connected to Wi-Fi");
// Get Real-Time from NTP using built-in RTC module
unsigned long epoch;
int numberOfTries = 0, maxTries = 6;
do {
epoch = WiFi.getTime();
numberOfTries++;
}
while ((epoch == 0) && (numberOfTries < maxTries));
if (numberOfTries == maxTries) {
Serial.print("NTP unreachable!!");
while (1);
}
else {
Serial.print("Epoch received: ");
Serial.println(epoch);
rtc.setEpoch(epoch);
Serial.println();
}
}
void loop() {
delay(5000); // wait 5 seconds
ultrasonic.measure();
distance = ultrasonic.get_cm();
Serial.print("Sensor(cm): ");
Serial.println(distance);
distanceSum = distanceSum + distance;
count = count + 1;
/* Takes the average of the last 12 measurements (the number 12 is arbitrary, but
* with a 5-second delay between measurements and 12 measurements, that means
* data is aggregated and sent to Azure every 60 seconds, which seems reasonable for
* this project.
*/
if (count == 12) {
distanceAvg = distanceSum / count;
count = 0;
distanceSum = 0;
if (distanceAvg < distanceThreshold) {
// Add elapsed time since last measurement to sitting time
timeSitting = timeSitting + ((millis()-startMillis)/1000);
} else {
// Add elapsed time since last measurement to standing time
timeStanding = timeStanding + ((millis()-startMillis)/1000);
}
startMillis = millis();
// Show current aggregate numbers
printRTCDate();
printRTCTime();
Serial.println();
Serial.print("Time sitting: ");
Serial.print(timeSitting/60);
Serial.println("min");
Serial.print("Time standing: ");
Serial.print(timeStanding/60);
Serial.println("min");
Serial.println("");
// Creates a string to send to Azure IoT HUB.
// It's simply comma-separated string of values for sitting and standing, followed by date and time (for timestamping)
String data_string = (String(timeSitting/60) + "," + String(timeStanding/60) + "," + getRTCDate() + "," + getRTCTime());
//Serial.println(data_string);
// Send to Azure
httpPost(data_string);
String response = "";
char c;
while (client.available()) {
c = client.read();
response.concat(c);
}
}
}
void httpPost(String content)
{
if (client.connectSSL(hostname, 443)) {
client.print("POST ");
client.print(uri);
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(hostname);
client.print("Authorization: ");
client.println(authSAS);
client.println("Connection: close");
client.print("Content-Type: ");
client.println("text/plain");
client.print("Content-Length: ");
client.println(content.length());
client.println();
client.println(content);
delay(500);
} else {
Serial.println("HTTP POST connection failed");
Serial.println(client.read());
}
// close connection
client.stop();
}
void printRTCTime()
{
print2digits(rtc.getHours() + GMT);
Serial.print(":");
print2digits(rtc.getMinutes());
Serial.print(":");
print2digits(rtc.getSeconds());
Serial.println();
}
void printRTCDate()
{
Serial.print(rtc.getDay());
Serial.print("/");
Serial.print(rtc.getMonth());
Serial.print("/");
Serial.print(rtc.getYear());
Serial.print(" ");
}
void print2digits(int number) {
if (number < 10) {
Serial.print("0");
}
Serial.print(number);
}
String getRTCDate()
{
String date_str = String(rtc.getDay()) + "/" + String(rtc.getMonth()) + "/" + String(rtc.getYear());
return date_str;
}
String getRTCTime()
{
String time_str = get2digits(rtc.getHours() + GMT) + ":" + get2digits(rtc.getMinutes()) + ":" + get2digits(rtc.getSeconds());
return time_str;
}
String get2digits(int number) {
if (number < 10) {
return "0" + String(number);
}
return String(number);
}
請注意,必須提供 Azure 連接詳細(xì)信息,因此您需要先設(shè)置 Azure IoT 中心。
以下是設(shè)置 Azure IoT 中心的說明:
https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-create-through-portal
免費(fèi)層就可以滿足這一需求。所以它不會(huì)花費(fèi)你任何東西!
儀表板
對于實(shí)時(shí)儀表板,我使用了 Pusher (pusher.com)。我按照本教程修改了我的應(yīng)用程序的示例代碼。
您可以使用我的代碼(如下提供)作為參考,但您需要?jiǎng)?chuàng)建一個(gè)帳戶,創(chuàng)建一個(gè)應(yīng)用程序,并記下您的應(yīng)用程序連接密鑰,如下所示:
別擔(dān)心,這應(yīng)該花費(fèi)您不到 5 分鐘的時(shí)間來完成設(shè)置。
完成后,下載我的 Github 存儲(chǔ)庫中可用的代碼:
https://github.com/vmehmeri/az-iot/tree/master/QuantifiedDesk
修改以下文件:
frontend/app.py
device_handler.py
使用您的應(yīng)用程序密鑰(對于設(shè)備處理程序,還有您的 Azure 連接信息)。您會(huì)注意到需要有關(guān) Azure 服務(wù)總線隊(duì)列的信息。在我的應(yīng)用程序中,我讓 Azure IoT 中心將消息路由到服務(wù)總線隊(duì)列,然后從那里使用它們。設(shè)置 Azure 服務(wù)總線隊(duì)列非常簡單,您可以按照本教程進(jìn)行操作:
在“消息傳遞”>“消息傳遞路由”>“添加”下配置 IoT 中心消息路由(然后選擇您的隊(duì)列)
之后,您就可以運(yùn)行該應(yīng)用程序了。首先,運(yùn)行前端:
python frontend/app.py
在另一個(gè)終端中,運(yùn)行設(shè)備處理程序,即后端應(yīng)用程序:
python device_handler.py
現(xiàn)在,您可以在localhost:5000上打開一個(gè)瀏覽器窗口,然后盯著圖表,同時(shí)看到條形的增長取決于您站在或坐在辦公桌前的時(shí)間長短 :)(可能需要 1-2 分鐘才能看到任何變化在儀表板中)
您還可以打開 Arduino 串行監(jiān)視器以獲得更直接和詳細(xì)的輸出。device_handler 的 python 代碼在從設(shè)備獲取消息時(shí)也應(yīng)該輸出一些文本。
?
- 燈光物聯(lián)網(wǎng)開源項(xiàng)目
- 家電物聯(lián)網(wǎng)項(xiàng)目
- 螺栓物聯(lián)網(wǎng)開源項(xiàng)目
- 物聯(lián)網(wǎng)開源項(xiàng)目
- 基于物聯(lián)網(wǎng)的農(nóng)業(yè)項(xiàng)目PCB
- 什么是智能工廠-物聯(lián)網(wǎng)系統(tǒng) 7次下載
- 物聯(lián)網(wǎng)工程概要設(shè)計(jì)課件下載 0次下載
- 物聯(lián)網(wǎng)工程概述課件下載 0次下載
- 如何使用開源軟件搭建自己的物聯(lián)網(wǎng)項(xiàng)目
- 物聯(lián)網(wǎng)無線連接技術(shù)是什么?物聯(lián)網(wǎng)產(chǎn)品的射頻測試資料概述 26次下載
- 《STM32物聯(lián)網(wǎng)實(shí)戰(zhàn)教程》單片機(jī)教學(xué)計(jì)算機(jī)網(wǎng)絡(luò)以及物聯(lián)網(wǎng)實(shí)戰(zhàn)概述 277次下載
- 物聯(lián)網(wǎng)是什么?現(xiàn)在物聯(lián)網(wǎng)通信標(biāo)準(zhǔn)和協(xié)議有哪些?物聯(lián)網(wǎng)應(yīng)用的概述
- 物聯(lián)網(wǎng)的真正價(jià)值是什么?
- 物聯(lián)網(wǎng)項(xiàng)目要求說明書 0次下載
- 基于物聯(lián)網(wǎng)的雨水收集項(xiàng)目優(yōu)化問題探析_孫軍 0次下載
- 嵌入式物聯(lián)網(wǎng)開源項(xiàng)目分享 1583次閱讀
- 新型 GPU 云桌面的準(zhǔn)確定義 8870次閱讀
- 如何使用物聯(lián)網(wǎng)實(shí)現(xiàn)智能垃圾監(jiān)控系統(tǒng)的設(shè)計(jì) 2611次閱讀
- 物聯(lián)網(wǎng)是什么和物聯(lián)網(wǎng)基本架構(gòu) 6087次閱讀
- 為什么物聯(lián)網(wǎng)存儲(chǔ)基于對象 1489次閱讀
- 物聯(lián)網(wǎng)項(xiàng)目的常見問題如何去解決 2212次閱讀
- 如何找到真正有價(jià)值的物聯(lián)網(wǎng)項(xiàng)目? 1012次閱讀
- 深刻分析6類物聯(lián)網(wǎng)無線技術(shù)的優(yōu)缺點(diǎn) 5658次閱讀
- 什么是物聯(lián)網(wǎng)應(yīng)用技術(shù)_物聯(lián)網(wǎng)專業(yè)技能有什么 9.7w次閱讀
- 什么是物聯(lián)網(wǎng)節(jié)點(diǎn)_物聯(lián)網(wǎng)節(jié)點(diǎn)之間的關(guān)系 2.1w次閱讀
- 農(nóng)業(yè)物聯(lián)網(wǎng)的意義_農(nóng)業(yè)物聯(lián)網(wǎng)的功能_農(nóng)業(yè)物聯(lián)網(wǎng)的應(yīng)用 9899次閱讀
- 工業(yè)物聯(lián)網(wǎng)的意義_工業(yè)物聯(lián)網(wǎng)前景分析 1.2w次閱讀
- 蜂窩物聯(lián)網(wǎng)是什么_蜂窩物聯(lián)網(wǎng)建設(shè)意義 1.4w次閱讀
- 云計(jì)算與物聯(lián)網(wǎng)的關(guān)系_云計(jì)算和物聯(lián)網(wǎng)的優(yōu)勢 1.3w次閱讀
- 工業(yè)物聯(lián)網(wǎng)項(xiàng)目開始前 您需要了解的八個(gè)關(guān)鍵事項(xiàng) 836次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊
- 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開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 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ì)》 溫德爾著
- 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語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評論
查看更多