父母总是担心他们的孩子。父母希望他们的孩子准时到校,按时回家,走指定的路。
SmartWay 旨在消除父母日常生活中的这种担忧。SmartWay 将在您的孩子上下学时监控他/她,确保您的孩子始终采取适当的路径到达他/她的目的地学校。
SWay 将使用 GPS 监控您孩子的地理位置,如果孩子偏离您分配给他/她的路径,将立即向家长发送电子邮件。当孩子到家或上学时,SmartWay 还会向家长发送一封电子邮件,并在孩子迟到时通知他们。通过这种方式,父母可以坐下来享受他们的咖啡,因为他们知道他们的孩子安全到达学校和家。
SmartWay 将持续监控您孩子从醒来到回家的地理位置。该设备还配备了一个 RGB LED 和一个振动电机,如果您的孩子没有采取正确的上学方式或迟到了,它会警告您的孩子,并在他/她到达学校时向他/她表示祝贺。
该设备通过许多功能工作,以确保您的孩子是安全的。
if(off track)
检测孩子是否偏离了指定的路径,设备有一个系统来检测这种情况发生的次数;如果您的孩子第一次偏离航向,设备将通过将 LED 变为红色并振动电机来警告他/她,然后孩子将有两分钟的时间回到航向。如果孩子继续偏离航线两分钟,家长将收到一封电子邮件,警告他们的孩子偏离航线以及他/她的地理位置,电子邮件将每隔 2 分钟发送一次,直到孩子到达在家或在学校。if(school time)
并if(home time)
循环检测是否到了上学和回家的时间,然后设备检查孩子是否到校或回家,如果他/她及时到达,LED 将变为绿色,并且设备将向家长发送一封电子邮件,通知他们他们的孩子连同到达时间一起到达了他/她的目的地。否则,如果到了开学时间而孩子不上学,它也会设备只能发送 12 个字节的信息,因此发送时需要压缩包。其他变量将在 SigFox 后端配置。
设备可以发送四个数据包
预警系统
佩戴设备的孩子在到达学校、到家、到达目的地迟到或偏离路线时都会收到提醒
设备在行动
使用此设备的家长将受益于:
第 1 步:所需设备
要开始制作这个项目,我们需要收集材料。对于这个项目,您将需要:
第 2 步:连接电路
下一步是连接电路;下面的 Fritzing 图像将说明这是如何完成的。布线有多个部分,因此它们被分成不同的图像。
第 3 步:确认代码
代码由多个函数组成,每个函数在项目的构成中发挥特定的作用。
下面对这些部分进行说明。
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
文件中找到。该代码将通知孩子在当前状态下佩戴该设备。总的来说,这些回路控制 RGB LED 和振动电机单元。
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 模块接收位置和时间的循环。这个循环做了 3 件事,它用于setup loop
同步 GPS,然后用于将板载 RTC 与 GPS 同步,并在主循环中用于获取设备的地理位置。
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 模块读取数据然后对其进行处理。然后循环将板载 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");
}
}
}
该循环将处理设备的位置并将其与当前时间进行比较,以查看此时孩子应该在哪里。然后它将根据结果执行适当的操作。
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 发送一个包。
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();
}
该函数将数据发送到 SigFox,开始发送数据包,然后解析适当的值。
设置变量
代码将包含多个变量,TODO 写在它们之后作为注释,这些变量必须自定义以适合客户端,客户端将被要求设置
下面的指南将指导您设置变量。
图书馆
SigFox - 版权所有 (c) 2016 Arduino LLC GNU Lesser General Public License 此库属于公共领域
ctype - GNU 通用公共许可证下的版权 (c) 2006 自由软件基金会,该库属于公共领域
RTCZero - GNU Lesser General Public License 下的版权 (c) 2015 Arduino LLC,该库属于公共领域
字符串 - 版权所有 (c) 2009-10 Hernando Barragan,版权 (c) 2011 Paul Stoffrengen 在 GNU Lesser General Public License 下,该库属于公共领域
TinyGPS++ - 版权所有 (c) 2008-13 Mikal Hart 在 GNU Lesser General Public License 下,该库属于公共领域
设置
确保电路接线正确。有关设置 MKR fox 的详细信息,请单击此处查看Arduino 教程。如果您想了解有关 Arduino SigFox 库的更多信息,请单击此处。
后端程序
您必须拥有注册的 Arduino MKR1200 狐狸才能对后端进行编程。
打开SigFox 后端并登录您的 SigFox 帐户。
点击页面顶部下拉菜单中的“设备类型”
选择您的 Arduino MKRfox 并单击编辑
从左侧菜单中选择回调,然后导航到右上角的“新建”按钮。
单击新建后,您将看到一些回调配置选项,单击自定义回调
接下来将打开一个窗口,您必须填写给定的表格来创建您的回调
将类型设置为数据、上行链路
将频道设置为电子邮件
自定义有效负载将读取板发送的数据然后对其进行格式化,在我们的例子中,您必须声明一个变量str
,::
然后是变量类型char
和该变量占用的字符数10
。最后你应该有这样的东西str::char:10
将收件人设置为数据将发送到的电子邮件地址。
根据需要设置电子邮件的主题。
在消息字段中,您可以默认使用多个变量,无需从您的设备发送它们,我们将使用{device}
(设备 ID)、{lat}
(模块的纬度)和{lng}
(模块的经度),这些变量将自动发送到 SigFox到 12 个字节的有效负载中,因此您可以使用它们而无需专门从您的设备发送这些字符串。我们还将使用{customData#str}
这个变量来保存 Arduino MKR1200 fox 发送的数据,customData
指的是设备发送的个性化数据#str
表明设备将读取设备str
发送的字符串。
我们还将添加一个网站来检查接收到的坐标,使用谷歌地图,我们可以在地图上精确定位接收到的数据。这是 url https://www.google.com/maps/?q={lat},{lng}
, lat 和 lng 将自动更改为纬度和经度变量。
最后,您的消息应如下所示:
现在单击确定,一切就绪。
最后
您需要做的最后一件事是上传下面的代码,确保您已根据自己的喜好自定义了标有“TODO”的变量,等待 GOS 模块上的蓝灯闪烁,然后断开微控制器与计算机的连接,然后将电池放入电池盒中。你都准备好了。
我设计了一个外壳来保证设备的安全并使其看起来更有吸引力,我使用了两块丙烯酸并将边缘熔化成 90 度弯曲。我把所有的电路放在里面,把电池盒放在它们下面,然后用两条电缆扎带把塑料片绑在一起。
最后,我覆盖了一块顶部(透明盖)以隐藏所有电线,只让项目的大脑可见。
我个人知道执行送孩子上学的简单任务会有多大压力,每个人都担心孩子上学时可能发生的所有事情。
该项目面向所有在送孩子上学时感到压力的人。SWay 会让您放松,因为您知道您的孩子会安全到达学校。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !