背景概述
在我們孩子年紀(jì)還小,剛好到了需要獨(dú)立上下學(xué)的時(shí)候,父母總是會(huì)擔(dān)心他們的孩子。并且我們會(huì)希望他們的孩子準(zhǔn)時(shí)到校,按時(shí)回家,走指定的路。
SmartWay 旨在消除父母日常生活中的這種擔(dān)憂。SmartWay 將在您的孩子上下學(xué)時(shí)監(jiān)控他/她,確保您的孩子始終采取適當(dāng)?shù)穆窂降竭_(dá)他/她的目的地學(xué)校。我自己也知道送孩子上學(xué)的簡(jiǎn)單任務(wù)會(huì)有多大壓力,每個(gè)人都無(wú)法預(yù)測(cè)孩子上下學(xué)時(shí)可能發(fā)生的所有事情。
該項(xiàng)目針對(duì)所有在送孩子上學(xué)時(shí)感到壓力的人。SWay 會(huì)讓您放松,因?yàn)槟滥暮⒆訒?huì)安全到達(dá)學(xué)校。
SWay 將使用 GPS 監(jiān)控您孩子的地理位置,如果孩子偏離您分配給他/她的路徑,將立即向家長(zhǎng)發(fā)送電子郵件。當(dāng)孩子到家或上學(xué)時(shí),SmartWay 還會(huì)向家長(zhǎng)發(fā)送一封電子郵件,并在孩子遲到時(shí)通知他們。通過(guò)這種方式,父母可以坐下來(lái)享受他們的咖啡,因?yàn)樗麄兡軌蛑浪麄兊暮⒆影踩竭_(dá)學(xué)校和家。
功能性
SmartWay 將持續(xù)監(jiān)控您孩子從醒來(lái)到回家的地理位置。該設(shè)備還配備了一個(gè) RGB LED 和一個(gè)振動(dòng)電機(jī),如果您的孩子沒(méi)有采取正確的上學(xué)方式或遲到了,它會(huì)警告您的孩子,并在到達(dá)學(xué)校時(shí)發(fā)送通知。
該設(shè)備通過(guò)許多功能工作,以確保您的孩子是安全的。
第一個(gè)循環(huán)if(off track)檢測(cè)孩子是否偏離了指定的路徑,設(shè)備有一個(gè)系統(tǒng)來(lái)檢測(cè)這種情況發(fā)生的次數(shù);如果您的孩子第一次偏離航向,設(shè)備將通過(guò)將 LED 變?yōu)榧t色并振動(dòng)電機(jī)來(lái)警告他/她,然后孩子將有兩分鐘的時(shí)間回到航向。如果孩子繼續(xù)偏離航線兩分鐘,家長(zhǎng)將收到一封電子郵件,警告他們的孩子偏離航線以及他/她的地理位置,電子郵件將每隔 2 分鐘發(fā)送一次,直到孩子到達(dá)在家或在學(xué)校。
if(school time)和if(home time)循環(huán)檢測(cè)是否到了上學(xué)和回家的時(shí)間,然后設(shè)備檢查孩子是否到?;蚧丶?,如果他/她及時(shí)到達(dá),LED 將變?yōu)榫G色,并且設(shè)備將向家長(zhǎng)發(fā)送一封電子郵件,通知他們他們的孩子連同到達(dá)時(shí)間一起到達(dá)了他/她的目的地。否則,如果到了開(kāi)學(xué)時(shí)間而孩子不上學(xué),它也會(huì)
設(shè)備只能發(fā)送 12 個(gè)字節(jié)的信息,因此發(fā)送時(shí)需要壓縮包。其他變量將在 SigFox 后端配置。
設(shè)備可以發(fā)送四個(gè)數(shù)據(jù)包:
孩子偏離路線 - (“路線偏離”)
孩子到家——(“在家”)
孩子到學(xué)?!ā霸趯W(xué)?!保?/p>
孩子遲到——(“遲到”)
預(yù)警系統(tǒng)
每當(dāng)孩子到校、到家、遲到或偏離路線時(shí),佩戴設(shè)備的孩子都會(huì)收到提醒
遲到:
到達(dá)目的地:
偏離路線:
設(shè)備工作中:
項(xiàng)目?jī)?yōu)勢(shì)
使用此設(shè)備的家長(zhǎng)可以:
確保他們的孩子安全往返學(xué)校
確保他們的孩子準(zhǔn)時(shí)到達(dá)這些地點(diǎn)
確保他們的孩子不會(huì)偏離路線
節(jié)能和低成本 - 長(zhǎng)效電池
構(gòu)建項(xiàng)目
第 1 步:所需設(shè)備
要開(kāi)始制作這個(gè)項(xiàng)目,我們需要收集材料。對(duì)于這個(gè)項(xiàng)目,您將需要:
跳線
NPN晶體管
陶瓷電容(0.1μF)
電阻器(220Ω)
電阻(1KΩ)
RGB LED
GPS模塊
振動(dòng)電機(jī)單元
Arduino MKR Fox 1200
2x AAA/ AA 電池盒
AA電池
第 2 步:連接電路
下一步是連接電路;下面的圖片說(shuō)明了具體是如何連接的。布線有多個(gè)部分,因此它們被分成不同的圖像。
第 3 步:確認(rèn)代碼
代碼由多個(gè)函數(shù)組成,每個(gè)函數(shù)在項(xiàng)目的構(gòu)成中發(fā)揮特定的作用。
警告系統(tǒng)
獲取 GPS
實(shí)時(shí)位置
發(fā)送數(shù)據(jù)
動(dòng)作響應(yīng)
下面對(duì)這些部分進(jìn)行說(shuō)明:
void setOutputs()
{
?pinMode(R, OUTPUT);
?pinMode(G, OUTPUT);
?pinMode(B, OUTPUT);
?pinMode(motorPin, OUTPUT);
}
void vibrateMotor() // vibrate the motor cell
{
?digitalWrite(motorPin, HIGH);
?delay(1000);
?digitalWrite(motorPin, LOW);
}
void ledGreen() // LED, Green
{
?analogWrite(R, 0);
?analogWrite(G, 255);
?analogWrite(B, 0);
}
void ledOrange() // LED, Orange
{
?analogWrite(R, 255);
?analogWrite(G, 45);
?analogWrite(B, 0);
}
void ledRed() // LED, Red
{
?analogWrite(R, 255);
?analogWrite(G, 0);
?analogWrite(B, 0);
}
void resetLED() // Turn off LED
{
?analogWrite(R, 0);
?analogWrite(G, 0);
?analogWrite(B, 0);
}
這部分代碼可以在functions.h文件中找到。該代碼將通知孩子在當(dāng)前狀態(tài)下佩戴該設(shè)備??偟膩?lái)說(shuō),這些回路控制 RGB LED 和振動(dòng)電機(jī)單元。
獲取 GPS
bool getGPS(int run)
{
?while(Serial1.available() > 0)
?{
? ?if(gps.encode(Serial1.read()))
? ?{
? ? ?if(run == 1)
? ? ?{
? ? ? ?processData();
? ? ?}
? ? ?else if(run == 2)
? ? ?{
? ? ? ?synchRTC();
? ? ?}
? ? ?if(gps.location.isValid() && gps.time.isValid() && gps.date.isValid())
? ? ?{
? ? ? ?return true;
? ? ?}
? ? ?else
? ? ?{
? ? ? ?return false;
? ? ?}
? ?}
?}
?if(millis() > 10000 && gps.charsProcessed() < 10)
?{
? ?Serial.println("Error - GPS Module Responded with Error");
? ?Serial.println(" ?Terminating Code");
? ?Serial.println("________________________________________");
? ?while(1) {};
?}
}
這是負(fù)責(zé)從 GPS 模塊接收位置和時(shí)間的循環(huán)。這個(gè)循環(huán)做了 3 件事,它用于setup loop同步 GPS,然后用于將板載 RTC 與 GPS 同步,并在主循環(huán)中用于獲取設(shè)備的地理位置。
同步實(shí)時(shí)時(shí)鐘
void synchRTC()
{
?Serial.println("Synching RTC");
?Serial.println("________________________________________");
?Serial.println(" ?OK - Initialising RTC");
?rtc.begin();
?Serial.println(" ?OK - Synching Time");
?// we have to trim the variable's first 2 digits (2018 -> 18)
?uint16_t yearRAW = gps.date.year();
?String yearString = String(yearRAW);
?yearString.remove(0,1);
?uint16_t year = yearString.toInt();
?rtc.setTime(gps.time.hour(), gps.time.minute(), gps.time.second());
?rtc.setDate(gps.date.day(), gps.date.month(), year);
?Serial.println(" ?Success - RTC Synched");
?Serial.println("________________________________________");
?Serial.println("");
?Serial.println("");
?Serial.println("");
}
這部分代碼將板載 RTC 與從 GPS 模塊接收到的時(shí)間同步,它首先從 GPS 模塊讀取數(shù)據(jù)然后進(jìn)行處理。然后循環(huán)將板載 RTC 的當(dāng)前時(shí)間設(shè)置為接收到的時(shí)間并啟動(dòng) RTC。
實(shí)時(shí)位置
bool processData()
{
?if(gps.location.isValid())
?{
? ?latitude = gps.location.lat();
? ?longitude = gps.location.lng();
? ?latitude = 53.355504;
? ?longitude = -6.258452;
? ?if(check.isOut())
? ?{
? ? ?if(check.track())
? ? ?{
? ? ? ?Serial.println("OUT OF BOUNDS");
? ? ? ?warn.offTrackLoop();
? ? ?}
? ?}
? ?if(check.isHomeTime() && arrivedSchool)
? ?{
? ? ?if(check.isHome())
? ? ?{
? ? ? ?Serial.println("AT HOME");
? ? ? ?warn.arrivedHomeLoop();
? ? ?}
? ? ?else
? ? ?{
? ? ? ?Serial.println("LATE -> HOME");
? ? ? ?warn.lateLoop();
? ? ?}
? ?}
? ?else if(check.isSchoolTime() && arrivedHome)
? ?{
? ? ?Serial.println(".");
? ? ?if(check.isSchool())
? ? ?{
? ? ? ?Serial.println("AT SCHOOL");
? ? ? ?warn.arrivedSchoolLoop();
? ? ?}
? ? ?else
? ? ?{
? ? ? ?Serial.println("LATE -> SCHOOL");
? ? ? ?warn.lateLoop();
? ? ?}
? ?}
? ?else
? ?{
? ? ?Serial.println("ON WAY");
? ?}
?}
}
該循環(huán)將處理設(shè)備的位置并將其與當(dāng)前時(shí)間進(jìn)行比較,以查看此時(shí)孩子應(yīng)該在哪里。然后它將根據(jù)結(jié)果執(zhí)行適當(dāng)?shù)牟僮鳌?/p>
動(dòng)作響應(yīng)
struct Do
{
?void offTrackLoop()
?{
? ?if(offTrackVar)
? ?{
? ? ?parseData(0);
? ?}
? ?vibrateMotor();
? ?ledRed();
? ?delay(1000);
? ?vibrateMotor();
? ?resetLED();
? ?offTrackVar = true;
? ?delay(120000);
?}
?void lateLoop()
?{
? ?if(!lateVar)
? ?{
? ? ?parseData(1);
? ?}
? ?vibrateMotor();
? ?ledOrange();
? ?delay(1000);
? ?resetLED();
? ?lateVar = true;
?}
?void arrivedHomeLoop()
?{
? ?lateVar = false;
? ?offTrackVar = false;
? ?vibrateMotor();
? ?ledGreen();
? ?delay(1000);
? ?resetLED();
? ?parseData(2);
? ?arrivedHome = true;
? ?arrivedSchool = false;
?}
?void arrivedSchoolLoop()
?{
? ?lateVar = false;
? ?offTrackVar = false;
? ?vibrateMotor();
? ?ledGreen();
? ?delay(1000);
? ?resetLED();
? ?parseData(3);
? ?arrivedHome = false;
? ?arrivedSchool = true;
?}
};
調(diào)用此結(jié)構(gòu)以對(duì)Process Location給出的響應(yīng)采取行動(dòng),它會(huì)警告孩子切換 RGB LED 和振動(dòng)電機(jī)單元。如有必要,它還會(huì)向 SigFox 發(fā)送一個(gè)包。
發(fā)送數(shù)據(jù)
void parseData(int state)
{
?SigFox.beginPacket(); // begin the message sending process
?if(state == 0) // off track
?{
? ?SigFox.print("off track"); // send the message
?}
?else if(state == 1) // late
?{
? ?SigFox.print("late"); // send the message
?}
?else if(state == 2) // arrived home
?{
? ?SigFox.print("at home"); // send the message
?}
?else // arrived school
?{
? ?SigFox.print("at school"); // send the message
?}
?SigFox.endPacket();
}
該函數(shù)將數(shù)據(jù)發(fā)送到 SigFox,開(kāi)始發(fā)送數(shù)據(jù)包,然后解析適當(dāng)?shù)闹怠?/p>
設(shè)置變量
代碼將包含多個(gè)變量,這些變量必須自定義以適應(yīng)客戶端,客戶端將被要求設(shè)置
上學(xué)時(shí)間
孩子旅行的時(shí)間
學(xué)校結(jié)束的時(shí)間
調(diào)試
學(xué)校地理位置(LAT、LNG);
家庭地理位置(LAT、LNG);
設(shè)置變量:
設(shè)置
確保電路接線正確后
第 1 步
打開(kāi)SigFox 后端并登錄您的 SigFox 帳戶。
第 2 步
點(diǎn)擊頁(yè)面頂部下拉菜單中的“設(shè)備類(lèi)型”
第 3 步
選擇您的 Arduino MKRfox 并單擊編輯
第 4 步
從左側(cè)菜單中選擇回調(diào),然后導(dǎo)航到右上角的“新建”按鈕。
第 5 步
單擊新建后,您將看到一些回調(diào)配置選項(xiàng),單擊自定義回調(diào)
接下來(lái)將打開(kāi)一個(gè)窗口,填寫(xiě)給定的表格來(lái)創(chuàng)建您的回調(diào)
將類(lèi)型設(shè)置為數(shù)據(jù)、上行鏈路
將頻道設(shè)置為電子郵件
自定義有效負(fù)載將讀取板子發(fā)送的數(shù)據(jù)然后對(duì)其進(jìn)行格式化,在我們的例子中,您必須聲明一個(gè)變量str ,:: 然后是變量類(lèi)型char 和該變量占用的字符數(shù)10 。最后你應(yīng)該有這樣的東西str::char:10
將收件人設(shè)置為數(shù)據(jù)將發(fā)送到的電子郵件地址。
根據(jù)需要設(shè)置電子郵件的主題。
在消息字段中,您可以默認(rèn)使用多個(gè)變量,無(wú)需從您的設(shè)備發(fā)送它們,我們將使用{device} (設(shè)備 ID)、{lat} (模塊的緯度)和{lng} (模塊的經(jīng)度),這些變量將自動(dòng)發(fā)送到 SigFox到 12 個(gè)字節(jié)的有效負(fù)載中,因此您可以使用它們而無(wú)需專(zhuān)門(mén)從您的設(shè)備發(fā)送這些字符串。我們還將使用{customData#str} 這個(gè)變量來(lái)保存 Arduino MKR1200 fox 發(fā)送的數(shù)據(jù),customData 指的是設(shè)備發(fā)送的個(gè)性化數(shù)據(jù)#str 表明設(shè)備將讀取設(shè)備str 發(fā)送的字符串。
我們還將添加一個(gè)網(wǎng)站來(lái)檢查接收到的坐標(biāo),使用谷歌地圖,我們可以在地圖上精確定位接收到的數(shù)據(jù)。這是 url https://www.google.com/maps/?q={lat},{lng} , lat 和 lng 將自動(dòng)更改為緯度和經(jīng)度變量。
最后,您的消息應(yīng)如下所示:
現(xiàn)在單擊確定,一切就緒。
收尾
您需要做的最后一件事是上傳本文下方的代碼,確保您已根據(jù)自己的喜好自定義了標(biāo)有“TODO”的變量,等待 GOS 模塊上的藍(lán)燈閃爍,然后斷開(kāi)微控制器與計(jì)算機(jī)的連接,然后將電池放入電池盒中。你都準(zhǔn)備好了。
我設(shè)計(jì)了一個(gè)外殼來(lái)保證設(shè)備的安全并使其看起來(lái)更有吸引力,用了兩塊丙烯酸并將邊緣熔化成 90 度彎曲。我把所有的電路放在里面,把電池盒放在它們下面,然后用兩條電纜扎帶把塑料片綁在一起。
最后,我覆蓋了一塊頂部(透明蓋)以隱藏所有電線,只讓項(xiàng)目的主控可見(jiàn)。
最終成果:
評(píng)論
查看更多