Also setze ich jetzt Variablen mit String drin. Aber gibt es eine
Möglichkeit, die Variablen zum Beispiel mit dem seriellen Monitor zu
setzen.
Ich möchte einen neuen Raumnamen_lang setzen, also schreibe ich in den
Monitor so etwas wie:
1
#roomname_long Lange testen
Und die Antwort wäre:
1
~@roomname_longLangetesten
Und wenn ich die Lesetaste auf meinem Esp32 drücke, sollte es mir den
neuen Namen für roomname_long geben
ist das möglich?
Sicher geht das. Du musst dir ein Befehlsformat ausdenken und ein
Programm schreiben das darauf reagiert. Denkbar wäre zum Beispiel:
set roomname_long=Schlafzimmer
set roomname_short=SZ
In deiner Hauptschleife empfängst du zeilenweise vom Seriellen port.
Wenn die Zeile mit "set " beginnt, dann splittest du den Rest am "="
Zeichen und speicherst es in preferences ab.
Die Klassen Serial und String haben alles, was du dafür brauchst.
.. Könntest du mir bitte dabei helfen. Ich bin etwas überfordert. Es
klingt nämlich nicht so schwer, doch eine Hilfe würde gut tun, wenn es
natürlich möglich ist.
Stefan ⛄ F. schrieb:> Sicher geht das. Du musst dir ein Befehlsformat ausdenken und ein> Programm schreiben das darauf reagiert. Denkbar wäre zum Beispiel:>> set roomname_long=Schlafzimmer> set roomname_short=SZ>> In deiner Hauptschleife empfängst du zeilenweise vom Seriellen port.> Wenn die Zeile mit "set " beginnt, dann splittest du den Rest am "="> Zeichen und speicherst es in preferences ab.>> Die Klassen Serial und String haben alles, was du dafür brauchst.
.. Könntest du mir bitte dabei helfen. Ich bin etwas überfordert. Es
klingt nämlich nicht so schwer, doch eine Hilfe würde gut tun, wenn es
natürlich möglich ist.
quotendepp schrieb:> der langen Rede kurzer (Un)Sinn:> * was sind diese Preferences?> * was willst du überhaupt (genau) machen?> * warum verwendest du nicht Serial.read()?
Das habe ich ja beschrieben, ich möchte keine vorgefertigten Variablen
haben. Ich möchte die Variablen mittels Serieller Schnittstelle
eingeben.
Da es um einen ESP geht willst du wahrscheinlich nicht während der
Eingabe blockieren, bis der User die Enter Taste gedrückt hat.
Stattdessen sammelst du die Eingabe Zeichenweise in einen Puffer ein.
Und wenn dann irgendwann das Zeilenende '\n' kommt, dann wertest du die
bis dahin empfangene Zeile aus.
Eventuell magst du von
http://stefanfrings.de/esp8266/index.html#tcpsketch abgucken. Da
empfange ich Kommandos per Netzwerk, aber das Prinzip bleibt gleich.
Schau dir an, wie ich in loop() immer wieder process_incoming_tcp()
aufrufe, und wie dort append_until() benutzt wird, um die einzelnen
Textfragmente einzusammeln bis die Zeile abgeschlossen wurde.
Das gleiche Prinzip geht auch seriell, denn auch die Serial Klasse ist
ein Stream.
Testing T. schrieb:> Könntest du mir bitte dabei helfen. Ich bin etwas überfordert. Es> klingt nämlich nicht so schwer, doch eine Hilfe würde gut tun, wenn es> natürlich möglich ist.
1. Verstehen, was Serial.read() ist und was es tut
2. Einzelne Zeichen empfangen und je nach Zeichen etwas tun (LED
an/aus,...)
3. Strings empfangen und je nach String etwas tun (LED a/aus)
4. Strings in Befehle und Werte zerlegen ("LED1 an", "LED1 aus") und
entsprechend auswerten
5. Strings empfangen, in Befehle und Werte anhand eines eigenen
Protokolls zerlegen und die empfangenen Daten/Werte entsprechend in die
dazugehörigen Variablen räumen
> 1. Verstehen, was Serial.read() ist und was es tut> 2. Einzelne Zeichen empfangen und je nach Zeichen etwas tun (LED> an/aus,...)> 3. Strings empfangen und je nach String etwas tun (LED a/aus)> 4. Strings in Befehle und Werte zerlegen ("LED1 an", "LED1 aus") und> entsprechend auswerten> 5. Strings empfangen, in Befehle und Werte anhand eines eigenen> Protokolls zerlegen und die empfangenen Daten/Werte entsprechend in die> dazugehörigen Variablen räumen
Ich verstehe Serial.read()..
Ich habe aber nichts mit LED´s zutun es geht rein um das Prinzip wie ich
ein Platzhalter für eine Variable schaffe und diese dann benenne oder
ähnlich.
Testing T. schrieb:> .. Könntest du mir bitte dabei helfen. Ich bin etwas überfordert. Es> klingt nämlich nicht so schwer, doch eine Hilfe würde gut tun, wenn es> natürlich möglich ist.
1. Schritt Google aufrufen
2. Schritt ins Suchfeld eingeben wahlweise Tutotial, Beispiel, Example
in Kombination mit dem Suchbegriff.
3. Seite Aufrufen
4. Sich freuen, das man etwas selbst gefunden hat
5. Sind noch Unklarheiten vorhanden hier im Forum fragen
Andreas schrieb:> Testing T. schrieb:>> .. Könntest du mir bitte dabei helfen. Ich bin etwas überfordert. Es>> klingt nämlich nicht so schwer, doch eine Hilfe würde gut tun, wenn es>> natürlich möglich ist.>> 1. Schritt Google aufrufen> 2. Schritt ins Suchfeld eingeben wahlweise Tutotial, Beispiel, Example> in Kombination mit dem Suchbegriff.> 3. Seite Aufrufen> 4. Sich freuen, das man etwas selbst gefunden hat> 5. Sind noch Unklarheiten vorhanden hier im Forum fragen
Echt ja :)
Ich habe jetzt mal was versucht, doch leider klappt es nicht wie
gewollt.
1
#include<Preferences.h>
2
3
Preferencespreferences;
4
5
Stringroomname_long;
6
7
8
voidsetup(){
9
Serial.begin(115200);
10
11
}
12
13
voidloop(){
14
if(Serial.available()){
15
roomname=Serial.read();
16
Serial.print("Roomname_long: ");
17
Serial.println(roomname_long);
18
}
19
}
Wenn ich dann etwas im Seriellen Monitor eingebe kommt nur sehr viele
Anzeigen von Roomname_long:
Wie kriege ich es denn hin, dass ich im Monitor eingebe z.B
Roomname_long: (Hier der Name)
Testing T. schrieb:> roomname = Serial.read();
wo ist roomname definiert?
Testing T. schrieb:> Serial.println(roomname_long);
Wolltest du nicht roomname_long verändern durch deine Eingabe?
Das Gesuchte nennt sich meist "Serial Monitor", "Command Decoder" oder
"Serial Interpreter" und ist die Grundzutat für alle Basic- oder
Forth-Systeme.
In der Dauerschleife fragt man ab, ob ein Zeichen angekommen ist. Wenn
ja, macht man, was nötig ist um dieses Zeichen zu verarbeiten. Wenn nix
angekommen ist, macht man auch nix.
Wer viel Platz auf dem Mikrocontroller hat, legt den ganzen Interpreter
auf den uC. Wer wenig Platz hat (< 1 KByte) schreibt einen minimalen
1-Zeichen-Interpreter und hält den Großteil der Information auf einem
als Bedienterminal funktionierenden PC-Programm.
Dient außerdem hervorragend für alle mit der Arduino-IDE programmierten
uCs als Ersatz für den nicht vorhanden Debugger.
Gruß
Klaus (der soundsovielte)
Andreas schrieb:> Testing T. schrieb:>> roomname = Serial.read();>> wo ist roomname definiert?>> Testing T. schrieb:>> Serial.println(roomname_long);>> Wolltest du nicht roomname_long verändern durch deine Eingabe?
Oh stimmt :)
Also mit einem richtigen Debugger kann man jederzeit jede Variable
ändern die man möchte und sogar noch jede Variable anschauen.
Und auch noch das Programm Zeile für Zeile durchsteppen.
Dieses unsägliche Predigen von Debugging via serieller Schnittstelle
führt zu solchen völlig falschen Ansätzen.
Andreas schrieb:> Testing T. schrieb:>> roomname = Serial.read();>> wo ist roomname definiert?>> Testing T. schrieb:>> Serial.println(roomname_long);>> Wolltest du nicht roomname_long verändern durch deine Eingabe?
Roomname_long: 82
Roomname_long: 84
Roomname_long: 101
Roomname_long: 115
Roomname_long: 116
Roomname_long: 10
Die Antwort auf dem Monitor ist diese.. wie kommts
Cyblord -. schrieb:> Also mit einem richtigen Debugger kann man jederzeit jede Variable> ändern die man möchte und sogar noch jede Variable anschauen.> Und auch noch das Programm Zeile für Zeile durchsteppen.>> Dieses unsägliche Predigen von Debugging via serieller Schnittstelle> führt zu solchen völlig falschen Ansätzen.
Ich möchte nichts debuggen .. Im Grunde genommen werde ich mit einem
Terminal am Ende arbeiten, womit ich die Variablen werte setzen kann.
Ich möchte nur ein Grundbaustein anfertigen, womit Terminal weiß ok der
Benutzer hat Roomname_long angegeben also ersetze ich die Variable
Roomname_long mit dem gegebenen Wert.
Wie setze ich jetzt roomname_long in preferences ein ..
Und wie kriege ich es hin, dass ich selber wähle im Monitor welche
Variable ich ändern möchte.
Das Ziel welches ich erreichen möchte ist immernoch, wenn ich
roomname_long: Test
eingebe soll es die Variable roomname_long mit Test füllen
Testing T. schrieb:> Da geht´s ja mehr um WIFI Verbindung.
Wie gesagt geht es darum, Eingaben von einem Stream einzusammeln, und
der serielle Port ist genau wie eine TCP Verbindung ebenfalls ein
Stream.
Stefan ⛄ F. schrieb:> Testing T. schrieb:>> Da geht´s ja mehr um WIFI Verbindung.>> Wie gesagt geht es darum, Eingaben von einem Stream einzusammeln, und> der serielle Port ist genau wie eine TCP Verbindung ebenfalls ein> Stream.
Ich komme aber nicht mehr weiter mit dem, was ich zuletzt als Code
gepostet habe.
Testing T. schrieb:> Die Antwort auf dem Monitor ist diese.. wie kommts
Weil du jedes Zeichen einzeln liest ohne sie zeilenweise zu einem String
zusammen zu fügen. Genau für diese Aufgabe habe ich dir mein Beispiel
mit append_until() gezeigt.
Stefan ⛄ F. schrieb:> Testing T. schrieb:>> Die Antwort auf dem Monitor ist diese.. wie kommts>> Weil du jedes Zeichen einzeln liest ohne sie zeilenweise zu einem String> zusammen zu fügen. Genau für diese Aufgabe habe ich dir mein Beispiel> mit append_until() gezeigt.
Das ist doch schon längst Geschichte :)
Ich gehe nach dem Link (https://unsinnsbasis.de/esp32-preferences/) von
weiter oben vor - die Bibliothek kenne ich aber nicht.
Du möchtest in den Preferences ein neues Key/Value-Paar anlegen, wobei
du Key und Value über die serielle Schnittstelle übtragen möchtest?
Dafür scheint es anscheinend die Funktion size_t putString(const char*
key, String value);.
Jetzt musst du über die serielle Schnitstelle eine Variable mit dem
Namen/Key und eine mit dem Inhalt/Value befüllen, also ca. so:
1
charkeyToAdd[15];//Keys dürfen max. 15 Zeichen lang sein
2
StringvalueToAdd;
3
4
keyToAdd=Serial.ReadString(...);/*Ein Protokoll musst du dir ausdenken, genau so wie das hier steht wirds nicht gehen.*/
Testing T. schrieb:> Ich lese es ja so ein> roomname_long = Serial.readString();
Gerade war es noch Serial.read() nicht readString(). Ist dir der
Unterschied klar?
Ich halte Serial.readString() für "gefährlich", weil die Funktion
a) blockiert bis die Zeile abgeschlossen wurde oder ein (einstellbarer!)
Timeout auftrat. Wenn du das auf einem ESP8266 machst und der Timeout
>20ms ist, verlierst du gelegentlich die WLAN Verbindung. Ein Timeout
von 1s würde sogar den Watchdog-Reset auslösen.
b) Die Funktion liest eventuell mehr Zeichen ein, als RAM/Stack zur
Verfügung steht. Einen ESP8266 kann man mit mehr als 5 Kilobytes
zuverlässig zum abstürzen bringen.
Wie empfindlich der ESP32 darauf reagiert, weiß ich nicht. Die
append_until() Methode funktioniert jedoch mit Sicherheit auf allen
Mikrocontrollern zuverlässig.
Testing T. schrieb:> Was meinst du mit Protokoll?
Ein Aufbau für den String, den du überträgst.
Z.B. "SET [varname] [varvalue]
oder "GET [varname]"
Eben eine Befehlskette, die du am Ende aufdröseln und interpretieren
kannst.
SET roomname Schlafzimmer
"SET" -> Aha, es soll eine Variable gesetzt werden
"roomname" -> okay, die Variable roomname soll geändert werden
"Schlafzimmer" -> Ahhh, roomname soll auf Schlafzimmer geändert werden
Testing T. schrieb:> Aus der Seite kann ich leider nicht viel entnehmen ..
Dann musst du das auch lernen.
WIr können dir leider nicht alles kleinstschrittig vorkauen.
Dokumentationen finden, lesen und vielleicht sogar verstehen ist eine
grundlegende Fähigkeit.
Sebastian R. schrieb:> Testing T. schrieb:>> Aus der Seite kann ich leider nicht viel entnehmen ..>> Dann musst du das auch lernen.>> WIr können dir leider nicht alles kleinstschrittig vorkauen.> Dokumentationen finden, lesen und vielleicht sogar verstehen ist eine> grundlegende Fähigkeit.
Ich sehe ja keine Dokumentation. Es sind nur kurze Erklärungen
vorhanden, welche ich schon kenne.
Mein Fehler. Hab aus Unkenntnis der read()/readString() Methoden da
einfach readString(...) hingeschrieben, wobei das (...) als Platzhalter
für "die Parameter die da hin gehören" gedacht war. Tatsächlich haben
die Methoden keine Parameter.
Testing T. schrieb:> Es sind nur kurze Erklärungen> vorhanden, welche ich schon kenne.
Wenn du sie schon kennst, dann frage ich mich, weshalb du das Wissen
nicht anwendest.
Du weißt ja dann, welche(n) Parameter readString() erwartet, du setzt es
aber faszinierenderweise nicht um.
ziege schrieb:> Mein Fehler. Hab aus Unkenntnis der read()/readString() Methoden da> einfach readString(...) hingeschrieben, wobei das (...) als Platzhalter> für "die Parameter die da hin gehören" gedacht war. Tatsächlich haben> die Methoden keine Parameter.
Code Ausschnitt:
1
charkeyToAdd[15];//Keys dürfen max. 15 Zeichen lang sein
2
3
StringvalueToAdd;
4
5
keyToAdd=Serial.readString();
6
valueToAdd=Serial.readString();
7
8
preferences.begin("lizenzgeber",false);
9
10
preferences.putString(keyToAdd,valueToAdd);
11
12
preferences.end();
13
}
Ich bekomme leider eine Fehlermeldung ...
1
incompatible types in assignment of 'String' to 'char [15]'
Testing T. schrieb:> Ich sehe ja keine Dokumentation. Es sind nur kurze Erklärungen> vorhanden, welche ich schon kenne.
Du hast dir zu viel vorgenommen. Fange kleiner an - sehr viel kleiner.
Sprich: Mit einem Arduino Uno oder Nano. Dafür gibt es reichlich
Tutorials, die dich vom einfachsten LED Blinker beginnend an die
Programmiersprache und die Doku heran führen.
Solange du ein originales Arduino Board (also eben nicht den ESP32)
verwendest, findest du alle nötigen Infos auf der Arduino Webseite. Du
musst dir nur die Zeit nehmen, dich damit auseinander zu setzen.
Manche Leute können das halt gar nicht, dafür irgend etwas anderes was
auch nicht jeder kann.
Sebastian R. schrieb:> Testing T. schrieb:>> Es sind nur kurze Erklärungen>> vorhanden, welche ich schon kenne.>> Wenn du sie schon kennst, dann frage ich mich, weshalb du das Wissen> nicht anwendest.> Du weißt ja dann, welche(n) Parameter readString() erwartet, du setzt es> aber faszinierenderweise nicht um.
Es braucht normalerweise keine Parameter so weit ich es weiß, es liest
ja vom Seriellen Monitor meine Eingabe.
Stefan ⛄ F. schrieb:> Testing T. schrieb:>> Ich sehe ja keine Dokumentation. Es sind nur kurze Erklärungen>> vorhanden, welche ich schon kenne.>> Du hast dir zu viel vorgenommen. Fange kleiner an - sehr viel kleiner.> Sprich: Mit einem Arduino Uno oder Nano. Dafür gibt es reichlich> Tutorials, die dich vom einfachsten LED Blinker beginnend an die> Programmiersprache und die Doku heran führen.>> Solange du ein originales Arduino Board (also eben nicht den ESP32)> verwendest, findest du alle nötigen Infos auf der Arduino Webseite. Du> musst dir nur die Zeit nehmen, dich damit auseinander zu setzen.>> Manche Leute können das halt gar nicht, dafür irgend etwas anderes was> auch nicht jeder kann.
Ich hantiere halt nicht jeden Tag mit einer ESP32 rum, es geht
eigentlich gar nicht um die ESP32, sondern lediglich nur darum vom
Terminal aus einen Wert für die Variable setzen die ich möchte.
Testing T. schrieb:> es geht> eigentlich gar nicht um die ESP32, sondern lediglich nur darum vom> Terminal aus einen Wert für die Variable setzen die ich möchte.
Der ESP32 bringt da ein bisschen zusätzliche Komplexität rein, weil er
ein Betriebssystem hat. Und zwar eins, das nicht von Arduino kommt. Es
ist nur dazu kompatibel.
Stefan ⛄ F. schrieb:> Testing T. schrieb:>> es geht>> eigentlich gar nicht um die ESP32, sondern lediglich nur darum vom>> Terminal aus einen Wert für die Variable setzen die ich möchte.>> Der ESP32 bringt da ein bisschen zusätzliche Komplexität rein, weil er> ein Betriebssystem hat. Und zwar eins, das nicht von Arduino kommt. Es> ist nur dazu kompatibel.
Ok..wie fahre ich denn jetzt fort. Also ich hatte ja bis jetzt geschafft
gehabt, dass ich vom Seriellen Monitor einlese und er es mir in die
Variable schreibt, aber leider nicht persistent. Ich konnte es leider
nicht mit preferences... einbinden. Nochmals der Code:
Testing T. schrieb:> Das habe ich ja beschrieben, ich möchte keine vorgefertigten Variablen> haben. Ich möchte die Variablen mittels Serieller Schnittstelle> eingeben.
Variablen haben ihren Namen nur im Quellcode. Im Binärcode stehen nur
noch Adresse von Speicherplätzen und Register. Du brauchst also einen
Programmteil, der anhand deiner Eingaben diese Zuordnung macht.
Testing T. schrieb:> Ok..wie fahre ich denn jetzt fort. Also ich hatte ja bis jetzt geschafft> gehabt, dass ich vom Seriellen Monitor einlese und er es mir in die> Variable schreibt, aber leider nicht persistent.
Es existiert zu den preferences auf dem ESP32 eine Dokumentation im
Internet, und aus der kann selbst ein Schwachkopf wie ich, der zum
ersten Mal von den preferences hört. die passende Routine raussuchen. Da
du eventuell nicht mal das kannst, hier die Auflösung des Rätsels:
putString(const char* key, const String value)
Gruß Klaus (der soundsovielte)
Klaus S. schrieb:> Testing T. schrieb:>> Ok..wie fahre ich denn jetzt fort. Also ich hatte ja bis jetzt geschafft>> gehabt, dass ich vom Seriellen Monitor einlese und er es mir in die>> Variable schreibt, aber leider nicht persistent.>> Es existiert zu den preferences auf dem ESP32 eine Dokumentation im> Internet, und aus der kann selbst ein Schwachkopf wie ich, der zum> ersten Mal von den preferences hört. die passende Routine raussuchen. Da> du eventuell nicht mal das kannst, hier die Auflösung des Rätsels:>> putString(const char* key, const String value)>> Gruß Klaus (der soundsovielte)
Ich glaube du schwebst auf einer anderen Wolke ..
Schau dir meinen Code an da siehst du das es implementiert ist
Testing T. schrieb:> Ich bin jetzt soweit gekommen, doch leider wird mir nichts auf dem> Seriellen Monitor angezeigt.
Du solltest dir mal anschauen wozu setup() und wozu loop() da ist.
Testing T. schrieb:> Ich glaube du schwebst auf einer anderen Wolke ..> Schau dir meinen Code an da siehst du das es implementiert ist
Ja, wir scheinen auf derselben Wellenlänge zu schwingen, zum 2.Mal
überschneidet sich mein Text mit Deinem. Habe beide Male versucht,
meinen Beitrag zu löschen, ging aber nicht mehr, weil schon sofort eine
Antwort da war.
Testing T. schrieb:> Ich bekomme leider eine Fehlermeldung ...incompatible types in> assignment of 'String' to 'char [15]'
Schon mal bei Google eingegeben?
Testing T. schrieb:> Ok..wie fahre ich denn jetzt fort.
Timeout auf 60 Sekunden hoch setzen und hoffen, dass der ESP dabei nicht
neu startet. Falls er es tut: append_until() benutzen.
> aber leider nicht persistent
Variablen sind nie persistent. Das ist eine weitere Baustelle für die du
noch nicht bereit bist.
Früher hat man so eine Aufgabe durch programmieren gelöst. Heute braucht
man dafür ein Forum voller Helfer-Syndrom-Patienten die einen an der
Hand nehmen.
Stefan ⛄ F. schrieb:> Testing T. schrieb:>> Ok..wie fahre ich denn jetzt fort.>> Timeout auf 60 Sekunden hoch setzen und hoffen, dass der ESP dabei nicht> neu startet. Falls er es tut: append_until() benutzen.>>> aber leider nicht persistent>> Variablen sind nie persistent. Das ist eine weitere Baustelle für die du> noch nicht bereit bist.
preferences bringt es dazu, dass der Wert persistent gespeichert wird.
Wenn ich lokal eine Variable eingebe ist Sie persistent drauf.
Andreas schrieb:> Testing T. schrieb:>> Ich bekomme leider eine Fehlermeldung ...incompatible types in>> assignment of 'String' to 'char [15]'>> Schon mal bei Google eingegeben?
Ich hab das Problem schon gelöst. Mein neuer Code ist auch schon
aktualisiert im Beitrag drin.
Wie kriege ich es hin, dass beim hochladen die Frage gestellt wird:
Key? ich daraufhin den key eingebe und danach
Value? und daraufhin den Wert einfügen
Stefan ⛄ F. schrieb:> a) blockiert bis die Zeile abgeschlossen wurde oder ein (einstellbarer!)> Timeout auftrat. Wenn du das auf einem ESP8266 machst und der Timeout>>20ms ist, verlierst du gelegentlich die WLAN Verbindung. Ein Timeout> von 1s würde sogar den Watchdog-Reset auslösen.
Hach....
Spielt dir da evtl. die Fantasie einen Streich?
Das solltest du noch mal überdenken!
Denkhilfe:
Stream::timedRead() ruft yield() auf
EAF schrieb:> Spielt dir da evtl. die Fantasie einen Streich?> Stream::timedRead() ruft yield() auf
Vielleicht war das damals anders, als ich es versuchte. Das ist schon
einige Jahre her.
Damit sinkt aber die Bereitschaft dir helfen zu wollen, da die
Hilfswilligen jetzt in zwei Threads schauen müssen und evtl. schon
gelöste dinge doppelt gelöst werden.
Da wird was gesucht:
https://www.ausbildung.de/berufe/baecker/
Da hast du auch einen Meister bei der Hand, der dir sofort alle Fragen
beantwortet, oder dich mit einem Satz heisser Ohren versorgt.
Vielleicht passt das besser als Programmieren.
PittyJ schrieb:> Da wird was gesucht:> https://www.ausbildung.de/berufe/baecker/> Da hast du auch einen Meister bei der Hand, der dir sofort alle Fragen> beantwortet, oder dich mit einem Satz heisser Ohren versorgt.>> Vielleicht passt das besser als Programmieren.
Ich frage mich ob in allen anderen Berufsfeldern auch so viele komplett
talentlose Menschen rumspringen oder ob µC-Entwicklung hier besonders
ist.
Ich meine sind die Geigen-Foren auch soll von Leuten die ohne Saiten
spielen wollen und dabei den Bogen mit dem Hintern halten?
Andreas schrieb:> Damit sinkt aber die Bereitschaft dir helfen zu wollen, da die> Hilfswilligen jetzt in zwei Threads schauen müssen und evtl. schon> gelöste dinge doppelt gelöst werden.
Es ist ein neuer Thread, weil der alte mit dem jetzigen nichts mehr zu
tun hat. Das ist jetzt der Code im aktuellen Stand. Ich würde gerne
wissen kannst du helfen oder nicht, falls wenn nicht dann brauche ich
solche Kommentare nicht die unnötig die Leiste füllen
eingebe funktionierts nicht, weil es ein Char erwartet, ich weiß halt
nicht weiter. Das ist ja das eine Problem. Das zweite wäre, dass die
Ausgabe nicht funktioniert der Zeigt mir den Wert nicht an.
Testing T. schrieb:> Es ist ein neuer Thread, weil der alte mit dem jetzigen nichts mehr zu> tun hat. Das ist jetzt der Code im aktuellen Stand.
Wenn du mit dieser Einstellung auch an die Fehlersuche bei deinem
Programm ran gehst wird das nichts.
Hast du die Frage im anderen Thread (wink mit den Zaunpfahl - anderer
Thread), schon beantwortet wo der unterschied von setup() und loop()
ist?
Testing T. schrieb:> PittyJ schrieb:>> Warum schaust du nicht einfach in die Doku der Serial Klasse?>> https://www.arduino.cc/reference/de/language/functions/communication/serial/>>>> Da steht doch alles drin.>> Ich habe schon überall drauf geschaut. Wenn ich in dieser ZeilekeyToAdd> = Serial.readString("Key:");>> eingebe funktionierts nicht,
Wie kommst du von der verlinkten Doku zu der Annahme, dass readString
ein Parameter hat?
Nebenbei wartet die Funktion solange, bis ein NewLine eingegeben wurde.
Hallo,
hier mal ein vorgehen wie man das machen kann wenn von Stefan mit Wifi
dir das zu abstrakt war ;)
Habs nur schnell runter geschrieben funktioniert aber soweit :)
Gruß
> Wie kommst du von der verlinkten Doku zu der Annahme, dass readString> ein Parameter hat?>> Nebenbei wartet die Funktion solange, bis ein NewLine eingegeben wurde.
Ja, Sie hat keinen Parameter, ich habe nur zeigen wollen was ich vor
habe.
Andreas schrieb:> Testing T. schrieb:>> Es ist ein neuer Thread, weil der alte mit dem jetzigen nichts mehr zu>> tun hat. Das ist jetzt der Code im aktuellen Stand.>> Wenn du mit dieser Einstellung auch an die Fehlersuche bei deinem> Programm ran gehst wird das nichts.>> Hast du die Frage im anderen Thread (wink mit den Zaunpfahl - anderer> Thread), schon beantwortet wo der unterschied von setup() und loop()> ist?
Ich habe es im loop schon probiert. Ich wollte, dass das Programm im
setup() erstmal funktioniert.
Im Loop zeigt der mir halt nur die Begriffe an, welche ich eingetippt
habe.
Testing T. schrieb:> eingebe funktionierts nicht, weil es ein Char erwartet, ich weiß halt> nicht weiter. Das ist ja das eine Problem. Das zweite wäre, dass die> Ausgabe nicht funktioniert der Zeigt mir den Wert nicht an.
Normalerweise Löst man ein komplexes Problem, indem man es in
Teilprobleme zerlegt und löst dann Schritt für Schritt die Teilprobleme.
Also gehe dein erstes Teilproblem an, welches wohl ist Daten von der
Schnittstelle lesen. Kommst da das erwartete heraus?
Hast du das geschaft, werte die Empfangenen Daten aus.
usw.
Testing T. schrieb:> Ich würde gerne> wissen kannst du helfen oder nicht, falls wenn nicht dann brauche ich> solche Kommentare nicht die unnötig die Leiste füllen
Oh, wenn du meine Kommentare beherzigst, lernst du nicht nur
Programmieren sondern auch etwas fürs Leben.
Testing T. schrieb:> Im Loop zeigt der mir halt nur die Begriffe an, welche ich eingetippt> habe.
Das ist ja schon mal mehr als in setup() funktioniert. Also solltest du
da weiter machen und nicht einen Schritt zurück gehen.
Testing T. schrieb:> Ja, Sie hat keinen Parameter, ich habe nur zeigen wollen was ich vor> habe.
Wähnst du dich bei Wünsch' dir was?
Nutze die Funktionen die du hast, so wie sie benutzt werden sollen. Wenn
du dazu fragen hast, dann frag. Aber schreib keinen solchen
Quatsch-Code.
p.s raume[ANZ][2] muss dann in performance ablegen werden, wenn die
Änderung nach neustart noch da sein soll.
kannst dir auch mal "LittleFS" angucken, das ein Dateisystem für den
esp32.
Gruß
Andreas schrieb:> Testing T. schrieb:>> Im Loop zeigt der mir halt nur die Begriffe an, welche ich eingetippt>> habe.>> Das ist ja schon mal mehr als in setup() funktioniert. Also solltest du> da weiter machen und nicht einen Schritt zurück gehen.
Alles klar.
Testing T. schrieb:> PittyJ schrieb:>> Warum schaust du nicht einfach in die Doku der Serial Klasse?>> https://www.arduino.cc/reference/de/language/functions/communication/serial/>>>> Da steht doch alles drin.>> Ich habe schon überall drauf geschaut. Wenn ich in dieser ZeilekeyToAdd> = Serial.readString("Key:");>> eingebe funktionierts nicht, weil es ein Char erwartet, ich weiß halt> nicht weiter. Das ist ja das eine Problem. Das zweite wäre, dass die> Ausgabe nicht funktioniert der Zeigt mir den Wert nicht an.
In der verlinkten Doku ist auch ein print() drin. Was sollte diese
Funktion wohl tun???
Die Hälfte der Programmierung besteht aus Lesen und Verstehen von APIs
und Datenblättern. Wenn das dir zuviel ist, versuch es beim Bäcker.
PittyJ schrieb:> Die Hälfte der Programmierung besteht aus Lesen und Verstehen von APIs> und Datenblättern. Wenn das dir zuviel ist, versuch es beim Bäcker.
Da muss man aber die ABI (Allgemeines Backofen Interface / Bedienfeld)
und das Rezept verstehen bzw. befolgen.
Hallo,
hier mal ein Beispiel wie man Sachen einließt und auswertet.
Kenn mich leider nicht mit performace aus darum habs weggelasen, aber
das shema (gibt noch genug andere) aber hier schonmal eine.
must dir dann auf performace selber ummodeln.
Kannst dir ja auch mal "LittleFS" angucken, das ein Dateisystem für den
ESP32
Aus den Beipiel solltest du das auch mit Key abgleich hinbekommen.
p.s es nervt mehrere Threats auf zu machen zum selben Thema...
Gruß
Ich versuche zu verstehen was ich gerade falsch mache.
Wenn ich es starte kann ich mit wenigen Abständen einmal ein Key
eingeben und danach mein Value
Es wird im Monitor auch angezeigt, aber wenn ich nun meine ESP32 reboote
zeigt der mir mein Value nicht an.
Du hast doch echt einen Knall! jetzt schon der dritte Thread zum selben
Thema am selben Tag.
Sorry, wer jetzt noch zu helfen versucht, kann sich gleich mit einweisen
lassen.
PittyJ schrieb:> Nicht auf Diskette gesichert. Dann ist immer alles weg.> Ok, heute macht man das in der Cloud.>> #include "Cloud.h">> preferences.SaveToCloud();
:)
Stefan ⛄ F. schrieb:> Du hast doch echt einen Knall! jetzt schon der dritte Thread zum selben> Thema am selben Tag.>> Sorry, wer jetzt noch zu helfen versucht, kann sich gleich mit einweisen> lassen.
:)
Sebastian R. schrieb:> Und jetzt erwartest du wirklich noch, dass man dir hier hilft?
Ich erwarte die ganze Zeit, dass man mir hilft es gab nur eine Person,
die mir ein Code Beispiel vorgegeben hat und ich drauf aufbaue.
Testing T. schrieb:> Es wird im Monitor auch angezeigt, aber wenn ich nun meine ESP32 reboote> zeigt der mir mein Value nicht an.
Wo soll er es denn anzeigen?
Testing T. schrieb:> PittyJ schrieb:>> Nicht auf Diskette gesichert. Dann ist immer alles weg.>> Ok, heute macht man das in der Cloud.>>>> #include "Cloud.h">>>> preferences.SaveToCloud();>> :)
Ist natürlich Unsinn. Dazu braucht man das Cloud-Shield.
Und statt deinem Smiley könntest du mal erklären warum du glaubst deine
Variablen würden aus dem nichts persistent gespeichert.
Testing T. schrieb:> Ich erwarte die ganze Zeit, dass man mir hilft es gab nur eine Person,> die mir ein Code Beispiel vorgegeben hat und ich drauf aufbaue.
Den Code findest du in den Links der Helfenden.
Testing T. schrieb:> Ich versuche zu verstehen was ich gerade falsch mache.> Wenn ich es starte kann ich mit wenigen Abständen einmal ein Key> eingeben und danach mein Value
Was gibt denn dein Programm aus wenn du was eingibst?
Wie schon mal geschrieben aber nicht gemacht ... Teilprobleme!
Funktioniert das Lesen der Schnittstelle richtig?
Cyblord -. schrieb:> Testing T. schrieb:>> PittyJ schrieb:>>> Nicht auf Diskette gesichert. Dann ist immer alles weg.>>> Ok, heute macht man das in der Cloud.>>>>>> #include "Cloud.h">>>>>> preferences.SaveToCloud();>>>> :)>> Ist natürlich Unsinn. Dazu braucht man das Cloud-Shield.>> Und statt deinem Smiley könntest du mal erklären warum du glaubst deine> Variablen würden aus dem nichts persistent gespeichert.
Also im Prinzip funktioniert das System gerade ja so.
Ich gebe erst Key ein -> Enter
Nach einem kleinen Delay
Gebe ich mein Value ein -> Enter
Was ich nun wissen möchte hat der jetzt mein Value unter diesem Key
gespeichert?
Andreas schrieb:> Testing T. schrieb:>> Ich erwarte die ganze Zeit, dass man mir hilft es gab nur eine Person,>> die mir ein Code Beispiel vorgegeben hat und ich drauf aufbaue.>> Den Code findest du in den Links der Helfenden.>> Testing T. schrieb:>> Ich versuche zu verstehen was ich gerade falsch mache.>> Wenn ich es starte kann ich mit wenigen Abständen einmal ein Key>> eingeben und danach mein Value>> Was gibt denn dein Programm aus wenn du was eingibst?> Wie schon mal geschrieben aber nicht gemacht ... Teilprobleme!>> Funktioniert das Lesen der Schnittstelle richtig?
Habe ich gerade beantwortet :) . Es nimmt die Werte an und gibt Sie aus,
aber ob sie auch persistent gespeichert sind kriege ich nicht heraus
ProTipp schrieb:> Testing T. schrieb:>> zeigt der mir mein Value nicht an.>> Warum wohl? Lies mal die Description und dann spielst du dein Programm> im Kopf durch.>> https://www.arduino.cc/reference/en/language/functions/communication/serial/readstringuntil/
Ich glaube du hast eines nicht verstanden. Ich meine nach dem Restart
meiner ESP32 zeigt der mir den Value nicht an. Hierbei frage ich mich,
ob ich Mein Value richtig dem Key zugeordnet habe oder nicht, weil
hiermit müsste er mir mein Value anzeigen :
Testing T. schrieb:> weil> hiermit müsste er mir mein Value anzeigen :> preferences.getString("roomname_long", "");
Nein!
Da wird nur ein String zurückgegeben.
Den kann man in einer Variablen speichern oder einer anderen Funktion
übergeben.
In deinem längeren Beispiel, wurde die Variable output damit
beschrieben.
Dann ist aber nichts weiter im Programm passiert.
Dirk B. schrieb:> Testing T. schrieb:>> weil>> hiermit müsste er mir mein Value anzeigen :>> preferences.getString("roomname_long", "");>> Nein!>> Da wird nur ein String zurückgegeben.> Den kann man in einer Variablen speichern oder einer anderen Funktion> übergeben.>> In deinem längeren Beispiel, wurde die Variable output damit> beschrieben.> Dann ist aber nichts weiter im Programm passiert.
Sag ich doch. Die Basics fehlen komplett.
Gibt es keine Bücher mehr?
Die Volkshochschule Dortmund bietet sogar Programmierkurse an.
Programmieren ist mehr als copy&paste.
PittyJ schrieb:> Sag ich doch. Die Basics fehlen komplett.> Gibt es keine Bücher mehr?> Die Volkshochschule Dortmund bietet sogar Programmierkurse an.>> Programmieren ist mehr als copy&paste.
Deine Kommentare gehen mir langsam auf den Keks, wenn es dir nicht
gefällt schau nicht auf diesen Thread. Danke ciao
Dirk B. schrieb:> Testing T. schrieb:>> weil>> hiermit müsste er mir mein Value anzeigen :>> preferences.getString("roomname_long", "");>> Nein!>> Da wird nur ein String zurückgegeben.> Den kann man in einer Variablen speichern oder einer anderen Funktion> übergeben.>> In deinem längeren Beispiel, wurde die Variable output damit> beschrieben.> Dann ist aber nichts weiter im Programm passiert.
Ich hatte dieses Beispiel mit Variablen wo ich Strings schon zugewiesen
hatte und da hat es so geklappt, oder es funktionierte nur so.
Seit dem ich die Werte selber setze funktionierts nicht mehr.
Testing T. schrieb:> Seit dem ich die Werte selber setze funktionierts nicht mehr.
Tätigkeiten die schnell und nachhaltig Erfolg und Befriedigung
verschaffen:
Stricken, Landschaftsplege, Fenster putzen, Autos waschen ....
Testing T. schrieb:> Ich glaube du hast eines nicht verstanden.
Wow
Testing T. schrieb:> Deine Kommentare gehen mir langsam auf den Keks
Wwoooww
Testing T. schrieb:> Jap auch schon probiert.
Wooooooooooo?
Testing T. schrieb:> void setup() {> Serial.begin(115200);> delay(500);> preferences.begin("licence",false);> preferences.getString("roomname_long",""); Sinnlos<--------------- Hier sollst
du das probieren
> }> void loop() {> String keyToAdd; nicht initialisiert: Müll<-----------> String output;> String valueToAdd; nicht initialisiert: Müll<-----------> keyToAdd = Serial.readStringUntil('\n'); Timeout: andererMüll
bleibt<-----------
> valueToAdd = Serial.readStringUntil('\n'); dito<-----------> preferences.putString(keyToAdd.c_str(), valueToAdd); put andererMüll zu
andererMüll <-----------
> preferences.putString("roomname_long",valueToAdd); put andererMüll zu
"roomname_long"<-----------
> preferences.getString("roomname_long",valueToAdd); get andererMüll aus
"roomname_long"<-----------
> Serial.println(valueToAdd);print andererMüll <-----------> output = preferences.getString("roomname_long", "");
Testing T. schrieb:> PittyJ schrieb:>>> Sag ich doch. Die Basics fehlen komplett.>> Gibt es keine Bücher mehr?>> Die Volkshochschule Dortmund bietet sogar Programmierkurse an.>>>> Programmieren ist mehr als copy&paste.>> Deine Kommentare gehen mir langsam auf den Keks, wenn es dir nicht> gefällt schau nicht auf diesen Thread. Danke ciao
Mir gehen Leute auf den Keks, die nicht mal ein bisschen Biss haben,
sondern sich jeden Pups noch vorbeten lassen müssen.
Versuch doch einfach mal, etwas selber herauszufinden. Es stehen alle
Dokus im Netz. Doch manche brauchen wohl noch einen Vorleser dazu.
Selbst wenn man dir postet, dass in der Serial API ein print existiert,
dann kapierst du das nicht. Lies doch einfach mal die Seite durch, bevor
wieder nachgefragt wird.
Bei Amazon gibt es immer noch Bücher.
PittyJ schrieb:> Versuch doch einfach mal, etwas selber herauszufinden. Es stehen alle> Dokus im Netz. Doch manche brauchen wohl noch einen Vorleser dazu.> Selbst wenn man dir postet, dass in der Serial API ein print existiert,> dann kapierst du das nicht. Lies doch einfach mal die Seite durch, bevor> wieder nachgefragt wird.> Bei Amazon gibt es immer noch Bücher.
Lies dir doch mein letzten Beitrag dann kannste dir dein Print auch bei
Amazon zulegen.
Vielleicht solltest du bei preferences.getString nicht unbedingt den
Wert als Default angeben, den du auch erwartest.
"-" wäre ok.
String_1 wird auch nicht in preferences geschrieben.
1 Sekunde ist als Timeout für HAndeingaben eher zu klein.
Dirk B. schrieb:> Vielleicht solltest du bei preferences.getString nicht unbedingt den> Wert als Default angeben, den du auch erwartest.> "-" wäre ok.>> String_1 wird auch nicht in preferences geschrieben.>> 1 Sekunde ist als Timeout für HAndeingaben eher zu klein.
Ja, habe ich geändert.
Testing T. schrieb:> Was ich nun wissen möchte hat der jetzt mein Value unter diesem Key> gespeichert?Testing T. schrieb:> Ich glaube du hast eines nicht verstanden. Ich meine nach dem Restart> meiner ESP32 zeigt der mir den Value nicht an.
Logisch, der Mikrocontroller tut nur das, was du ihm befohlen hast.
Gebe die Werte doch einfach aus!
Da dein Programm schon mit der manuellen Eingabeaufforderung beginnt,
kannst du nicht sehen, ob und was vorher gespeichert wurde.
Stefan ⛄ F. schrieb:> Testing T. schrieb:>> Was ich nun wissen möchte hat der jetzt mein Value unter diesem Key>> gespeichert?>> Testing T. schrieb:>> Ich glaube du hast eines nicht verstanden. Ich meine nach dem Restart>> meiner ESP32 zeigt der mir den Value nicht an.>> Logisch, der Mikrocontroller tut nur das, was du ihm befohlen hast.> Gebe die Werte doch einfach aus!>> Da dein Programm schon mit der manuellen Eingabeaufforderung beginnt,> kannst du nicht sehen, ob und was vorher gespeichert wurde.
Aber wenn ich den Wert persistent speichere ( mit preferences) dann
müsste er ja mir beim Neustart den Wert zurückgeben können, wenn ich
danach verlange ?
Testing T. schrieb:> Aber wenn ich den Wert persistent speichere ( mit preferences) dann> müsste er ja mir beim Neustart den Wert zurückgeben können, wenn ich> danach verlange ?
Du liest den Speicher gar nicht aus! Dafür müsstest du nämlich die
getString() Methode aufrufen, bevor du die Eingabeaufforderung für
neue Werte anzeigst. Und natürlich müsstest du das Ergebnis auch
ausgeben, was du auch nirgendwo tust.
Die Anleitung dazu kennst du aber hoffentlich, oder?
https://randomnerdtutorials.com/esp32-save-data-permanently-preferences/
Was mache ich hier eigentlich? Ich muss bekloppt sein.
Kleiner Tipp: Programmieren lernst man besser auf einem PC. Erst wenn du
die Programmiersprache einigermaßen verstanden hast, solltest du dich an
Mikrocontroller heran wagen. Wenn dir das zu unbehaglich ist, dann lerne
wenigstens die Grundlagen anhand eines Tutorials, bevor zu mit fremden
Frameworks und Bibliotheken hantierst die du noch gar nicht verstehen
kannst. Fange z.B. damit an:
http://stefanfrings.de/mikrocontroller_buch/index.html
Wenn da ein % steht, dann war der Wert vorher nicht da.
Testing T. schrieb:> Ja, habe ich geändert.
Einmal. Bei 2 Aufrufen.
Das Timeout kannst du für diese Spielereien ruhig auf 30 Sekunden
setzen.
Testing T. schrieb:> Aktueller Stand
Hey sach mal, Warum gehst du immer 1 Schritt vor und dann wieder zwei
zurück. In loop() ist ja schon wieder nichts drin.
Zum 1000sten mal schau dir an wozu setup() und wozu loop() da ist und
was diese Funktionen machen.
Du fragst immer nach Code in der Arduino IDE gibt es im Datei-Menü ein
Punkt Examples oder Beispiele. Da gibt es bestimmt etwas zu deinen
Teilproblemen.
Apropos Teilprobleme ... Fange mal ein neues Demo Projekt an, in dem
ohne Benutzereingabe ein Wert in den NVS schreibst und beim nächsten
Programmstart wieder ausließt. Nicht MEHR und nicht weniger.
Noch mal der Tipp unterteile dein Problem in Teilprobleme! Das gilt
nicht nur fürs Programmieren sondern für alle Bereiche deines Lebens.
preferences.begin("licence", false); // Put true for read-only access
6
Serial.println("Value1: " + output1); // es wird immer nichts Ausgegeben, also Sinnlos
7
Serial.println("Value2: " + output2); // es wird immer nichts Ausgegeben, also Sinnlos
8
9
Serial.print("Enter Value 1: ");
10
Serial.setTimeout(1000);
11
valueToAdd2 = Serial.readStringUntil('\n'); // Es wird nichts gelesen, da du nicht schaffst in 1s etwas einzugeben- > Sinnlos
12
Serial.setTimeout(3000);
13
valueToAdd = Serial.readStringUntil('\n'); // Es wird nichts gelesen da du in 3s nichts eingegeben hast -> Sinnlos
14
preferences.putString("string_2", valueToAdd); // Es Wird nichts geschrieben, da vorher nichts eingegeben -> Sinnlos (wolltest du evtl string_1 schreiben?)
15
16
output1 = preferences.getString("string_1", valueToAdd); // Es wird nichts gelesen, da nichts vorher in string_1 geschriben -> Sinnlos