Ich hab Emir folgendes Sketch gemacht um 2 Servos über eine Webseite mit schiebe Reglern zu steuern.
Das Sketch funktioniert auch, doch nun möchte ich das Sketch verkleinern, falls noch mal 2 Servos dazu kommen.
Um folgenden Bereich Handelt es sich:
Damit Steuer ich die Servos an, wäre es nicht möglich das ich das so dynamisch mache das ich das nur einmal brauche, und damit x beliebige Servos ansteuern kann?
Hallo Sascha,
Du kannst an zwei Stellen schnell Speicher sparen:
Verzicht auf die String-Klasse (stattdessen char-Arrays abgeschlossen durch '\0' [C-String] verwenden wenn es unbedingt Text sein muss; ansonsten numerische Kennung für die Servo-Identifikation)
Alles was gleich ist in eine Methode auslagern und der als Parameter jeweils das richtige Servo-Objekt übergeben und dann darauf arbeiten. Damit musst bei Änderungen nur an einer Stelle ackern und der Methode ist es egal, ob Du statt servo1 irgendwann mal servo5 reinsteckst
@uwefed
ja das soll auch so sein, es soll immer nur ein Server bewegt werden. Die schleife brauchte ich auch damit der Server in einem "gemütlichen" Tempo zum Ziel fährt
@wno158
Puh das war jetzt bissel viel für meine paar Gehirnzellen. Um ehrlich zu sein weis sich gar nicht was Du meinst
if (str_servo == "1" && str_angle != String(intPosServo01 -1)) {
Nein, es handelt sich erstmal um den von dir nicht gezeigten Bereich, fürchte ich.
Aus String str_servo; ein byte servoIndex; machen und
aus String str_angle; ein int. Der Verzicht auf Strings komprimiert noch mehr als du im Übersetzungsergebnis erkennen kannst.
Dann natürlich den doppelten Code in eine Funktion auslagern, die zweimal aufgerufen wird, evtl. drittens aus servo01 und servo02 ein Array machen, damit du das viertens leichter in einer Schleife aufrufen kannst.
Allerdings verstehe ich nicht, was an dem Datentyp String, den du ja verwendest, nicht zu verstehen ist. String ist speicheraufwendiger, nutzloser Schnickschnack. Wenn du Speicher sparen willst, fang da an.
Kann mir denn da echt keine auf die Sprünge helfen?
Nicht jeder ist doch gleich ein Mega Programmierer, wenn es so wäre
bräuchte man die Foren ja nicht mehr.
Ich habe versucht die String gegen Integer Variablen zu tuaschen, doch nun funktioniert die Abfrage nicht.
Auch das Serial.println bringt mir kein Ergebnis mehr
neuling321:
Kann mir denn da echt keine auf die Sprünge helfen?
Dann schreibe ganz genau was du wissen willst.
Wenn dir die bisherigen Antworten nicht reichten, schreibe WAS du nicht verstanden hast und wobei du noch Hilfe brauchst.
Beschreibe deine Hardware, setze anklickbare Links auf die Produkte die du einsetzt.
Wenn die Helfer irgendwelche Libraries installieren müssten, setze Links auf die Libraries wo sie her sind.
Handelt es sich um ein Hardwareproblem, mach einen Schaltplan und ein Echtbild und setze es hier rein.
Speicherproblem? Wie viel Speicher verbraucht der Sketch jetzt - auf wie viel willst du runterkommen.
Immer noch nicht klar? Stelle eine konkrete Frage.
Hallo Sascha,
es geht doch voran: Du hast jetzt Deine Servokennung schon auf int umgestellt und den Servocode in eine Funktion ausgelagert. Prima!
Dann musst Du (erstmal) nur noch Deine Abfrage anpassen.
Aus
// if (int_servo == "1" && int_angle != intPosServo01) {
sollte dann besser
if (int_servo == 1 && int_angle != intPosServo01) {
werden.
Ich weiss nicht, ob println() mit Variablen vom Typ String umgehen kann. An der Stelle würde ich dann erstmal die Ausgabe als C-String versuchen:
Serial.println(touchStr.c_str());
Danach hast Du zwei Möglichkeiten zum weiteren Vorgehen:
Die String-Klasse loswerden und dann das Werk "multi-Servo-tauglich" machen oder halt umgekehrt. Ich würde erst an die Stringklasse gehen, damit schaffst Du am schnellsten Platz.
Um die String-Klasse loszuwerden, musst Du Dich ein wenig mit dem Datentyp 'char' und Arrays davon beschäftigen (string - klein geschrieben).
Dein Phpoc-Client liefert jedenfalls beim readLine() schon passende Werte zurück (siehe PhpocClient.h, Zeile 72ff):
// Zeiger auf eine Zeile, die kannst Du Zeichen für Zeichen bis zum '\n' durchackern
char *readLine(void);
// oder:
// Übergabe der Zeile in einen von Dir bereitzustellenden Puffer, z.B. char puffer[20] wenn Du maximal 19 Zeichen erwartest
int readLine(uint8_t *buf, size_t size);
Gruß Walter
Und bitte nicht böse sein, dass die meisten hier keinen fertigen Code posten. Das erfordert erstens, dass wir Dein komplettes Problem nachbauen (Code kompilieren und testen) und zweitens hilft es Dir nur wenig - Du hast mehr davon, wenn Du selber probierst und dabei lernst. Bei ganz konkreten Problemen (wie der Vergleich eines int mit einem String) sieht das natürlich anders aus.
Viel Erfolg!
Also ich habe mir dieses Shield gekauft: PHPoC Shield
Das mit PHP ist überhaut nicht schlimm, man macht auf dem PHPoC Shield eine Webseite die an das Arduino die benötigten Parameter übergibt. Wirklich easy. Aber im Arduino Sketch wird es mit dem Umwandeln von String to Integer oder umgekehrt echt kompliziert :-(.
Wie gesagt das Arduino Sketch aus meinem Start Post läuft, ich kann über die Webseite, die Servos steuern. Ich wollte halt das Arduino Sketch noch bissel komprimieren da ich noch ein paar Ansteuerungen dazu programmieren wollte.
Werde nun versuchen, das was hier vorgeschlagen umzusetzen.
neuling321:
Das mit PHP ist überhaut nicht schlimm, ...
Wenn man von PHP kommt, sind Zeichenketten in C++ gruselig, zumindest für mich
Anstelle von dem, was vom Shield kommt, nutze ich den seriellen Monitor mit Eingaben wie "1-123", wobei der Monitor auf "Neue Zeile" stehen muß. Dann kann man sscanf zum Zerpflücken der Zeichenkette verwenden.
Feldindexe zählen ab 0, Du zählst die Motoren ab 1, das muß per Programm korrigiert werden.