Hallo Community,
ich habe eine Frage: Kann man mit dem seriellem Monitor eine mit #define definierte Zahl ändern?
hi,
mit define definierst Du keine zahlen, sondern es wird im ersten arbeitsgang noch vor dem kompilieren parameter eins durch parameter zwei einfach ersetzt.
also #DEFINE NUM_LEDS 128
heißt, daß das wort NUM_LEDS einfach durch 128 ersetzt wird.
es ist wie bei einem texteditor das "suchen und ersetzen".
gruß stefan
Kann ich diesen Parameter per seriellem Monitor (z.B. für Temperatursteuerungen) ändern?
Nein, das ist keine Variable.
Prof_Proton:
Hallo Community,
ich habe eine Frage: Kann man mit dem seriellem Monitor eine mit #define definierte Zahl ändern?
Nein. Im Programmablauf können nur "Variablen" ihren Wert ändern.
Nein!
#define ist eine Textersetzung des Präprozessor. Verändern kann man eine solche "konstante" nicht. Erkläre bitte worum es genau geht.
Es geht um eine Temperatursteuerung meines Kaminofens. Ein Servo soll je nach Temperatur(differenz) die Luftlöcher weiter öffnen oder schließen. Dabei soll aber die Soll-Temperatur auch bestimmt werden können.
Und wie sieht dein entsprechendes Programm aus?
Was du brauchst ist lediglich eine veränderbare Variable für die Soll-Temperatur, welche du über die serielle Schnittstelle eingibst.
Das wäre auch möglich. Wie kann ich die Variable verändern?
hi,
erstmal, indem Du aus Deinem #DEFINE eine variable machst. am einfachsten statt:
#DEFINE SOLLWERT 23
byte SOLLWERT = 23;
diese variable SOLLWERT kannst Du dann verändern.
gruß stefan
Danke. Mit welchem "Befehl" kann ich das machen?
:-\ Arbeite die Basics durch
Prof_Proton:
Danke. Mit welchem "Befehl" kann ich das machen?
Den "Befehl" musst Du Dir selber schreiben, in Form einer selbstgeschriebenen "Funktion", die das macht, was Du möchtest.
Im Prinzip mußt Du Dir als erstes ein Übertragungsprotokoll ausdenken, dann die über die serielle Schnittstelle übertragenen Zeichen auswerten und das Ergebnis an Deine Variablen zuweisen.
Anbei ein Beispiel zum Verändern von drei Integer-Variablen x, y und z im Programm.
Übertragungsprotokoll: Übertragen wird ein Buchstabe zur Kennzeichnung der Variablen gefolgt vom neuen Wert, also z.B. "x55" oder "y 123".
Die selbstgeschriebene Funktion habe ich zahlenEmpfangen() genannt und rufe sie in der loop-Funktion regelmäßig auf.
In der loop wird regelmäßig einmal pro Sekunde der Wert der drei Variablen ausgegeben.
Democode:
void setup() {
Serial.begin(9600);
}
int x=10,y=20,z=30;
int* empfangeneZahl=&x;
void zahlenEmpfangen()
{
if (!Serial.available()) return;
delay(10);
while (Serial.available())
{
char c=Serial.read();
if (c=='x' || c=='X')
{
x=0;
empfangeneZahl=&x;
}
else if (c=='y' || c=='Y')
{
y=0;
empfangeneZahl=&y;
}
else if (c=='z' || c=='Z')
{
z=0;
empfangeneZahl=&z;
}
else if (c>='0' && c<='9')
{
empfangeneZahl[0]=empfangeneZahl[0]*10+(c-'0');
}
}
}
void loop() {
zahlenEmpfangen();
Serial.print(x);
Serial.print('\t');
Serial.print(y);
Serial.print('\t');
Serial.print(z);
Serial.println();
delay(1000);
}
@jurs DANKE für den Code. Da wäre ich alleine nie draufgekommen. Dass das so schwer ist, hätte ich nicht gedacht.
Und mit diesen Kenntnissen traust du dir es zu eine dezentrale, netzwerk-verbundene Heizungssteuerung aufzubauen?
Prof_Proton:
@jurs DANKE für den Code. Da wäre ich alleine nie draufgekommen. Dass das so schwer ist, hätte ich nicht gedacht.
Eine einzelne Funktion mit unter 20 Zeilen Programmcode (Zeilen ohne Code nicht eingerechnet) ist eigentlich nicht "schwer" sondern eher eine einfache Übung.
Natürlich gibt es immer mehrere Möglichkeiten, so etwas zu realisieren. Etwas umfangreicher ist die Funktion auch deshalb geworden, weil nicht nur eine Zahl an eine Variable übertragen werden kann, sondern mehrere Zahlen an mehrere verschiedene Variablen. Und auch deshalb, weil ich eine gewisse Fehlertoleranz mit ins Protokoll eingebaut habe, so dass wahlweise Klein- oder Großbuchstaben gesendet werden können, und es kann entweder kein Trennzeichen oder auch ein beliebiges Trennzeichen zwischen dem Buchstaben der Variablenkennung und der Zahl selbst stehen, so dass z.B. die Variable y auf den Wert 432 gesetzt werden kann mit:
y432
Y432
y 432
y=432
Y:= 432
und trotz dieser ganz unterschiedlichen Befehle kann mit jeder beliebigen Variante der Wert an die Variable zugewiesen werden.
Wenn das Protokoll überhaupt keine Fehlertoleranz benötigt, bekommt man es wohl auch mit etwas weniger Zeilen Programmcode hin. Wie gesagt, um Übertragungsprotokolle zu realisieren, gibt es immer mindestens mehrere oder sogar ganz viele verschiedene Möglichkeiten. Kommt ja auch immer auf den Anwendungszweck drauf an. Und ggf. auch darauf, ob ein Mensch die Daten eingibt und dabei ab und zu einen kleinen Fehler macht, oder ob die Daten direkt von einer Maschine erzeugt und gesendet werden, ohne den geringsten Interpretationsspielraum beim Übertragungsprotokoll.