Binär-Uhr + Android App


Allgemeine Informationen

Die Binär-Uhr bzw. die Platine, App und Arduino-Quellcode wurde von uns selbst entwickelt und gebaut. Die App sowie das Arduino Projekt könnt Ihr direkt von unserer Seite downloaden. Euch steht natürlich frei, die ganzen Elemente nach euren Interessen anzupassen.

Viel Spaß beim nachbauen.


Inhaltsverzeichnis

Hardware

Auflistung aller Hardware-Komponenten und dem zugehörigen Schaltplan.
Im Download-Bereich könnt Ihr den Schaltplan als KiCad-Projekt herunterladen.
Die Bilder können durch einen Mausklick vergrößert werden.

Bauteile

Platine

Schaltplan

Gezeichnet mit KiCad 6.0

Ablesen

Umrechnung Binärzahlen in Dezimalzahlen

LED`s an oder aus LED 1 AN LED 2 AUS LED 3 AUS LED 4 AN
Zweierpotenz 20 21 22 23
Stellenwert 1 2 4 8
Berechnung 1x1 = 1 2x0 = 0 4x0 = 0 8X1 = 8
Ergebnis.: 1+0+0+8 = 9
Das Binärsystem (auch Dualsystem oder Zweiersystem) ist eine Form, wie du Zahlen darstellen kannst und zwar nur mit den zwei Ziffern 0 und 1. Mathematiker nennen das Binärsystem daher ein Stellenwert-Zahlensystem zur Basis 2.
Umrechnen.: Gehe jede Ziffer der Binärzahl durch. In unserem Beispiel von links nach rechts. Wenn die Ziffer 1 ist, schreibe die zugehörige Zweierpotenz. Wenn die Ziffer 0 ist, dann schreibe eine 0, da 0 mal x gleich 0 ist. Addiere jetzt die Zahlen zusammen. Somit erhaltet Ihr den Dezimalwert der Binärzahl.

Uhrzeit

Hier ein Beispiel wie die aktuelle Ansicht abgelesen werden kann. Es werden die Led-Reihen beginnend mit der 1 von 1 bis 6 nacheinander von links nach rechts abgelesen.

#No Bedeutung LED's BIN Wert DEZ
1 Stunden Zehner 1000 1
2 Stunden Einer 0100 2
3 Minuten Zehner 1000 1
4 Minuten Einer 1010 5
5 Sekunden Zehner 1100 3
6 Sekunden Einer 1001 9
Uhrzeit.: 12:15:39 Uhr

Mit dem aufleuchten der LED A, wird die Uhrzeit im Format 'hh:mm:ss' angezeigt.

Mit der Maus über das Bild fahren, um es zu animieren.

Datum

Hier ein Beispiel wie die aktuelle Ansicht abgelesen werden kann. Es werden die Led-Reihen beginnend mit der 1 von 1 bis 6 nacheinander von links nach rechts abgelesen.

#No Bedeutung LED's BIN Wert DEZ
1 Tag Zehner 1000 1
2 Tag Einer 0001 8
3 Monat Zehner 0000 0
4 Monat Einer 0100 2
5 Jahr Zehner 0100 2
6 Jahr Einer 1100 3
Datum.: 18.02.23

Mit dem aufleuchten der LED B, wird das Datum im Format 'dd.MM.yy' angezeigt.

Temperatur & Feuchte

Hier ein Beispiel wie die aktuelle Ansicht abgelesen werden kann. Es werden die Led-Reihen beginnend mit der 1 von 1 bis 6 nacheinander von links nach rechts abgelesen.

#No Bedeutung LED's BIN Wert DEZ
1 Temp Zehner 0100 2
2 Temp Einer 1000 1
3 Temp 1/10 1010 5
4 Feuchte Zehner 0110 6
5 Feuchte Einer 1000 1
6 Feuchte 1/10 0010 4
Temperatur.: 21,5°C Luftfeuchte.: 61,4% rF

Mit dem aufleuchten der LED C, wird die Temperatur in °C und Raumluftfeuchte in % angezeigt.

Stoppuhr

Hier ein Beispiel wie die aktuelle Ansicht abgelesen werden kann. Es werden die Led-Reihen beginnend mit der 1 von 1 bis 6 nacheinander von links nach rechts abgelesen.

#No Bedeutung LED's BIN Wert DEZ
1 Stunde Einer 0000 0
2 Minute Zehner 1010 5
3 Minute Einer 0100 2
4 Sekunde Zehner 1000 1
5 Sekunde Einer 0000 0
6 Sekunde 1/10 1100 3
Abgelaufene Zeit.: 0:52:10,3 Stunden

Wenn keine der LED`s A,B oder C leuchtet, ist die Stoppuhr aktiv. Diese wird im Format 'h:mm.ss,f' angezeigt.

