Winkelberechnung mit Arduino UNO

Hi

Drück Mal STRG+T

Dann wird Dir auffallen, daß die schließende Klammer über 'Heben einleiten' bereits ganz links steht.

Du hast Da wohl eine Klammer-Zu zu viel.

MfG

Die letzten Zeilen des Codes sind ausserhalb von loop.

...
 if (Schleifer1 == 0)
  {
    //      Drehen();
  }
  else
  {
    //      Kontur();
  }
}   // <-- das ist die schließende Klammer von loop

// alles was danach kommt ist ausserhalb und der Grund für die Fehlermeldung


//.............................Heben einleiten...............
if (digitalRead(TasteHochtief) == LOW) //Unterprogramm Hoch/Tief fahren/
{
  //      Heben();
}
//.............................Kippen einleiten...............
if (digitalRead(TasteKippen) == LOW)   //Unterprogramm Kamera kippen
{
  //     Kippen();
}

}

Hallo,

in Zeile 160, nach Kontor() ist die Klammer zu viel
und zusätzlich das Semikolon der while Zeile 148 muss weg

Jungs, ihr seid ja so gut. Dankeschön. Ich hatte das komplett durchsucht, aber scheinbar immer übersehen.
Das mit den Klammern und Semikola ist aber auch gewöhnungsbedürftig. Immer die gleichen Fehler.
Habt ihr da nen Trick, um so was zu finden?Ich habe mir den Wolf gesucht zumal die Fehlermeldungen ja nicht gerade aussagefähig sind.

Ein paar "Tricks" wurden schon erwähnt:

  • ausführlichen Warnungen einschalten
  • Auto-Formatierung mit STRG+T

Hallo,

mach mal die falsche Klammer wieder rein und gehe mit dem Cursor danach direkt hinter die Eröffnungsklammer von loop. Dann scrollste langsam nach unten guckst welche Schließklammer dir die IDE zugehörige anzeigt. Dann machste die falsche Klammer weg und guckst nochmal.

Bei Verdacht auf Klammerfehlern gehe immer alle durch dort wo ich zuletzt Code geschrieben oder geändert habe.
Eine gute Code Formatierung ist dabei viel wert.

Das falsche while Semikolon wird nicht als Fehler erkannt. Wäre fehlerfreier Syntax, nur die Wirkung vom Code ist damit verfälscht. Wenn man das wirklich bewusst mal so schreibt, sollte man das für später kommentieren.

    if(digitalRead(Start)==LOW)            //Unterprogramm Teller drehen

{
     if (digitalRead(Start)==LOW)               //Unterprogramm Teller drehen
     while(Start==LOW);                    //Entprellen und Doppeldruck unterdrücken
     {
     }
   }

zusätzlich das Semikolon der while Zeile 148 muss weg

Das verändert gar nichts.
Ist so oder so Schrott.

Wieso ist das Schrott. Wenn ich das nicht mache, läuft der Tastendruck ins Untermenü und stopt dort den Ablauf. Es ist ja eine Start/Stop Taste. Richtiges Entprellen geht natürlich anders.

Hallo,

du musst den Taster entprellen. Danach schaltest du mit dem "entprellten Signal" eine Statusvariable einfach nur um. Andere sagen toggeln dazu. Dann haste eine Schalterfunktion und nicht die Tasterfunktion.

@ micha:
Ja okay, dass Semikolon macht den Anweisungsblock überflüssig, weil dieser hier leer ist macht das nichts, angewöhnen sollte man sich das dennoch nicht, sonst wundert man sich nur noch was schief läuft.

michael_x:
... Ist so oder so Schrott.

Ich äußere mich mal zum anderen "so" : https://youtu.be/ne7okNbXym0

Wenn man sieht wie Sanladerer da mit den Tücken der Objekt-Positionierung kämpft, dann kann man das Projekt von Fridi nur begrüßen.
Da man aber tunlichst vermeiden sollte dass sich der Abstand zum Objekt durch den vertikalen "Aufzug" mit jeder Reihe ändert, habe ich mir einen Halbkreis aus Holz gebastelt. Da bleibt der Abstand stets gleich und jede Winkelberechnung wird überflüssig.

Die Abstandsveränderung ist nicht so schlimm. Wichtig ist, dass sich die Fotoeinstellung nicht verändert. Ich mache die Fotos ja von Hand mit dem gleichen Prinzip und des geht. Das Programm Agisoft liest die Metadaten des Fotos aus und kann das dann berücksichtigen. Zudem hat man bei dem Halbkreis auch eine Veränderung zum Objekt. Bei der Figur ist der Kopf von unten gesehen erst weit weg und dann von oben dicht dran.
Bei großen Objekten oder kleinem Kreis sind die Abweichungen noch größer.
Und wenn ich den Sanladerer drucken sehe, wird mir ganz schlecht. Zudem ist die X Box Kinect völlig ungeeignet für kleine Sachen

Um noch mal auf den "Fehler" mit dem Semikolon in der While Schleife zurück zu kommen. Lasse ich das Semikolon weg, bekomme ich eine Fehlermeldung. Also ist das Setzen des Semikolons nicht falsch?

Hallo,

