In diesem Artikel beschreibe ich die Entwicklung eines intelligenten Babythermometers. Dieses Thermometer verfügt über eine akkustische und visuelle Warnung, sofern eine kritische Temperatur erreicht wird. Weiterhin kann es drahtlos die Temperatur weitergeben und mittels Sprache ein und ausgeschaltet werden.
Erklärung
Ziel dieser Schaltung ist es, die Körpertemperatur eines Neugeborenen zu überwachen und dieses so vor Überhitzung und dem plötzlichen Kindstod zu bewahren. Im Notfall wird Alarm ausgelöst, sodass die Eltern schnell reagieren können.
Die unten gezeigte Schaltung verfügt über einen Bluetooth Empfänger. Ich verwende hier ein HC-05-Modul, welches sowohl als Master als auch als Slave geschaltet werden kann. Über das Smartphone kann ich mit der Android-App Blueterm auf den Sender zugreifen (dort erfolgt auch die Sprachsteuerung). Dazu verwende ich die Google-Spracherkennung innerhalb von Blueterm (vgl. hierzu das Tutorial von Gordon Williams).
Die Verbindung mit meinem Debian Linux Laptop stelle ich mit Blueman her. Sofern die Verbindung erfolgreich war, verbinde ich die Espruino Web-IDE über einen Seriellen Anschluss (trägt bei mir die Bezeichnung „/dev/rfcomm0“). Dort wird mir dann die Bluetooth Ausgabe des Espruino angezeigt. Als Temperatursensor verwende ich einen DS18B20+ (gibt es bei Farnell) in der Hochtemperaturvariante.
Schaltungsaufbau
Verbindungsübersicht
Kabel Espruino | Thermometer DS18B20+ | Lautsprecher | Bluetooth HC-05 |
3,3 | rot | 3,3 | |
GND | schwarz | 2. Eingang | GND |
A1 | orange | ||
A0 | 1. Eingang | ||
B6 | RXD | ||
B7 | TXD |
Programmcode
Der Quellcode ist gut kommentiert, sodass man ihn leicht verstehen sollte. Das Uhrwerk muss zuerst initialisiert werden in Zeile 19 bis 23. Auf meiner Espruino habe ich für eine genauere Uhrzeit einen 32,768KHz Quarz Kristall angelötet. Um die Temperaturwarnung zu testen, kann man den Temperatursensor an eine Lampe halten, um schneller die Maximaltemperatur zu erreichen.
Hier der Quellcode:
//Bluetooth HC-05 (optional) function onInit() {Serial1.setup(9600,{tx:B6,rx:B7});} //wie oft temperatur messen (in ms) var PRUEFINTERVALL=5000; //temperatur sensor TEMPANSCHLUSS=A1; var ow = new OneWire(TEMPANSCHLUSS); var sensor = require("DS18B20").connect(ow); //maximale temperatur var maxTemp = 37.5; //warnsignal var SPEAKER = A0; //Warnung var next_LED=0; var warnintervall; var ton; var tonTimeout; //startzeit für Uhr var time = { hours : 21, mins : 45, secs : 0 }; //LEDs initial aus LED1.write(0); LED2.write(0); LED3.write(0); function tonAn() { //audiosignal abgeben ton=setInterval(function() { analogWrite(SPEAKER,0.5,{freq:500}); tonTimeout=setTimeout(function() { digitalRead(SPEAKER); }, 80); },100); } function tonWarnung(an) { //Tonwarnung nur anschalten, wenn bisher aus if (an) { if (ton===undefined) { tonAn(); } } else { if (ton!==undefined) { clearInterval(ton); ton=undefined; } } } function ledBlink() { warnintervall=setInterval(function() { switch(next_LED) { case 1: LED1.write(1); LED3.write(0); break; case 2: LED2.write(1); LED1.write(0); break; case 3: LED3.write(1); LED2.write(0); break; } //Schleife über LEDs next_LED = Math.wrap(next_LED, 3) + 1; }, 100); } function ledWarnung(an) { //Lichtwarnung nur anschalten, wenn bisher aus if (an) { if (warnintervall===undefined) { ledBlink(); } } else { if (warnintervall!==undefined) { clearInterval(warnintervall); warnintervall=undefined; } LED1.write(0); LED2.write(0); LED3.write(0); //LED2 betriebsanzeige LED2.write(1); ledTimeout=setTimeout(function(){LED2.write(0);},1000); } } //führende nullen für zeitanzeige function addLeadingZeros(number, length) { var num = '' + number; while (num.length < length) num = '0' + num; return num; } //uhrwerk function onSecond() { time.secs++; if (time.secs>=60) { time.secs = 0; time.mins++; if (time.mins>=60) { time.mins = 0; time.hours++; if (time.hours>=24) { time.hours = 0; } } } } //sekundenschalter setInterval(onSecond,1000); //zeitanzeige function showTime() { var zeitanzeige=addLeadingZeros(time.hours,2)+":"+addLeadingZeros(time.mins,2)+":"+addLeadingZeros(time.secs,2)+" Uhr"; return zeitanzeige; } function pruefung() { var message=""; //Temperatur auslesen var temp = sensor.getTemp(); // pruefung der temperatur if (temp > maxTemp){ tonWarnung(true); ledWarnung(true); message=showTime()+" - Warnung: "+temp+" Grad"; } else { tonWarnung(false); ledWarnung(false); message=showTime()+" - Temp.: "+temp+" Grad"; } //Prüfergebnis ausgeben console.log(message); //über Bluetooth Serial1.println(message); } //Prüfung initial starten pruefInt=setInterval(function(){ pruefung(); command=""; }, PRUEFINTERVALL); //Sprachsteuerung var command = ""; Serial1.onData(function(e) { command += e.data; //ausschalten if (command.toLowerCase()=="ende"){ command=""; if (pruefInt!=="undefined"){ clearInterval(pruefInt); pruefInt=undefined; } } //anschalten else if (command.toLowerCase()=="start"){ command=""; if (pruefInt=="undefined"){ pruefInt=setInterval(function(){ pruefung(); command=""; }, PRUEFINTERVALL); } } });