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

Download APP:

EMS_Zeitzaehler.zip