Mit der Maus über das Bild fahren, um es zu animieren.

Android APP

die Android-App wurde mit Hilfe des MIT App Inventor erstellt.
Im Download-Bereich könnt die App direkt auf euer Smartphone downloaden. Auch das MIT App Inventor Projekt steht zum Download bereit und kann nach Bedarf entsprechend angepasst werden.

Verbindunsgaufbau


Wenn Ihr euer Smartphone mit der Uhr erfolgreich über Bluetooth verbunden habt, könnt Ihr die BinärUhr-App starten. Über das DropDown Menü lässt sich nun die Binär-Uhr auswählen und mit dem Button 'Connect selectes device' eine Verbindung zur Uhr aufbauen. Nach dem Verbindungsaufbau werden die ersten Daten von der Uhr zur App übertragen.

Home-Bildschirm


Nach dem Verbinden der App mit der Binär-Uhr und dem Empfang der ersten Daten werden diese in eurer App angezeigt. Hierzu zählen die Uhrzeit, Datum, Temperatur und Luftfeuchte. Über die 3 Button ‚Zeit‘, ‚Datum‘ und ‚Temp/Feuchte‘ werden diese direkt auf der Binär-Uhr angezeigt. Ist Random eingestellt (siehe Einstellungen), kehrt die Uhr nach einer bestimmten Zeit wieder zu Ihrem Anzeigerhythmus zurück und wechselt die einzelnen Bereiche wieder automatisch durch.

Stoppuhr


Über Stoppuhr Funktion kann diese gesteuert werden. Mit dem jeweiligen Button lässt sich die Funktion Starten, Stoppen und Resten. Die Binär-Uhr zeigt hierbei die aktuellen Werte mit Ihren LEDs an.

Einstellungen

Betriebsart

Im Feld Betriebsarten könnt Ihr über das Dropdown-Menü einstellen, ob die Anzeige rotierend zwischen den aktivierten Optionen (Time, Date, Temp/Feuchte) in einem bestimmten Zeitintervall wechseln soll. Alternativ lässt sich auch eine der drei Optionen statisch einstellen, sodass diese dauerhaft angezeigt wird. Der automatische Wechsel ist somit deaktiviert.

Color Settings

Über die Color Settings könnt Ihr den einzelnen LEDs verschiedene oder auch gleiche Farben zuweisen. Hierzu die jeweilige LED markieren (oder auch gleich mehrere) und über die 3 Farbschieber darunter die Farben einstellen.

Werte übertragen / Abbrechen

Mit dem Button ‚Werte übertragen‘, werden diese an die Binär-Uhr übertragen und im EEprom gespeichert. Mit dem Button ‚Abbrechen‘ werden die Änderungen verworfen und die Werte aus dem EEprom des Arduino neu geladen.

Arduino Quellcode

Hier der Arduino Quellcode.
Der Quellcode musste etwas angepasst werden, dass er auf der Homepage richtig angezeigt und eingebunden werden kann.
Er kann somit nicht 1 zu 1 in die Arduino IDE übernommen werden.
Im Download-Bereich könnt Ihr das Arduino-Projekt downloaden und ggf. nach euren Wünschen anpassen.

/* BinaerClock V1.2 */

#pragma region INIT

//Bluetooth-Modul
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2); // TX, RX
String strReceived = "";
String strTempReceived = "";
//RTC-Clock
#include <DS3231.h>
DS3231  rtc(SDA, SCL);
//Feuchte und Temp Sensor
#include "DHT.h"
#define DHTPIN 4     // what digital pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
//EEPROM
#include <EEPROM.h>
//NeoPixel
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define NUMPIXELS 27
#define PIN 5
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//StoppUhr
#include <StopWatch.h>
StopWatch stopwatch;

