Never Ride Alone:骑行安全守护神——基于 Sigfox 的智能自行车报警器
组件与物料
| 组件 | 数量 |
|---|---|
| 5mm 红色 LED | 2 |
| u-blox NEO-6M GPS 模块 | 1 |
| Arduino MKR Fox 1200 | 1 |
| 3.7V 锂电池 (150mAh) | 1 |
| 蜂鸣器 | 1 |
| 12mm 轻触开关 | 1 |
| 拨码开关 | 1 |
| 1kΩ 电阻 | 1 |
| Seeed Grove 震动传感器 (SW-420) | 1 |
所需工具
- 3D 打印机 (外壳打印)
项目背景
作者 Jesús Soriano 是电子工程学生兼骑行爱好者。独自骑行训练时常担心:若发生严重摔车昏迷在无人山区,手机无信号、电量耗尽,求救无门。现有方案 (Strava Summit、Specialized ANGi) 均依赖蜂窝网络,不适合深山环境。
发现 Sigfox 低功耗广域网 (LPWAN) 覆盖广、无需手机信号,且 Arduino MKR Fox 1200 集成 Sigfox 模块,遂诞生 Never Ride Alone (NRA)。
工作模式:倒计时报警器
- 出发前按键激活,双 LED 闪烁 (兼具警示后车)
- 震动传感器监测运动;连续 30 秒无运动 → 进入紧急模式
- 蜂鸣器鸣响,若用户未手动取消 (按键) → 判定受伤
- GPS 定位 → 经 Sigfox 发送经纬度高程 → 后台解析 → 邮件推送 Google Maps 链接给预设联系人
硬件集成
- 外壳:ABS 塑料,3D 打印 (Tinkercad 设计,适配 MKR Fox 1200、电池、按键、LED、GPS、蜂鸣器)
- GPS 天线粘贴外壳内侧,模块仅需 VCC/GND/TX
- 电池接 JST 插头,配合拨码开关开关机,支持无人机充电器充电
- 震动传感器本版本未启用,固件改为定时上报模式:每 10 分钟发送一次 GPS 坐标
Sigfox 后台配置
- 在 Sigfox Backend 注册设备,设置 Custom Callback
- Payload 解析格式:
lat::float:32 lon::float:32 alt::float:32(12 字节) - Callback URL 指向自建服务器或邮件网关,解析后发送含 Google Maps 链接的报警邮件
实测表现
道路测试信号良好,定位精度满足应急需求。设备仅需“按键+骑行”,训练结束关机充电,极简交互符合骑行者需求。
环保行动
团队骑行测试期间捡拾路边垃圾,发现多为能量胶包装、轮胎碎片。倡导赛事设置“清洁补给站”,骑行者不停车即可投放垃圾,赛后统一清理,践行可持续发展目标 (SDGs)。
核心固件 (定时上报版)
// NEVER RIDE ALONE V.0.1 - 定时发送 GPS 坐标
#include <SigFox.h> #include <ArduinoLowPower.h> #include <TinyGPS.h>
#define WAITING_TIME 10 // 分钟
#define GPS_PIN 2
#define GPS_INFO_BUFFER_SIZE 128
bool debug = true;
const int backlights = 4, pulsador = 5, audio = 3;
TinyGPS gps;
struct gpscoord { float a_latitude; float a_longitude; float a_altitude; };
float latitude, longitude, altitud;
void Wait(int m, bool slow) { /* LED 慢闪/快闪等待 m 分钟 */ }
String ConvertGPSdata(const void* data, uint8_t len) { /* 结构体转十六进制字符串 */ }
String GetGPSpositon() {
digitalWrite(GPS_PIN, HIGH); Wait(1, false); // GPS 预热 1 分钟
int messages_count = 0;
while (messages_count < 5000) {
while (Serial1.available()) {
char c = Serial1.read();
if (c == '$') messages_count++;
if (gps.encode(c)) {
gps.f_get_position(&latitude, &longitude);
altitud = gps.altitude() / 100;
gpscoord coords = {altitud, longitude, latitude};
digitalWrite(GPS_PIN, LOW);
return ConvertGPSdata(&coords, sizeof(gpscoord));
}
}
}
digitalWrite(GPS_PIN, LOW);
return "No Signal";
}
void SendSigfox(String data) { /* Sigfox 发送流程 */ }
void setup() {
pinMode(backlights, OUTPUT); pinMode(pulsador, INPUT); pinMode(audio, OUTPUT);
if (debug) { Serial.begin(9600); while(!Serial); }
Serial1.begin(9600); while(!Serial1);
pinMode(GPS_PIN, OUTPUT);
if (!SigFox.begin()) return;
if (debug) SigFox.debug(); else SigFox.end();
}
void loop() {
String pos = GetGPSpositon();
SendSigfox(pos);
Wait(WAITING_TIME, false);
}
完整代码、3D 外壳文件 (nra_v_0_1_qCsc7I6QvO.zip)、原理图见项目附件。
制造工艺
- 集成电路 (IC):微观世界里的算力引擎与制造极限
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- 多位置温度传感器系统,助力智能家居集成
- DIY Arduino USB 游戏手柄 — 自制高性能游戏手柄
- 自制 16×8 LED 矩阵俄罗斯方块游戏机:Arduino Nano + 74HC595 驱动
- MotionSense:基于 Arduino 与 ESP8266 的智能入侵检测系统
- Arduino MKR IoT 套件打造智能密码盒:Blynk 远程设密、舵机开锁
- 自制自主啤酒运输坦克:Walabot + Arduino + 树莓派 + Alexa语音控制
- MOSMusic 套件:MOSFET + Arduino 打造音乐同步灯光控制系统
- 钻床核心部件解析:从底座到主轴的完整拆解
- 内燃机核心零部件详解
- 掌握 C# switch 语句:语法、示例与最佳实践