Quellcode |
Quellcode App Inventor:
Quellcode Arduino:
// EMS-Betriebsstundenzähler
// Autoren: Sascha Herzig, Patrick Pallmer
//
Datum: 29.03.2016
//Verwendete Bibliotheken
#include
<CurieBLE.h>
#include
<EEPROM.h>
//Initialisierung der globalen Variablen
unsigned
long lastTriggerTime;
volatile
unsigned long triggerTime;
volatile
boolean triggered;
double
summe=0;
unsigned
long intsumme;
bool
BLEconfirmed = 0;
int
ausgabe = 0;
int
eeAddress = 0;
unsigned
long previousMillis = 0;
//Bluetooth Setup
BLEPeripheral blePeripheral;
// BLE
Peripheral Device (the board you're programming)
BLEService emsService("19B10000-E8F2-537E-4F6C-D104768A1214");
// BLE EMS Service
BLECharacteristic
timePassed("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify, 5);
// BLE Characteristic für die übergebenen Betriebszeiten
BLEUnsignedIntCharacteristic Reset("19B10002-E8F2-537E-4F6C-D104768A1214",
BLERead | BLENotify | BLEWrite);
// BLE Characteristic zum Betriebszeiten-Reset
//Interrupt-Service-Routine
void isr ()
{
if (triggered)
// Doppeltauslösung verhindern
return;
triggerTime = millis ();
// Variable triggerTime den aktuellen Timestamp zuweisen
triggered = true;
// Triggered flag auf true setzen
unsigned long currentMillis
= millis();
if(currentMillis - previousMillis > 10000)
// Alle 10 Sekunden den Wert im EEProm aktualisieren
{
EEPROM.put(eeAddress, summe);
// Neue Summe in EEProm schreiben
Serial.print("In EEProm schreiben");
// Text auf serieller Konsole ausgeben
previousMillis=currentMillis;
// neuer Timestamp = alter Timestamp
}
}
// Ende der Interrupt-Service-Routine
// Setup
void setup()
{
attachInterrupt(digitalPinToInterrupt (2), isr, RISING);
// Pin 2 als Interrupt-Pin deklarieren und auf steigende Flanke triggern
Serial.begin
(9600);
// Serielle Kommunikation initialisieren mit Baud-Rate 9600
Serial.println
("Started timing ...");
// Text auf serieller Konsole ausgeben
//Bluetooth
spezifisch:
blePeripheral.setLocalName("EMS");
blePeripheral.setAdvertisedServiceUuid(emsService.uuid());
// Service UUID hinzufügen
blePeripheral.addAttribute(emsService);
// BLE EMS service hinzufügen
blePeripheral.addAttribute(timePassed);
// Betriebsstunden Characteristic hinzufügen
blePeripheral.addAttribute(Reset);
// Betriebsstunden-Reset Characteristic hinzufügen
blePeripheral.begin();
Serial.println("Bluetooth device
active, waiting for connections...");
EEPROM.get(eeAddress, summe);
}
// Setup Ende
//Dauerschleife
void loop()
// Loop-Schleife
{
BLECentral
central = blePeripheral.central();
// Nach BLE peripherals suchen
if (central &&
!BLEconfirmed)
// Wenn mit BLE Central verbunden:
{
Serial.print("Connected to central: ");
// Nachricht auf Serialport ausgeben
Serial.println(central.address());
// MAC-Adresse der verbundenen BLE Central ausgeben
digitalWrite(13, HIGH);
// Verbindungs-LED einschalten
BLEconfirmed=1;
// Verbindungsflag auf True setzen
}
if(!central &&
BLEconfirmed)
// Wenn Verbindung unterbrochen/beendet:
{
BLEconfirmed=0;
// Verbindungsflag auf False setzen
Serial.print("Disconnected from central: ");
// nachricht auf Serialport ausgeben
Serial.println(central.address());
// MAC-Adresse der getrennten BLE Central ausgeben
digitalWrite(13, LOW);
// Verbindungs-LED ausschalten
}
if(Reset.written())
{
Serial.print("Reset
written");
summe =(double)
Reset.value();
EEPROM.put(eeAddress,
summe);
}
if
(!triggered)
// Folgenden Code nur ausführen wenn Triggerflag auf True
return;
double
elapsed = (triggerTime - lastTriggerTime);
// Zeitdifferenz aus aktuellem Timestamp und letztem Timestamp bilden
lastTriggerTime = triggerTime;
// aktuellen Timestamp für nächste Messung speichern
triggered =
false; // re-arm for next time
// Triggerflag auf false setzen (Interrupt scharf schalten)
if(elapsed<4500L)
// Wenn gemessene Zeitdifferenz < 500ms:
{
summe+=(elapsed/1000);
// Gemessene Zeitdifferenz zu Summe addieren
Serial.print(summe);
}
Serial.print
("Elapsed: ");
// Ausgabe auf Serialport
intsumme = (unsigned long)
summe;
// Double Summe auf unsigned int Summe casten
int hours, minutes, seconds;
// int Variable für Stunden, Minuten und Sekunden initialisieren
hours =
intsumme / 3600;
// Stunden aus intsumme errechnen
intsumme -=
hours * 3600;
// Stunden von intsumme abziehen -> durch cast auf int wird
Nachkommastelle abgeschnitten, dadurch funktioniert Rechnung
minutes =
intsumme / 60;
// Minuten aus intsumme errechnen
intsumme -=
minutes * 60;
// Stunden von intsumme abziehen
seconds =
intsumme;
// Verbleibende intsumme entspricht Sekunden
const unsigned
char array[5] =
{(char)(seconds+31),'|',(char)(minutes+31),'|',(char)(hours+31)};
// char-Array anlegen mit Stunden, Minuten und Sekunden getrennt durch |;
+31 für spätere Recodierung mit App-Inventor
timePassed.setValue(array,5);
// Array an BLE Characteristic timePassed übergeben
Serial.print (hours);
// Stunden, Minuten und Sekunden auf
Serialport ausgeben
Serial.print ("h ");
Serial.print (minutes);
Serial.print ("m ");
Serial.print (seconds);
Serial.print ("s ");
} // Ende der
Loop-Schleife