Babythermometer – Microcontroller überwacht Baby (Bluetooth Variante)

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

 

babythermometer_Steckplatine

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);
 }
 }
});

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert