Chevy
25.03.2015, 02:23
Hi,
ich weiß, das viele der Experten hier, sehr allergisch reagieren, wenn jemand schreibt "Ich habe ein Problem" und im endeffekt damit meint: "Wer löst mir mein Problem" bzw. "wer schreibt mir meinen Code"
Bei meinem Problem geht es nicht darum, dass mir jemand meine Arbeit abnimmt, sonder mich vielleicht auf den richtigen Weg bringen kann.
Also es geht darum das ich ein Projekt habe, wo verschiedene Arduinos getrennt arbeiten werden. Diese jedoch miteinander über Funkt kommunizieren sollen. Als erstes dachte ich mir, das die Anweisung, der Arduinos die meine Anzeige ansprechen wollen, über einen 8 stellige Zahl erfolgen soll. Nun muss der Empfänger diesen 8 stelligen Zahl auswerten und zwar jede der acht Stellen einzel. Damit ich dann später jeder Zahl eine Aufgabe zuweisen kann. Da es sich beim Empfänger um eine 13 Segment (pro Ziffer) Anzeige handelt die insgesammt 5 Ziffern besitzt und dazu noch einen Doppelpunkt und einen einzelnen Punkt sowie eine Möglichkeit den Ziffern entweder als Km/h oder Sek zu deklarieren, dachte ich das der Code mit den 8 stelligen Zahl eigentlich ganz gut ist.
Habe mir daher mal folgendes Programm ausgedacht, welches auch funktioniert. Ihr könnt es selber testen und es verändern z.B. eine andere Beispiel Zahl einsetzen oder die Beispielzahl automatisch um 1 erhöhen lassen und damit die Anzeige nicht so schnell scrollen, kann man die Pausen wieder aktivieren.
Meine Frage ist jetzt an die Experten: Ist das so in Ordnung oder mache ich es mir viel zu kompliziert bzw. gibt es einfachere Lösungsansätze?
Gruß Marco
/*
*
* Copyright (c) 2015 Marco Steinhauser. All rights reserved
*
* Anzeige
* Dieses Test Programm ist für die Anzeige DRAG Race
*
*
* getestet auf Arduino Uno R3
*
*
* Version 1.0
* Erstellt Vers. 1.0 am 24 März 2015
* V. 1.0 Eine 8 stellige Zahl wird in einzelnen Zahlen aufgeteilt
* Zur kontrolle der Funktion wird das Ergebnis auf den
* Seriellen Monitor ausgegeben.
*/
long zahl=12345678; //Beim Durchlauf mit +1 hier 9999999 eintragen.
int zahla=0;
int zahlb=0;
int zahlc=0;
int zahld=0;
int zahle=0;
long zahlf=0;
long zahlg=0;
long zahlh=0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
//delay(500);
//zahl = zahl++; //Zahl bei jedem Durchlauf um 1 erhöhen
Serial.println("");
Serial.print("Zahl Vorgabe="); Serial.println(zahl);
//delay(200);
bestimmeZahl();
}
void bestimmeZahl () // Funktion zum Auswerten einer 8 stelligen Zahl
{
/************************************************** ******************
Beispiel Zahl ist = 12345678
Zur bestimmung der ersten Ziffer wird die Zahl durch 10000000 geteilt.
Das Ergebnis wäre dann 1,2345678. Da jedoch die Variable "int" bzw.
"long" nur Ganzzahlen dasrstellen können ist das Ergebnis der ersten
Ziffer eine 1. Also erste Zahl "zahla" = 1
************************************************** *******************/
zahla=(zahl/10000000);// Die erste Zahl bestimmen
//Serial.print("Zahl A ="); Serial.println(zahla);
//delay (200);
/************************************************** *********************
Beispiel Zahl ist = 12345678
Zur Bestimmung der zweiten Ziffer wird als erstes die Zahl durch
1000000 (Also durch 1 mit 6 nullen, statt wie oben eine 1 mit 7 nullen)
geteilt. Das Ergebnis wäre dann 12,345678. Das Ergebnis, dass in die
Variable "zahlb" geschrieben wird ist eine 12
************************************************** **********************/
zahlb=(zahl/1000000); // Zweite Zahl bestimmen
/************************************************** *********************
Beispiel Zahl ist = 12345678
Zur Bestimmung der zweiten Ziffer wird nun das Modulo der Zahl in der
Variable "zahlb" bestimmt.
Modulo ist die sogenante Restklassenrechnung. Hier wird der Rest
einer Division berechnet. Die Formel lautet a = 10 * b + c oder in diesem
Fall "zahlb" = 10 * b + c
Bei Modulo mit 10 ist es immer die letzte Ziffer.
a = die Zahl die gegeben ist, also hier 12
b = die Zahl wie oft die 10 in die 12 passt, also hier 1
c = der Wert der Differenz zwischen a und 10, also hier 12-10=2
Also der Wert von "zahlb" ist somit 2.
************************************************** **********************/
zahlb=(zahlb%10);
//Serial.print("Zahl B ="); Serial.println(zahlb);
//delay (200);
/************************************************** *********************
Beispiel Zahl ist = 12345678
Zur Bestimmung der dritten Ziffer wird als erstes die Zahl durch
100000 (Also durch 1 mit 5 nullen, statt wie oben eine 1 mit 6 nullen)
geteilt. Das Ergebnis wäre dann 123,45678. Das Ergebnis, dass in die
Variable "zahlb" geschrieben wird ist eine 123
************************************************** **********************/
zahlc=(zahl/100000);
//delay (20);
/************************************************** *********************
Beispiel Zahl ist = 12345678
Zur Bestimmung der dritten Ziffer wird nun wieder das Modulo angewendet.
Variable "zahlc" hat den Wert 123. Also passt die 10 in die 123 genau 12
mal hinein und der Rest ist die 3
Also der Wert von "zahlc" ist somit 3.
Das ganze wird Sinngemäß für die anderen 5 stellen der Zahl
durchgeführt, bis alle Ziffern der 8 stelligen Zahl bestimmt wurde.
************************************************** **********************/
zahlc=(zahlc%10);
//Serial.print("Zahl C ="); Serial.println(zahlc);
//delay (200);
// vierte Zahl
zahld=(zahl/10000);
//delay (20);
zahld=(zahld%10);
//Serial.print("Zahl D ="); Serial.println(zahld);
//delay (200);
// fünfte Zahl
zahle=(zahl/1000);
//delay (20);
zahle=(zahle%10);
//Serial.print("Zahl E ="); Serial.println(zahle);
//delay (200);
// sechste Zahl
zahlf=(zahl/100);
//delay (20);
zahlf=(zahlf%10);
//Serial.print("Zahl F ="); Serial.println(zahlf);
//delay (200);
// siebte Zahl
zahlg=(zahl/10);
//delay (20);
zahlg=(zahlg%10);
//Serial.print("Zahl G ="); Serial.println(zahlg);
//delay (200);
// achte Zahl
zahlh=(zahl%10);
//Serial.print("Zahl H ="); Serial.println(zahlh);
//delay (200);
Serial.print("Zahl Neu =");
Serial.print(zahla);
Serial.print(zahlb);
Serial.print(zahlc);
Serial.print(zahld);
Serial.print(zahle);
Serial.print(zahlf);
Serial.print(zahlg);
Serial.println(zahlh);
}
ich weiß, das viele der Experten hier, sehr allergisch reagieren, wenn jemand schreibt "Ich habe ein Problem" und im endeffekt damit meint: "Wer löst mir mein Problem" bzw. "wer schreibt mir meinen Code"
Bei meinem Problem geht es nicht darum, dass mir jemand meine Arbeit abnimmt, sonder mich vielleicht auf den richtigen Weg bringen kann.
Also es geht darum das ich ein Projekt habe, wo verschiedene Arduinos getrennt arbeiten werden. Diese jedoch miteinander über Funkt kommunizieren sollen. Als erstes dachte ich mir, das die Anweisung, der Arduinos die meine Anzeige ansprechen wollen, über einen 8 stellige Zahl erfolgen soll. Nun muss der Empfänger diesen 8 stelligen Zahl auswerten und zwar jede der acht Stellen einzel. Damit ich dann später jeder Zahl eine Aufgabe zuweisen kann. Da es sich beim Empfänger um eine 13 Segment (pro Ziffer) Anzeige handelt die insgesammt 5 Ziffern besitzt und dazu noch einen Doppelpunkt und einen einzelnen Punkt sowie eine Möglichkeit den Ziffern entweder als Km/h oder Sek zu deklarieren, dachte ich das der Code mit den 8 stelligen Zahl eigentlich ganz gut ist.
Habe mir daher mal folgendes Programm ausgedacht, welches auch funktioniert. Ihr könnt es selber testen und es verändern z.B. eine andere Beispiel Zahl einsetzen oder die Beispielzahl automatisch um 1 erhöhen lassen und damit die Anzeige nicht so schnell scrollen, kann man die Pausen wieder aktivieren.
Meine Frage ist jetzt an die Experten: Ist das so in Ordnung oder mache ich es mir viel zu kompliziert bzw. gibt es einfachere Lösungsansätze?
Gruß Marco
/*
*
* Copyright (c) 2015 Marco Steinhauser. All rights reserved
*
* Anzeige
* Dieses Test Programm ist für die Anzeige DRAG Race
*
*
* getestet auf Arduino Uno R3
*
*
* Version 1.0
* Erstellt Vers. 1.0 am 24 März 2015
* V. 1.0 Eine 8 stellige Zahl wird in einzelnen Zahlen aufgeteilt
* Zur kontrolle der Funktion wird das Ergebnis auf den
* Seriellen Monitor ausgegeben.
*/
long zahl=12345678; //Beim Durchlauf mit +1 hier 9999999 eintragen.
int zahla=0;
int zahlb=0;
int zahlc=0;
int zahld=0;
int zahle=0;
long zahlf=0;
long zahlg=0;
long zahlh=0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
//delay(500);
//zahl = zahl++; //Zahl bei jedem Durchlauf um 1 erhöhen
Serial.println("");
Serial.print("Zahl Vorgabe="); Serial.println(zahl);
//delay(200);
bestimmeZahl();
}
void bestimmeZahl () // Funktion zum Auswerten einer 8 stelligen Zahl
{
/************************************************** ******************
Beispiel Zahl ist = 12345678
Zur bestimmung der ersten Ziffer wird die Zahl durch 10000000 geteilt.
Das Ergebnis wäre dann 1,2345678. Da jedoch die Variable "int" bzw.
"long" nur Ganzzahlen dasrstellen können ist das Ergebnis der ersten
Ziffer eine 1. Also erste Zahl "zahla" = 1
************************************************** *******************/
zahla=(zahl/10000000);// Die erste Zahl bestimmen
//Serial.print("Zahl A ="); Serial.println(zahla);
//delay (200);
/************************************************** *********************
Beispiel Zahl ist = 12345678
Zur Bestimmung der zweiten Ziffer wird als erstes die Zahl durch
1000000 (Also durch 1 mit 6 nullen, statt wie oben eine 1 mit 7 nullen)
geteilt. Das Ergebnis wäre dann 12,345678. Das Ergebnis, dass in die
Variable "zahlb" geschrieben wird ist eine 12
************************************************** **********************/
zahlb=(zahl/1000000); // Zweite Zahl bestimmen
/************************************************** *********************
Beispiel Zahl ist = 12345678
Zur Bestimmung der zweiten Ziffer wird nun das Modulo der Zahl in der
Variable "zahlb" bestimmt.
Modulo ist die sogenante Restklassenrechnung. Hier wird der Rest
einer Division berechnet. Die Formel lautet a = 10 * b + c oder in diesem
Fall "zahlb" = 10 * b + c
Bei Modulo mit 10 ist es immer die letzte Ziffer.
a = die Zahl die gegeben ist, also hier 12
b = die Zahl wie oft die 10 in die 12 passt, also hier 1
c = der Wert der Differenz zwischen a und 10, also hier 12-10=2
Also der Wert von "zahlb" ist somit 2.
************************************************** **********************/
zahlb=(zahlb%10);
//Serial.print("Zahl B ="); Serial.println(zahlb);
//delay (200);
/************************************************** *********************
Beispiel Zahl ist = 12345678
Zur Bestimmung der dritten Ziffer wird als erstes die Zahl durch
100000 (Also durch 1 mit 5 nullen, statt wie oben eine 1 mit 6 nullen)
geteilt. Das Ergebnis wäre dann 123,45678. Das Ergebnis, dass in die
Variable "zahlb" geschrieben wird ist eine 123
************************************************** **********************/
zahlc=(zahl/100000);
//delay (20);
/************************************************** *********************
Beispiel Zahl ist = 12345678
Zur Bestimmung der dritten Ziffer wird nun wieder das Modulo angewendet.
Variable "zahlc" hat den Wert 123. Also passt die 10 in die 123 genau 12
mal hinein und der Rest ist die 3
Also der Wert von "zahlc" ist somit 3.
Das ganze wird Sinngemäß für die anderen 5 stellen der Zahl
durchgeführt, bis alle Ziffern der 8 stelligen Zahl bestimmt wurde.
************************************************** **********************/
zahlc=(zahlc%10);
//Serial.print("Zahl C ="); Serial.println(zahlc);
//delay (200);
// vierte Zahl
zahld=(zahl/10000);
//delay (20);
zahld=(zahld%10);
//Serial.print("Zahl D ="); Serial.println(zahld);
//delay (200);
// fünfte Zahl
zahle=(zahl/1000);
//delay (20);
zahle=(zahle%10);
//Serial.print("Zahl E ="); Serial.println(zahle);
//delay (200);
// sechste Zahl
zahlf=(zahl/100);
//delay (20);
zahlf=(zahlf%10);
//Serial.print("Zahl F ="); Serial.println(zahlf);
//delay (200);
// siebte Zahl
zahlg=(zahl/10);
//delay (20);
zahlg=(zahlg%10);
//Serial.print("Zahl G ="); Serial.println(zahlg);
//delay (200);
// achte Zahl
zahlh=(zahl%10);
//Serial.print("Zahl H ="); Serial.println(zahlh);
//delay (200);
Serial.print("Zahl Neu =");
Serial.print(zahla);
Serial.print(zahlb);
Serial.print(zahlc);
Serial.print(zahld);
Serial.print(zahle);
Serial.print(zahlf);
Serial.print(zahlg);
Serial.println(zahlh);
}