Nooit meer alleen fietsen: slimme fietsveiligheidssysteem (Never Ride Alone)
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| 5 mm LED: Rood | 2 |
| u-blox NEO-6M GPS module | 1 |
| Arduino MKR Fox 1200 | 1 |
| Batterij 3,7V (150 mAh LiPo) | 1 |
| Buzzer | 1 |
| Drukknop 12mm | 1 |
| Schuifschakelaar | 1 |
| Weerstand 1k Ω | 1 |
| Seeed Grove Trillingsensor (SW-420) | 1 |
Benodigde tools
- 3D-printer (voor behuizing)
Over dit project
Ik ben Jesús Soriano, elektronica-student, entrepreneur en fietser. Sinds mijn 12e jaart fiets ik alleen. Veel valpartijen en ongelukken – als ik bewusteloos zou raken in de bergen, zou niemand weten waar ik ben.
Bestaande oplossingen (Strava Summit, Specialized ANGi) vereisen mobiele dekking en zware batterijen. Mijn oplossing: Sigfox – laag vermogen, groot bereik, geen mobiel netwerk nodig. En de Arduino MKR FOX 1200 heeft Sigfox onboard!
Hoe NRA werkt
NRA werkt als een omgekeerde alarm:
- Je activeert NRA met de knop voor de training. LEDs knipperen (ook zichtbaarheid).
- Als 30 seconden geen beweging gedetecteerd wordt → noodmodus.
- Buzzer gaat af. Als je het niet uitschakelt (je bent gewoon gestopt) → alles ok.
- Als je het niet kunt uitschakelen (gewond/bewusteloos) → GPS activeert, locatie via Sigfox naar vrienden/familie.
Minimaal ontwerp: één knop, laden na afloop. Behuizing: ABS, 3D-geprint (Polytechnische Universiteit Valencia). Ontwerpbestanden: Tinkercad.
Sigfox-backend configuratie
Op de Sigfox-backend: callback die ruwe GPS-data (lengtegraad, breedtegraad, hoogte) omzet in leesbare info en e-maillink met Google Maps locatie naar geconfigureerde contactpersonen.
Bouwstappen
- GPS-module: VCC, GND, data-draad. Antenne gelijmd op frame.
- Arduino MKR FOX 1200 erbovenop.
- Batterij + schakelaar aangesloten op Arduino.
- Laadconnector (uitgeschakeld tijdens laden).
- Alle componenten in 3D-print behuizing passen (wat puzzelen, maar haalbaar).
Testresultaten
Eerste versie (zonder trillingsensor) stuurt elke 10 minuten GPS-positie. Goede resultaten. Getest op weg – werkt uitstekend. Geeft veiligheidsgevoel.
Duurzaamheid
Tijdens testritten alle afval opgepikt (energieriegel-wrappers, banden, gels). Meeste bergafval komt van fietsers! Nu "clean points" bij races: afval werpen zonder tijdverlies, opruimen na afloop.
Code (NRA v0.1)
///// NEVER RIDE ALONE V.0.1 /////
#include
#include
#include
#define WAITING_TIME 10
#define GPS_PIN 2
#define GPS_INFO_BUFFER_SIZE 128
bool debug = true;
const int backlights = 4;
const int pulsador = 5;
const int audio = 3;
TinyGPS gps;
int year; byte month, day, hour, minute, second, hundredths;
unsigned long chars; unsigned short sentences, failed_checksum;
char GPS_info_char, GPS_info_buffer[GPS_INFO_BUFFER_SIZE];
unsigned int received_char; bool message_started = false; int i = 0;
struct gpscoord { float a_latitude; float a_longitude; float a_altitude; };
float latitude = 0.0f, longitude = 0.0f, altitud = 0;
void Wait(int m, bool s) {
if (debug) { Serial.print("Waiting: "); Serial.print(m); Serial.println(" min."); }
digitalWrite(LED_BUILTIN, LOW);
int seg = s ? m * 30 : m * 15;
for (int i = 0; i < seg; i++) {
digitalWrite(backlights, HIGH); delay(500);
digitalWrite(backlights, LOW); delay(500);
}
}
void SendSigfox(String data) {
if (debug) { Serial.print("Sending: "); Serial.println(data); }
SigFox.begin(); delay(100);
SigFox.status(); delay(1);
if (debug) SigFox.debug(); delay(100);
SigFox.beginPacket(); SigFox.print(data);
if (debug) {
int ret = SigFox.endPacket(true);
if (ret > 0) Serial.println("No transmission");
else Serial.println("Transmission ok");
// status prints...
} else SigFox.endPacket();
SigFox.end();
}
String ConvertGPSdata(const void* data, uint8_t len) {
uint8_t* bytes = (uint8_t*)data;
String cadena;
for (int i = len - 1; i < len; --i) {
if (bytes[i] < 12) cadena.concat(byte(0));
cadena.concat(char(bytes[i]));
}
return cadena;
}
String GetGPSposition() {
int messages_count = 0; String pos;
if (debug) Serial.println("GPS ON");
digitalWrite(GPS_PIN, HIGH);
Wait(1, false);
while (messages_count < 5000) {
while (Serial1.available()) {
int c = Serial1.read();
if (c == '$') messages_count++;
// debug parsing...
if (gps.encode(c)) {
gps.f_get_position(&latitude, &longitude);
altitud = gps.altitude() / 100;
gpscoord coords = {altitud, longitude, latitude};
// debug prints...
digitalWrite(GPS_PIN, LOW);
return ConvertGPSdata(&coords, sizeof(gpscoord));
}
}
}
return "No Signal";
}
void setup() {
pinMode(4, OUTPUT); pinMode(backlights, OUTPUT);
pinMode(pulsador, INPUT); pinMode(audio, OUTPUT);
if (debug) { Serial.begin(9600); while(!Serial); Serial.println("Serial Connected"); }
Serial1.begin(9600); while(!Serial1);
if (debug) Serial.println("GPS Connected");
pinMode(GPS_PIN, OUTPUT);
if (!SigFox.begin()) { Serial.println("Shield error!"); return; }
if (debug) SigFox.debug(); else SigFox.end();
}
void loop() {
String pos = GetGPSposition();
SendSigfox(pos);
Wait(WAITING_TIME, false);
}
Bronnen
- 3D-print bestanden: Tinkercad
- Schema: zie projectpagina (let op: foto toont geen MKR1200)
Productieproces
- Geïntegreerde Schakelingen (IC's): Compacte, Krachtige Chips die Moderne Elektronica Aandrijven
- Arduino Digitale Dobbelsteen: Bouw Je Eigen LCD-willekeurige Getalgenerator
- Meerpositie-temperatuursensorsysteem voor slimme thuisintegratie
- DIY Arduino USB Gaming Controller – Bouw Je Eigen High-Performance Gamepad
- Bouw een Tetris-spel met Arduino Nano op een Zelfgemaakte 16×8 LED-matrix
- MotionSense: Slimme inbraakdetectie met Arduino en ESP8266
- Bouw een Veilige IoT Puzzeldoos met Arduino MKR Bundle – Stap-voor-Stap Handleiding
- MOSMusic Project Kit: MOSFET, Arduino en meer
- Essentiële Onderdelen van een Boormachine: Een Uitgebreid Overzicht
- Belangrijkste Componenten van een Interne Verbrandingsmotor
- De C# Switch Statement: Syntaxis, Voorbeelden & Best Practices