//Variable Daten
//Variabeln f�r Betriebsart
String strBetArt = "";
String strTimeCol = "";
String strDateCol = "";
String strTempCol = "";
String strWetCol = "";
String strDotCol = "";
int intDTValue[5] = { 0 };
byte intBetData[7][9] = { {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, �
{0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, �
{0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0} };
//Variablen f�r Betrieb
int intBusy = 0; //Variablen zum Steuern des Loop
//Array LED-BIT
int intNumBit[2][10][4] = {
  {{0, 0, 0, 0}, {1, 0, 0, 0}, {0, 1, 0, 0}, {1, 1, 0, 0}, {0, 0, 1, 0},�
  {1, 0, 1, 0}, {0, 1, 1, 0}, {1, 1, 1, 0}, {0, 0, 0, 1}, {1, 0, 0, 1}},
  {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 1, 0, 0},�
  {0, 1, 0, 1}, {0, 1, 1, 0}, {0, 1, 1, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}}
};
unsigned long FuncMillis = 0; // Funktionsumschaltung f�r Anzeige ohne Delay
unsigned long BreakMillis = 0; //Verz�gerung f�r Anzeige ohne Delay
String strStepVal = "000";
int intIndexOf1 = 0;

#pragma endregion

#pragma region Setup
void setup()
{
  Serial.begin(57600); //Allgemeine Serielle Ausgabe
  while (!Serial) {} //Warten bis serielle Verbindung steht
  mySerial.begin(9600); //Bluetooth Verbindung
  rtc.begin(); //RTC(Uhr) Verbindung
  dht.begin(); //Feuchte und Temp Sensor
  pixels.begin(); //NeoPixel einbinden
}
#pragma endregion

#pragma region Loop
void loop()
{
  //Verarbeitungsschleife
  switch (intBusy)
  {
  case 0:
    EEpromToArray(); //Daten aus EEProm in Integer-Array schreiben
    IntToStr(); //Daten aus Integer Array in String speichern
    intBusy = 4;
    break;
  case 1://Stoppuhr anzeigen
    StoppUhr_Tick();
    break;
  case 2: //StoppUhr empfangene Werte von App anzeigen
    ShowStoppTime();
    intBusy = 3;
    break;
  case 3:
    // Nichts machen da Daten empfangen, oder Stoppuhr Ergebnis anzeigt
    break;
  default:
    if (millis() - FuncMillis > intBetData[0][4] * 1000)
    {
      FuncMillis = millis(); // aktuelle Zeit abspeichern
      switch (intBusy)
      {
      case 4:
        if (strStepVal == "000")
        {
          strStepVal = String(intBetData[0][1]) + �
          String(intBetData[0][2]) + String(intBetData[0][3]);
        }
        intIndexOf1 = strStepVal.indexOf('1');
        strStepVal.setCharAt(intIndexOf1, '0');
        break;
      case 5: //Uhrzeit anzeigen
        intIndexOf1 = 0;
        break;
      case 6: //Datum anzeigen
        intIndexOf1 = 1;
        break;
      case 7: //Temp Feuchte anzeigen
        intIndexOf1 = 2;
        break;
      }
    }

    if (millis() - BreakMillis > 500)
    {
      BreakMillis = millis(); // aktuelle Zeit abspeichern
      switch (intIndexOf1)
      {
      case 0:
        ShowData(0);//Zeit anzeigen
        break;
      case 1:
        intIndexOf1 = 3;
        ShowData(1);//Datum anzeigen
        break;
      case 2:
        intIndexOf1 = 3;
        ShowTempHum();//Temp und Feuchte anzeigen
        break;
      }
    }
    break;
  }
  //LOOP Anzeige Ende

//Bluetooth Verbindung
  if (mySerial.available())
  {
    strTempReceived = char(mySerial.read()); //Empfangener Wert Temp speichern
    if (strTempReceived == "*") //Suffix zum zur�cksetzen der Varibale
    {
      intBusy = 3;
      strReceived = "";
    }
    else if (strTempReceived != "#") //Werte speichern
    {
      strReceived += strTempReceived;
    }
    else //Wert verarbeiten
    {
      Datahandling(strReceived.substring(0, 1));
    }
  }
}
#pragma endregion

#pragma region ZeitDatum_anzeigen
/*Zeit / Datum anzeigen*/
void ShowData(int intCase)
{
  int intLedNum = 0;
  int intColPos = 0;
  String strData = "";

  switch (intCase)
  {
  case 0:/*Zeit*/
    strData = rtc.getTimeStr();
    strData.replace(":", "");
    break;
  case 1:/*Datum*/
    strData = rtc.getDateStr();
    strData.replace(".", "");
    strData.remove(4, 2);
    break;
  }

  for (int intPos = 0; intPos < 6; intPos++) /*Ansprechen der einzelnen LED-Reihen*/
  {
    String strDataVal = strData.substring(intPos, intPos + 1);
    int intDataVal = strDataVal.toInt();
    for (int intTBit = 0; intTBit < 4; intTBit++) /*Abfrage der einzelnen Bit*/
    {
      switch (intPos)
      {
      case 2:
        intColPos = 3;
        break;
      case 4:
        intColPos = 6;
        break;
      }
      int intGreen = intBetData[intCase + 1][intColPos];
      int intRed = intBetData[intCase + 1][intColPos + 1];
      int intBlue = intBetData[intCase + 1][intColPos + 2];
      if (intNumBit[intBetData[0][5]][intDataVal][intTBit] == 1)
      {
        pixels.setPixelColor(intLedNum, pixels.Color(intGreen, intRed, intBlue));
        pixels.show();
      }
      else
      {
        pixels.setPixelColor(intLedNum, pixels.Color(0, 0, 0));
        pixels.show();
      }
      intLedNum++;
    }
  }
  switch (intCase)
  {
  case 0:
    pixels.setPixelColor(24, pixels.Color(0, 0, 0));
    pixels.show();
    pixels.setPixelColor(25, pixels.Color(0, 0, 0));
    pixels.show();
    pixels.setPixelColor(26, pixels.Color(intBetData[5][0], �
    intBetData[5][1], intBetData[5][2]));
    pixels.show();
    break;
  case 1:
    pixels.setPixelColor(24, pixels.Color(0, 0, 0));
    pixels.show();
    pixels.setPixelColor(25, pixels.Color(intBetData[5][3], �
    intBetData[5][4], intBetData[5][5]));
    pixels.show();
    pixels.setPixelColor(26, pixels.Color(0, 0, 0));
    pixels.show();
    break;
  }
}
#pragma endregion

#pragma region Temp_Feuchte_anzeigen
/*Temp-Feuchte anzeigen*/
void ShowTempHum()
{
  int intLedNum = 0;
  int intColPos = 0;
  int intDataPos = 0;
  float fltHumidity = dht.readHumidity();
  float fltTemp = dht.readTemperature();
  String strData = String(fltTemp) + String(fltHumidity);
  strData.replace(".", "");
  strData.remove(3, 1);

  for (int intPos = 0; intPos < 6; intPos++)
  {
    String strDataVal = strData.substring(intPos, intPos + 1);
    int intDataVal = strDataVal.toInt();
    for (int intTBit = 0; intTBit < 4; intTBit++)
    {
      switch (intPos)
      {
      case 1:
        intColPos = 3;
        break;
      case 2:
        intColPos = 6;
        break;
      case 3:
        intDataPos = 1;
        intColPos = 0;
        break;
      case 4:
        intColPos = 3;
        break;
      case 5:
        intColPos = 6;
        break;
      }
      int intGreen = intBetData[3 + intDataPos][intColPos];
      int intRed = intBetData[3 + intDataPos][intColPos + 1];
      int intBlue = intBetData[3 + intDataPos][intColPos + 2];
      if (intNumBit[intBetData[0][5]][intDataVal][intTBit] == 1)
      {
        pixels.setPixelColor(intLedNum, pixels.Color(intGreen, �
        intRed, intBlue));
        pixels.show();
      }
      else
      {
        pixels.setPixelColor(intLedNum, pixels.Color(0, 0, 0));
        pixels.show();
      }
      intLedNum++;
    }
  }
  pixels.setPixelColor(24, pixels.Color(intBetData[5][6], �
  intBetData[5][7], intBetData[5][8]));
  pixels.show();
  pixels.setPixelColor(25, pixels.Color(0, 0, 0));
  pixels.show();
  pixels.setPixelColor(26, pixels.Color(0, 0, 0));
  pixels.show();
}
#pragma endregion

#pragma region StoppUhr_anzeigen
void ShowStoppTime()
{
  int intLED = 0;
  int intColPos = 0;
  for (int intRow = 0; intRow < 6; intRow++)
  {
    //Farbe zuweisen
    switch (intRow)
    {
    case 1:
      intColPos = 3;
      break;
    case 3:
      intColPos = 6;
      break;
    case 5:
      intColPos = 0;
      break;
    }
    int intGreen = intBetData[1][intColPos];
    int intRed = intBetData[1][intColPos + 1];
    int intBlue = intBetData[1][intColPos + 2];
    //Farbe zuweisen Ende
    for (int intBit = 0; intBit < 4; intBit++)
    {
      if (intNumBit[intBetData[0][5]][intBetData[6][intRow]][intBit] == 1)
      {
        pixels.setPixelColor(intLED, pixels.Color(intGreen, �
        intRed, intBlue));
        pixels.show();
      }
      else
      {
        pixels.setPixelColor(intLED, pixels.Color(0, 0, 0));
        pixels.show();
      }
      intLED++;
    }
  }
  pixels.setPixelColor(24, pixels.Color(0, 0, 0));
  pixels.show();
  pixels.setPixelColor(25, pixels.Color(0, 0, 0));
  pixels.show();
  pixels.setPixelColor(26, pixels.Color(0, 0, 0));
  pixels.show();
}
#pragma endregion

#pragma region StoppUhr_Tick
void StoppUhr_Tick()
{
  if (stopwatch.isRunning())
  {
    int intStopTime = stopwatch.ms();
    intBetData[6][5] = (intStopTime / 100) % 10;
  }
  if (intBetData[6][5] != intBetData[6][6])
  {
    intBetData[6][6] = intBetData[6][5];
    if (stopwatch.ms() > 1000)
    {
      intBetData[6][4]++; //Sekunden einer
      if (intBetData[6][4] > 9)
      {
        intBetData[6][4] = 0;
        intBetData[6][3]++; //Sekunden zehner
        if (intBetData[6][3] > 5)
        {
          intBetData[6][3] = 0;
          intBetData[6][2]++; //Minuten einer
          if (intBetData[6][2] > 9)
          {
            intBetData[6][2] = 0;
            intBetData[6][1]++; //Minuten zehner
            if (intBetData[6][1] > 5)
            {
              intBetData[6][1] = 0;
              intBetData[6][0]++;
            }
          }
        }
      }
      stopwatch.restart();
    }
    ShowStoppTime();
  }
}
#pragma endregion

#pragma region Datahandling
/*Empfange Daten verarbeiten und antworten*/
void Datahandling(String strCaseValue)
{
  //***Start_Seite
  if (strCaseValue == "A") //Ger�te-ID abfragen
  {
    mySerial.print("a");
  }
  else if (strCaseValue == "B") //Home-Werte abfragen
  {
    String strDate = rtc.getDateStr();
    String strTime = rtc.getTimeStr();
    float fltHumidity = dht.readHumidity();
    float fltTemp = dht.readTemperature();
    mySerial.print("b," + strTime + "," + strDate + "," + �
    fltTemp + "," + fltHumidity + ",#");
    intBusy = 4;
  }

  //***Konfig-Seite
  //Werte abrufen und an App senden
  else if (strCaseValue == "C")    //Betriebsarten zur App senden
  {
    mySerial.print("c," + strBetArt + ",#");
  }
  else if (strCaseValue == "D")    //Farben Time an App senden
  {
    mySerial.print("d," + strTimeCol + ",#");
  }
  else if (strCaseValue == "E")    //Farben Date an App senden
  {
    mySerial.print("e," + strDateCol + ",#");
  }
  else if (strCaseValue == "F")    //Farben Temp an App senden
  {
    mySerial.print("f," + strTempCol + ",#");
  }
  else if (strCaseValue == "G")    //Farben Feuchte an App senden
  {
    mySerial.print("g," + strWetCol + ",#");
  }
  else if (strCaseValue == "H")    //Farben Dot`s an App senden
  {
    mySerial.print("h," + strDotCol + ",#");
    intBusy = 4;
  }
  //Werte empfangen und in Variablen speichern(Temp)
  else if (strCaseValue == "I")    //Betriebsarten speichern
  {
    strReceived.replace("true", "1");
    strReceived.replace("false", "0");
    strReceived.replace("I,", "");
    strBetArt = strReceived;
    mySerial.print("i");
  }
  else if (strCaseValue == "J") //Farben Zeitangabe speichern
  {
    strReceived.replace("J,", "");
    strTimeCol = strReceived;
    mySerial.print("j");
  }
  else if (strCaseValue == "K") //Farben Datum speichern
  {
    strReceived.replace("K,", "");
    strDateCol = strReceived;
    mySerial.print("k");
  }
  else if (strCaseValue == "L") //Farben Temperaturanzeige speichern
  {
    strReceived.replace("L,", "");
    strTempCol = strReceived;
    mySerial.print("l");
  }
  else if (strCaseValue == "M") //Farben Feuchteanzeige speichern
  {
    strReceived.replace("M,", "");
    strWetCol = strReceived;
    mySerial.print("m");
  }
  else if (strCaseValue == "N") //Farben aktuelle Anzeige speichern
  {
    strReceived.replace("N,", "");
    strDotCol = strReceived;
    mySerial.print("n");
  }
  else if (strCaseValue == "O") //Zeit und Datum setzen speichern
  {
    strReceived.replace("O,", "");
    StrToInt(7, strReceived);
    rtc.setTime(intDTValue[3], intDTValue[4], intDTValue[5]); �
    // rtc.setTime(hour,minute,seconds) for set time in format 24
    rtc.setDate(intDTValue[0], intDTValue[1], intDTValue[2]); �
    // rtc.setDate(date,month,year) for set date
    mySerial.print("o");
    //Alle �bertragenen Werte in Array speichern
    StrToInt(0, strBetArt);
    StrToInt(1, strTimeCol);
    StrToInt(2, strDateCol);
    StrToInt(3, strTempCol);
    StrToInt(4, strWetCol);
    StrToInt(5, strDotCol);
    intBusy = 4;
  }
  //EEPROM Verarbeiten
  else if (strCaseValue == "P") //Werte in EEPROM schreiben
  {
    mySerial.print("p");
    ArrayToEEprom();
    intBusy = 4;
  }
  else if (strCaseValue == "Q") //Werte aus EEProm laden
  {
    mySerial.print("q");
    intBusy = 0; //Im Loop werte aus EEProm laden und in intArray/String spreichern
  }
  //Schnelle Auswahl
  else if (strCaseValue == "R") //Zeit schnell Anzeigen
  {
    intIndexOf1 = 0;
    intBusy = 5;
  }
  else if (strCaseValue == "S") //Datum schnell Anzeigen
  {
    intIndexOf1 = 1;
    intBusy = 6;
  }
  else if (strCaseValue == "T") //Temp und Feuchte Schnell anzeigen
  {
    intIndexOf1 = 2;
    intBusy = 7;
  }
  //StoppUhr
  else if (strCaseValue == "U") //StoppUhr Start
  {
    stopwatch.start();
    intBusy = 1;
  }
  else if (strCaseValue == "V") //StoppUhr Stop
  {
    stopwatch.stop();
    strReceived.replace("V,", "");
    StrToInt(6, strReceived);
    intBusy = 2;
  }
  else if (strCaseValue == "W") //StoppUhr Reset
  {
    for (size_t intDel = 0; intDel < 7; intDel++)
    {
      intBetData[6][intDel] = 0;
    }
    intIndexOf1 = 0;
    intBusy = 4;
  }
  strReceived = "";
}
#pragma endregion

#pragma region StringToInteger
/*String in IntergerArray umwandeln*/
void StrToInt(int intCase, String strValue)
{
  char delimiter[] = ",";
  char *ptr;
  int i = 0;
  char cstrValue[strValue.length() + 1];
  strValue.toCharArray(cstrValue, strValue.length() + 1);
  ptr = strtok(cstrValue, delimiter);
  while (ptr != NULL)
  {
    switch (intCase)
    {
    case 7:
      intDTValue[i] = atoi(ptr);
      break;
    default:
      intBetData[intCase][i] = atoi(ptr);
      break;
    }
    i++;
    ptr = strtok(NULL, delimiter);
  }
}
#pragma endregion

#pragma region EepromToArray
/*Daten aus EEprom lesen*/
void EEpromToArray()
{
  //Betriebsdaten auslesen
  for (int intAdd = 0; intAdd < 6; intAdd++)
  {
    intBetData[0][intAdd] = EEPROM.read(intAdd);
  }
  //Farben auslesen
  int intLayer = 1;
  int intLayAdd = 0;
  for (int intAdd = 6; intAdd < 51; intAdd++)
  {
    intBetData[intLayer][intLayAdd] = EEPROM.read(intAdd);
    intLayAdd++;
    if ((intAdd == 14) || (intAdd == 23) || (intAdd == 32) || (intAdd == 41))
    {
      intLayAdd = 0;
      intLayer++;
    }
  }
}
#pragma endregion

#pragma region IntegerToString
/*Daten von Integer Array in String Speichern*/
void IntToStr()
{
  char buf[8];
  sprintf(buf, "%d,%d,%d,%d,%d,%d", intBetData[0][0], intBetData[0][1], �
  intBetData[0][2], intBetData[0][3], intBetData[0][4], intBetData[0][5]);
  strBetArt = buf;
  sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d", intBetData[1][0], �
  intBetData[1][1], intBetData[1][2], intBetData[1][3], intBetData[1][4], �
  intBetData[1][5], intBetData[1][6], intBetData[1][7], intBetData[1][8]);
  strTimeCol = buf;
  sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d", intBetData[2][0], �
  intBetData[2][1], intBetData[2][2], intBetData[2][3], intBetData[2][4], �
  intBetData[2][5], intBetData[2][6], intBetData[2][7], intBetData[2][8]);
  strDateCol = buf;
  sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d", intBetData[3][0], �
  intBetData[3][1], intBetData[3][2], intBetData[3][3], intBetData[3][4], �
  intBetData[3][5], intBetData[3][6], intBetData[3][7], intBetData[3][8]);
  strTempCol = buf;
  sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d", intBetData[4][0], �
  intBetData[4][1], intBetData[4][2], intBetData[4][3], intBetData[4][4], �
  intBetData[4][5], intBetData[4][6], intBetData[4][7], intBetData[4][8]);
  strWetCol = buf;
  sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d", intBetData[5][0], �
  intBetData[5][1], intBetData[5][2], intBetData[5][3], intBetData[5][4], �
  intBetData[5][5], intBetData[5][6], intBetData[5][7], intBetData[5][8]);
  strDotCol = buf;
}
#pragma endregion

#pragma region ArrayToEEprom
/*Array in EEprom Speichern wenn Werte unterschiedlich*/
void ArrayToEEprom()
{
  int intArrLay = 0;
  int intArrAdd = 0;
  for (int intEEAdd = 0; intEEAdd < 51; intEEAdd++)
  {
    if ((intEEAdd == 6) || (intEEAdd == 15) || (intEEAdd == 24) || �
    (intEEAdd == 33) || (intEEAdd == 42))
    {
      intArrLay++;
      intArrAdd = 0;
    }
    if (EEPROM.read(intEEAdd) != intBetData[intArrLay][intArrAdd])
    {
      EEPROM.write(intEEAdd, intBetData[intArrLay][intArrAdd]);
    }
    intArrAdd++;
  }
}
#pragma endregion

Download

Die App sowie das Arduino Projekt könnt Ihr direkt von unserer Seite downloaden. Euch steht natürlich frei, die ganzen Elemente nach euren Interessen anzupassen.

Bitte Datenschutzerklärung beachten!

Vor, während und nach dem Spielen, werden Daten mit unserem Server ausgetauscht. In unserer Datenschutzerklärung erhaltet Ihr hierzu weitere Informationen.