schlag mal die while Funktion auf. Es gehört kein Semikolon dorthin. Da ich deine lcd lib nicht habe, lösche ich alles was lcd betrifft raus, entferne die falsche Klammer und das falsche Semikolon und es kompiliert fehlerfrei. Wennn das bei dir nicht fehlerfrei kompiliert, dann musst du demzufolge etwas anders machen. Ich hätte es letztens nicht geschrieben wenn es nicht fehlerfrei kompiliert hätte.
Die Frage wäre welche Fehlermeldung du bekommst. Sketch samt Fehlermeldung zeigen wäre jetzt gut. Dann können wir alle erneut drüberschauen.

Bei While (Bedingung)
{
}

ist es scheinbar egal.

Bei
Do
{
}
while(Bedingung);

geht es nicht ohne Semikolon.

Um noch mal auf die Start/Stop Taste zurück zu kommen.

if (digitalRead(Start) == LOW) //Unterprogramm Teller drehen
while (Start == LOW) // Doppeldruck unterdrücken
{
}

Dieses ist in der Fernmeldetechnik eine übliche 4Takt Schaltung. Das habe ich 1966 schon in der Lehre gelernt und mit Relais nachgebildet. War in jeder Telefonanlage zur Erdtastenfunktion eingebaut. Rückfragefunktion.
Ich werde aber noch das Entprellen in die Funktion einbauen.

fridi:
Um noch mal auf die Start/Stop Taste zurück zu kommen.

if (digitalRead(Start) == LOW) //Unterprogramm Teller drehen
while (Start == LOW) // Doppeldruck unterdrücken
{
}

Dieses ist in der Fernmeldetechnik eine übliche 4Takt Schaltung. Das habe ich 1966 schon in der Lehre gelernt und mit Relais nachgebildet. War in jeder Telefonanlage zur Erdtastenfunktion eingebaut. Rückfragefunktion.
Ich werde aber noch das Entprellen in die Funktion einbauen.

Du musst dann aber while (digitalRead(Start) == LOW) schreiben, da Start die Pinnummer ist, die nicht LOW wird. In so einem Fall kannst du einfach mit Delay(50) entprellen.

Deine obige Doppeldruckunterdrückung ist aber in vielen Fällen nicht geschickt, da sie blockierend ist. Während die Taste gedrückt ist, ist der Arduino blockiert und kann auf keine Sensoren reagieren oder ein Display aktualisieren.

Besser ist

Status=digitalRead(Start);
 if ((Status == LOW) && (oldStatus==High)) {reagiere auf Taste}
 oldStatus=Status;

Entprellen kann man hier auch mit einem kurzen Delay oder mit mills und einem Interval.

Hallo,

nochmal. Hier ist es nicht egal ob nach der Bedingung ein Semikolon steht oder nicht. Du merkst das nur im Moment nicht, weil dein Anweisungsblock leer ist.

while (Bedingung)
{
  ... mach was sinnvolles
}

do while ist eben nicht while, Semikolon muss hingeschrieben werden

do
{
  ... mach was sinnvolles
}
while(Bedingung);

Fernmeldetechnik kann man vielleicht schlecht bzw. nicht 1:1 mit µC Programmierung vergleichen. Auch die Leute die aus der SPS Ecke kommen müssen hier und da umdenken. Wenn der µC auf alle Abfragen usw. im Programm jederzeit reagieren soll, dann muss die loop ohne Blockierung permanent durchlaufen können. Das ist das A & O.

Danke für die Antworten. Jungs, ihr habt Recht. Ich werde die Vorschläge übernehmen und einarbeiten. Ich bin froh, dass ich hier etwas dazulernen kann. Dafür sind Profis Gold richtig.
Man muss sich ja wundern, was in so einem kleinen Prozessor alles drin steckt.

Hallo,

keine Sorge das wird schon. Gerade das hantieren mit millis geht irgendwann in Fleisch und Blut über. Bei millis muss man eigentlich nur an seine Armbanduhr denken, also was man mit der einen ständig laufenden Zeitanzeige alles machen kann.

Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung
http://forum.arduino.cc/index.php?topic=423688.0

Wenn du im Forum oder andere Foren mitliest, merkst du das jeder so seinen Fimmel hat. :slight_smile: Also jeder legt auf andere Dinge speziellen Wert. Man muss dann versuchen es zuverstehen und für sich sagen brauch ich das, gefällt mir das, übernehme ich das oder eben auch nicht.

Ja, das stimmt. Ich habe auch so meine Fimmel im Reprap Forum. Mich nervt es dort, dass die Leute nicht ansatzweise bereit sind, sich einzulesen oder etwas aus zu probieren. Da sollen es lieber die Anderen machen.
Ich habe vor 100 Jahren mit Klipper und Basic gearbeitet. Dann mit Access für Anwendungen bei der Bundeswehr. Dabei ist sogar mal ein Kochbuch heraus gekommen.
Das mit dem Arduino Programmieren macht mir mittlerweile richtig Spaß. Könnte neben dem Basteln, 3 D Drucken und 3D Scannen ein zusätzliches Hobby werden. Was erfinden und andere Wege beschreiten war schon immer mein Spaß. Das macht das Leben erst interessant und hält den Kopf fit.

fridi:
...Da sollen es lieber die Anderen machen.

Meine Rede, warum soll ich das Rad neu erfinden (Vorsicht Selbstironie)

https://www.glohbe.de/de/programmierung-arduino-camera-slider/

Keine Ahnung, ob der sich auch schon mit Winkeleinstellungen befasst, aber laufen tut´s schon.