CoroFence Thermische Detector: Geavanceerde PIR-sensor & IoT-integratie
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Panasonic GridEye | 1 |
| PIR-sensor, 7m | 1 |
| Buzzer | 1 |
| LED, RGB | 1 |
| Arduino Nano 33 IoT | 1 |
| Herlaadbare batterij, 3.7V | 1 |
| Kunststof behuizing, afdoos | 1 |
Apps en online diensten
- Arduino IDE
- DasData Maker Data Storage Channel
Over dit project
Huidige mondiale pandemie-crisis
Zoals de Wereldgezondheidsorganisatie (WHO) aanbeveelt om infectiespreiding te voorkomen: "regelmatig handen wassen, mond en neus bedekken bij hoesten en niezen, vlees en eieren goed gaar koken. Vermijd nauw contact met iemand die symptomen van respiratoire ziekte vertoont zoals hoesten en niezen".
Het is een gangbare praktijk geworden op luchthavens om thermische scanners te hebben om mogelijke geïnfecteerde reizigers te detecteren.
Zelfgemaakte thermische detector
Terwijl we gedwongen zijn om ons werk op afstand voort te zetten als beschermingslaag in de huidige situatie, moeten we contact met anderen vermijden tot de situatie onder controle is.
Het hoofddoel is een thermische camera-detector te bouwen die eenvoudig buiten je huis/lab/kantoor/shuttle geïmplementeerd kan worden, zodat je beschermd bent in je veilige zone.
Invoersensoren
- Grid Eye
"In tegenstelling tot conventionele thermische sensoren die alleen de temperatuur van een bepaald contactpunt meten, kan Grid-EYE, gebaseerd op Panasonic's MEMS-technologie, de temperatuur van het hele gespecificeerde gebied zonder contact meten; met andere woorden, het is een 'contactloze thermopile-array sensor'. 64 pixels leveren nauwkeurige temperatuurmeting over een kijkhoek van 60° door een siliciumlens. Grid-EYE gebruikt een I²C-communicatieinterface, wat temperatuurmeting mogelijk maakt met snelheden van 1 of 10 frames/sec. Een interrupt-functie is ook beschikbaar."
- Afmetingen: 11,6 x 4,3 x 8,0mm (L x H x B)
- Werks spanning: 3,3V of 5,0V (afhankelijk van P/N)
- Temperatuurmeetbereik: -20°C tot 100°C (afhankelijk van P/N)
- Kijkveld (FoV): 60°
- Aantal pixels: 64 (verticaal 8 x horizontaal 8)
- Externe interface: I²C (snelle modus)
- Frame rate: 10 frames/sec of 1 frame/sec
Wat deze sensor perfect maakt voor mensendetectie vanaf 1,5 meter en een doelwit op 5/7 meter.
- PIR
We hebben ook een trigger nodig omdat we de thermische camera willen activeren wanneer beweging gedetecteerd wordt. Een PIR-sensor is daarvoor de perfecte keuze.
"PIR-sensor detecteert een mens die zich binnen ongeveer 10m van de sensor beweegt. Dit is een gemiddelde waarde, de daadwerkelijke detectiebereik ligt tussen 5m en 12m. PIR-sensoren zijn fundamenteel gemaakt van een pyro-elektrische sensor, die infraroodstraling kan detecteren. Voor tal van essentiële projecten of items die moeten ontdekken wanneer een persoon een gebied binnenkomt of verlaat. PIR-sensoren zijn geweldig, ze zijn plat, laag-energetisch, hebben een wijd lensbereik, en zijn eenvoudig te interfaccen."
Alles samenvoegen zoals hieronder:
Visuele & geluidsoutput
- RGB LED
We willen direct temperatuursfeedback met een eenvoudige RGB LED die geprogrammeerd is om kleuren te tonen zoals we ze in de thermische camera zien.
- Buzzer
Wanneer de temperatuur boven de normale 37°C stijgt, activeren we een geluidsalarm om je te waarschuwen voor mogelijke gevaren.
Eindtesten
Terwijl de temperatuur normaal is en aanwezigheid gedetecteerd wordt, tonen we een groen licht.
// Verschillende kleuren kunnen ingesteld worden
if (tempC < 16) {
setColor(0, 0, 255); // blauw
} else if (tempC < 15) { // Let op: deze conditie is onbereikbaar (<16 voldoet al)
setColor(80, 0, 80); // cyaan
} else if (tempC < 20) {
setColor(0, 255, 255); // aqua
} else if (tempC < 24) {
setColor(0, 255, 0); // groen
} else if (tempC < 28) {
setColor(255, 255, 0); // geel
} else if (tempC < 37) {
setColor(255, 20, 20); // magenta
} else if (tempC < 38) {
setColor(255, 255, 0); // geel
} else if (tempC < 39) {
setColor(255, 0, 0); // rood
}
Om het geluidsalarm en rode kleur te testen, gebruik een strijkijzer voor kleding (per ongeluk ontdekt tijdens huishoudelijke taken).
Leef lang en voorspoedig
Alternatief kun je de temperatuur bekijken in een NodeJS-interface en de data van je Arduino via seriële verbinding ophalen met deze terminal-applicatie.
Verdere plannen zijn om de dataintegratie met het das-platform uit te breken en te beginnen met modelleren.
Volg live stream op @dasData
Blijf veilig waar je ook bent in deze periode in de Galaxie!
Code
coronafence (C/C++)
#include <Wire.h>
#include <SparkFun_GridEYE_Arduino_Library.h>
GridEYE grideye;
String heatData;
int ledState;
unsigned long meetime;
uint16_t seconds = 3142; // max == 65535
int bluePin = 8;
int greenPin = 9;
int redPin = 10;
int buzzPin = 11;
int inputPin = 12; // PIR-sensor input pin
int pirState = LOW; // we starten met aanname geen beweging gedetecteerd
int val = 0; // variabele voor pin-status lezen
float tempC;
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(buzzPin, OUTPUT);
pinMode(inputPin, INPUT); // sensor als input declareren
// Start favoriete I2C-object
Wire.begin(); // Bibliotheek gaat ervan uit "Wire" voor I2C, maar je kunt iets anders doorgeven met begin()
grideye.begin();
Serial.begin(115200);
}
void loop() {
char receiveVal;
if (Serial.available() > 0) {
receiveVal = Serial.read();
if (receiveVal == '1') {
ledState = 1;
} else {
ledState = 0;
}
}
val = digitalRead(inputPin); // lees input-waarde
if (val == HIGH) { // controleer of input HIGH is
if (pirState == LOW) {
meetime = millis();
Serial.println("Beweging gedetecteerd!");
// We willen alleen printen bij statusverandering, niet bij staat
pirState = HIGH;
getHeatmap();
if (tempC < 16) {
setColor(0, 0, 255); // blauw
} else if (tempC < 16) { // onbereikbaar
setColor(80, 0, 80); // cyaan
} else if (tempC < 20) {
setColor(0, 255, 255); // aqua
} else if (tempC < 24) {
setColor(0, 255, 0); // groen
} else if (tempC < 28) {
setColor(255, 255, 0); // geel
} else if (tempC < 37) {
setColor(255, 20, 20); // magenta
}
Serial.println(heatData);
delay(1500);
}
} else {
if (pirState == HIGH) {
// we hebben net uitgezet
noTone(buzzPin); // Stop geluid...
Serial.println("Beweging beëindigd!");
setColor(0, 0, 0); // uit
meetime = 0;
// We willen alleen printen bij statusverandering, niet bij staat
pirState = LOW;
}
}
}
void getHeatmap() {
// Print temperatuurwaarde van elke pixel in graden Celsius
// gescheiden door komma's
heatData = "";
float previousVal = 0;
for (unsigned char i = 0; i < 64; i++) {
if (previousVal > 37) {
// we hebben net aangezet
Serial.println "Hoge temperatuur!");
setColor(255, 0, 0); // rood
tone(buzzPin, 1000); // Stuur 1kHz geluidssignaal...
}
tempC = grideye.getPixelTemperature(i);
heatData += tempC + String(",");
previousVal = tempC;
}
// Einde van elk frame met newline
Serial.println();
// Geef Processing tijd om te verwerken
}
void setColor(int red, int green, int blue) {
#ifdef COMMON_ANODE
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
#endif
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
coronafence
Code voor Arduino IDE, Visual Studio 2019, NodeJS: https://github.com/dasdata/coronafence
Schema's

Productieproces
- Aangepaste 4×4 Boter-Kaas-Eieren Visitekaartje PCB – Ontwerp, Bouw en Code Handleiding
- Meerpositie-temperatuursensorsysteem voor slimme thuisintegratie
- DIY Soldeerbout-controller voor 862D+ — Precisie & Betrouwbaarheid
- MotionSense: Slimme inbraakdetectie met Arduino en ESP8266
- 3D-Printer Brandpreventie: Slimme Sensor Veiligheidssysteem
- Web-IoT Meter Bouwen met Arduino, Yaler en IFTTT
- Arduino-gebaseerde Afstotende Magnetische Levitatie: Eenvoudige Schakeling & DIY Handleiding
- Geavanceerde Remote-gecontrolleerde Gripper Robot voor Precisiehantering
- High-Performance Arduino Weerballon Datalogger
- ArduFarmBot Deel 2: Een Extern IoT-besturingsstation Bouwen
- Arduino Flip Clock met 8×8 LED Matrix – DIY Real-Time Clock Project