背景概述
在我們孩子年紀還小,剛好到了需要獨立上下學的時候,父母總是會擔心他們的孩子。并且我們會希望他們的孩子準時到校,按時回家,走指定的路。
SmartWay 旨在消除父母日常生活中的這種擔憂。SmartWay 將在您的孩子上下學時監(jiān)控他/她,確保您的孩子始終采取適當?shù)穆窂降竭_他/她的目的地學校。我自己也知道送孩子上學的簡單任務會有多大壓力,每個人都無法預測孩子上下學時可能發(fā)生的所有事情。
該項目針對所有在送孩子上學時感到壓力的人。SWay 會讓您放松,因為您知道您的孩子會安全到達學校。
SWay 將使用 GPS 監(jiān)控您孩子的地理位置,如果孩子偏離您分配給他/她的路徑,將立即向家長發(fā)送電子郵件。當孩子到家或上學時,SmartWay 還會向家長發(fā)送一封電子郵件,并在孩子遲到時通知他們。通過這種方式,父母可以坐下來享受他們的咖啡,因為他們能夠知道他們的孩子安全到達學校和家。
功能性
SmartWay 將持續(xù)監(jiān)控您孩子從醒來到回家的地理位置。該設備還配備了一個 RGB LED 和一個振動電機,如果您的孩子沒有采取正確的上學方式或遲到了,它會警告您的孩子,并在到達學校時發(fā)送通知。
該設備通過許多功能工作,以確保您的孩子是安全的。
第一個循環(huán)if(off track)檢測孩子是否偏離了指定的路徑,設備有一個系統(tǒng)來檢測這種情況發(fā)生的次數(shù);如果您的孩子第一次偏離航向,設備將通過將 LED 變?yōu)榧t色并振動電機來警告他/她,然后孩子將有兩分鐘的時間回到航向。如果孩子繼續(xù)偏離航線兩分鐘,家長將收到一封電子郵件,警告他們的孩子偏離航線以及他/她的地理位置,電子郵件將每隔 2 分鐘發(fā)送一次,直到孩子到達在家或在學校。
if(school time)和if(home time)循環(huán)檢測是否到了上學和回家的時間,然后設備檢查孩子是否到?;蚧丶?,如果他/她及時到達,LED 將變?yōu)榫G色,并且設備將向家長發(fā)送一封電子郵件,通知他們他們的孩子連同到達時間一起到達了他/她的目的地。否則,如果到了開學時間而孩子不上學,它也會
設備只能發(fā)送 12 個字節(jié)的信息,因此發(fā)送時需要壓縮包。其他變量將在 SigFox 后端配置。
設備可以發(fā)送四個數(shù)據(jù)包:
孩子偏離路線 - (“路線偏離”)
孩子到家——(“在家”)
孩子到學?!ā霸趯W校”)
孩子遲到——(“遲到”)
預警系統(tǒng)
每當孩子到校、到家、遲到或偏離路線時,佩戴設備的孩子都會收到提醒
遲到:
到達目的地:
偏離路線:
設備工作中:
項目優(yōu)勢
使用此設備的家長可以:
確保他們的孩子安全往返學校
確保他們的孩子準時到達這些地點
確保他們的孩子不會偏離路線
節(jié)能和低成本 - 長效電池
構建項目
第 1 步:所需設備
要開始制作這個項目,我們需要收集材料。對于這個項目,您將需要:
跳線
NPN晶體管
陶瓷電容(0.1μF)
電阻器(220Ω)
電阻(1KΩ)
RGB LED
GPS模塊
振動電機單元
Arduino MKR Fox 1200
2x AAA/ AA 電池盒
AA電池
第 2 步:連接電路
下一步是連接電路;下面的圖片說明了具體是如何連接的。布線有多個部分,因此它們被分成不同的圖像。
第 3 步:確認代碼
代碼由多個函數(shù)組成,每個函數(shù)在項目的構成中發(fā)揮特定的作用。
警告系統(tǒng)
獲取 GPS
同步實時時鐘
實時位置
發(fā)送數(shù)據(jù)
動作響應
下面對這些部分進行說明:
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文件中找到。該代碼將通知孩子在當前狀態(tài)下佩戴該設備??偟膩碚f,這些回路控制 RGB LED 和振動電機單元。
獲取 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) {};
?}
}
這是負責從 GPS 模塊接收位置和時間的循環(huán)。這個循環(huán)做了 3 件事,它用于setup loop同步 GPS,然后用于將板載 RTC 與 GPS 同步,并在主循環(huán)中用于獲取設備的地理位置。
同步實時時鐘
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 模塊接收到的時間同步,它首先從 GPS 模塊讀取數(shù)據(jù)然后進行處理。然后循環(huán)將板載 RTC 的當前時間設置為接收到的時間并啟動 RTC。
實時位置
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)將處理設備的位置并將其與當前時間進行比較,以查看此時孩子應該在哪里。然后它將根據(jù)結果執(zhí)行適當?shù)牟僮鳌?/p>
動作響應
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;
?}
};
調用此結構以對Process Location給出的響應采取行動,它會警告孩子切換 RGB LED 和振動電機單元。如有必要,它還會向 SigFox 發(fā)送一個包。
發(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,開始發(fā)送數(shù)據(jù)包,然后解析適當?shù)闹怠?/p>
設置變量
代碼將包含多個變量,這些變量必須自定義以適應客戶端,客戶端將被要求設置
上學時間
孩子旅行的時間
學校結束的時間
調試
學校地理位置(LAT、LNG);
家庭地理位置(LAT、LNG);
設置變量:
設置
確保電路接線正確后
第 1 步
打開SigFox 后端并登錄您的 SigFox 帳戶。
第 2 步
點擊頁面頂部下拉菜單中的“設備類型”
第 3 步
選擇您的 Arduino MKRfox 并單擊編輯
第 4 步
從左側菜單中選擇回調,然后導航到右上角的“新建”按鈕。
第 5 步
單擊新建后,您將看到一些回調配置選項,單擊自定義回調
接下來將打開一個窗口,填寫給定的表格來創(chuàng)建您的回調
將類型設置為數(shù)據(jù)、上行鏈路
將頻道設置為電子郵件
自定義有效負載將讀取板子發(fā)送的數(shù)據(jù)然后對其進行格式化,在我們的例子中,您必須聲明一個變量str ,:: 然后是變量類型char 和該變量占用的字符數(shù)10 。最后你應該有這樣的東西str::char:10
將收件人設置為數(shù)據(jù)將發(fā)送到的電子郵件地址。
根據(jù)需要設置電子郵件的主題。
在消息字段中,您可以默認使用多個變量,無需從您的設備發(fā)送它們,我們將使用{device} (設備 ID)、{lat} (模塊的緯度)和{lng} (模塊的經(jīng)度),這些變量將自動發(fā)送到 SigFox到 12 個字節(jié)的有效負載中,因此您可以使用它們而無需專門從您的設備發(fā)送這些字符串。我們還將使用{customData#str} 這個變量來保存 Arduino MKR1200 fox 發(fā)送的數(shù)據(jù),customData 指的是設備發(fā)送的個性化數(shù)據(jù)#str 表明設備將讀取設備str 發(fā)送的字符串。
我們還將添加一個網(wǎng)站來檢查接收到的坐標,使用谷歌地圖,我們可以在地圖上精確定位接收到的數(shù)據(jù)。這是 url https://www.google.com/maps/?q={lat},{lng} , lat 和 lng 將自動更改為緯度和經(jīng)度變量。
最后,您的消息應如下所示:
現(xiàn)在單擊確定,一切就緒。
收尾
您需要做的最后一件事是上傳本文下方的代碼,確保您已根據(jù)自己的喜好自定義了標有“TODO”的變量,等待 GOS 模塊上的藍燈閃爍,然后斷開微控制器與計算機的連接,然后將電池放入電池盒中。你都準備好了。
我設計了一個外殼來保證設備的安全并使其看起來更有吸引力,用了兩塊丙烯酸并將邊緣熔化成 90 度彎曲。我把所有的電路放在里面,把電池盒放在它們下面,然后用兩條電纜扎帶把塑料片綁在一起。
最后,我覆蓋了一塊頂部(透明蓋)以隱藏所有電線,只讓項目的主控可見。
最終成果:
評論
查看更多