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
- Real Time Clock RTC DS3231 I2C Echtzeituhr
- HC-05 HC-06 Bluetooth RF-Transceiver-Modul RS232 serielle TTL
- Widerstand 110Ω, 1KΩ, 1,8KΩ, 10KΩ / Kondensator 100uF
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 |
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.