DIY一个智能书包监控设备SmartWay

安全设备/系统

153人已加入

描述

  背景概述

  在我们孩子年纪还小,刚好到了需要独立上下学的时候,父母总是会担心他们的孩子。并且我们会希望他们的孩子准时到校,按时回家,走指定的路。

  SmartWay 旨在消除父母日常生活中的这种担忧。SmartWay 将在您的孩子上下学时监控他/她,确保您的孩子始终采取适当的路径到达他/她的目的地学校。我自己也知道送孩子上学的简单任务会有多大压力,每个人都无法预测孩子上下学时可能发生的所有事情。

  该项目针对所有在送孩子上学时感到压力的人。SWay 会让您放松,因为您知道您的孩子会安全到达学校。

  SWay 将使用 GPS 监控您孩子的地理位置,如果孩子偏离您分配给他/她的路径,将立即向家长发送电子邮件。当孩子到家或上学时,SmartWay 还会向家长发送一封电子邮件,并在孩子迟到时通知他们。通过这种方式,父母可以坐下来享受他们的咖啡,因为他们能够知道他们的孩子安全到达学校和家。

DIY设计

  功能性

  SmartWay 将持续监控您孩子从醒来到回家的地理位置。该设备还配备了一个 RGB LED 和一个振动电机,如果您的孩子没有采取正确的上学方式或迟到了,它会警告您的孩子,并在到达学校时发送通知。

  该设备通过许多功能工作,以确保您的孩子是安全的。

DIY设计

  第一个循环if(off track)检测孩子是否偏离了指定的路径,设备有一个系统来检测这种情况发生的次数;如果您的孩子第一次偏离航向,设备将通过将 LED 变为红色并振动电机来警告他/她,然后孩子将有两分钟的时间回到航向。如果孩子继续偏离航线两分钟,家长将收到一封电子邮件,警告他们的孩子偏离航线以及他/她的地理位置,电子邮件将每隔 2 分钟发送一次,直到孩子到达在家或在学校。

  if(school time)和if(home time)循环检测是否到了上学和回家的时间,然后设备检查孩子是否到校或回家,如果他/她及时到达,LED 将变为绿色,并且设备将向家长发送一封电子邮件,通知他们他们的孩子连同到达时间一起到达了他/她的目的地。否则,如果到了开学时间而孩子不上学,它也会

  设备只能发送 12 个字节的信息,因此发送时需要压缩包。其他变量将在 SigFox 后端配置。

DIY设计

  设备可以发送四个数据包:

  孩子偏离路线 - (“路线偏离”)

  孩子到家——(“在家”)

  孩子到学校——(“在学校”)

  孩子迟到——(“迟到”)

  预警系统

  每当孩子到校、到家、迟到或偏离路线时,佩戴设备的孩子都会收到提醒

  迟到:

DIY设计

  到达目的地:

DIY设计

  偏离路线:

DIY设计

  设备工作中:

DIY设计

  项目优势

  使用此设备的家长可以:

  确保他们的孩子安全往返学校

  确保他们的孩子准时到达这些地点

  确保他们的孩子不会偏离路线

  节能和低成本 - 长效电池

  构建项目

  第 1 步:所需设备

  要开始制作这个项目,我们需要收集材料。对于这个项目,您将需要:

  跳线

  NPN晶体管

  陶瓷电容(0.1µF)

  电阻器(220Ω)

  电阻(1KΩ)

  RGB LED

  GPS模块

  振动电机单元

  Arduino MKR Fox 1200

  2x AAA/ AA 电池盒

  AA电池

DIY设计

  第 2 步:连接电路

  下一步是连接电路;下面的图片说明了具体是如何连接的。布线有多个部分,因此它们被分成不同的图像。

DIY设计

  第 3 步:确认代码

  代码由多个函数组成,每个函数在项目的构成中发挥特定的作用。

  警告系统

  获取 GPS

  同步实时时钟

  实时位置

  发送数据

  动作响应

  下面对这些部分进行说明:

  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 和振动电机单元。

获取 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 模块接收位置和时间的循环。这个循环做了 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,开始发送数据包,然后解析适当的值。

  设置变量

  代码将包含多个变量,这些变量必须自定义以适应客户端,客户端将被要求设置

  上学时间

  孩子旅行的时间

  学校结束的时间

  调试

  学校地理位置(LAT、LNG);

  家庭地理位置(LAT、LNG);

  设置变量:

DIY设计

  设置

  确保电路接线正确后

  第 1 步

  打开SigFox 后端并登录您的 SigFox 帐户。

  第 2 步

  点击页面顶部下拉菜单中的“设备类型”

DIY设计

  第 3 步

  选择您的 Arduino MKRfox 并单击编辑

DIY设计

  第 4 步

  从左侧菜单中选择回调,然后导航到右上角的“新建”按钮。

DIY设计

  第 5 步

  单击新建后,您将看到一些回调配置选项,单击自定义回调

DIY设计

  接下来将打开一个窗口,填写给定的表格来创建您的回调

  将类型设置为数据、上行链路

  将频道设置为电子邮件

  自定义有效负载将读取板子发送的数据然后对其进行格式化,在我们的例子中,您必须声明一个变量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 将自动更改为纬度和经度变量。

  最后,您的消息应如下所示:

DIY设计

  现在单击确定,一切就绪。

  收尾

  您需要做的最后一件事是上传本文下方的代码,确保您已根据自己的喜好自定义了标有“TODO”的变量,等待 GOS 模块上的蓝灯闪烁,然后断开微控制器与计算机的连接,然后将电池放入电池盒中。你都准备好了。

  我设计了一个外壳来保证设备的安全并使其看起来更有吸引力,用了两块丙烯酸并将边缘熔化成 90 度弯曲。我把所有的电路放在里面,把电池盒放在它们下面,然后用两条电缆扎带把塑料片绑在一起。

DIY设计

  最后,我覆盖了一块顶部(透明盖)以隐藏所有电线,只让项目的主控可见。

  最终成果:

DIY设计

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分