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 wird durch das Einbinden in die Homepage automatisch angepasst. Es werden z. B. Zeilenumbrüche eingefügt. Er kann somit nicht 1 zu 1 in die Arduino IDE übernommen werden. Die Arduino IDE (IDE = Integrated Development Environment) ist eine Software zum Programmieren von Arduino-Mikrocontrollern. Sie ermöglicht es, Programme mit der Programmiersprache C oder C++ zu schreiben und auf die Arduino-Boards zu übertragen. Der Arduino-Mikrocontroller führt diese dann aus.
Im Download-Bereich könnt Ihr das Arduino-Projekt herunterladen und ggf. nach euren Wünschen anpassen und erweitern.

/* 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.