Zeitzähler bei Überschreitung von Sensorwert (Verzögerte Reaktion)

An dieser Stelle erst einmal ein freundliches “Hallo Welt”,

ich bin neu im Forum und beschäftige mich seit ca. einem halben Jahr mit Arduinos, um neben dem Maschinenbaustudium etwas programmieren zu lernen. Grundkenntnisse in E-Technik sind vorhanden, im Programmieren eher blutiger Anfänger.

Zum Problem: Ich möchte grundsätzlich, dass ein Unterschreiten eines Sensorwertes eine Reaktion hervorruft, allerdings nur dann, wenn der Wert für eine gewisse Zeitspanne, unterschritten bleibt. Mein Code dazu funktioniert leider nicht.

Zur Umgebung: Es sind in meinem Code sogar zwei Sensorwerte, da es sich um den Spannungsabfall über die beiden Antriebsmotoren eines Roboters handelt. Zusätzlich wird ausgeschlossen, dass die Motoren abgeschaltet sind, dann wäre der Spannungsabfall logischerweise ja null.
Ich nenne diese Sensorwerte verwirrenderweise “Motorwiderstand”, die Werte sinken allerdings, wenn die Räder blockiert werden, also bei hohem mechanischem Widerstand an den Rädern.

Ich poste erstmal nur den entsprechenden Teil des Codes. Habe schon viel Troubleshooting betrieben und kann euch versichern, dass der restliche Code funktioniert und die Sensorwerte tatsächlich reproduzierbar erreicht werden können (habe den Plotter nebenher laufen lassen). Ihr werdet anhand des Codes sicher verstehen worauf ich hinaus will, falls meine Erklärung nicht zu Klarheit geführt hat.

if((motorwiderstand_r < 1300 || motorwiderstand_l < 1300) 
   & Motor_r != 0 & Motor_l != 0 &  millis > t1 + 1000){
  t1 = millis;
}

if(motorwiderstand_r > 1500 || motorwiderstand_l > 1500){
  t1 = t1 + 1000;
}

if(millis > (t1 + 500) & millis < (t1 + 1000)){
  Motor_r = 0; 
  Motor_l = 0;
  Hindernis = true;
}

Es ist natürlich auch willkommen, wenn mir jemand einen funktionierenden Code als Gegenvorschlag schreibt, aber vor allem geht es mir darum zu verstehen, wo mein Denkfehler liegt, sodass die grundsätzliche Funktionalität (siehe oben fett gedruckt) nicht erreicht wird.

Vielen Dank schonmal!
VG, Max

Habe schon viel Troubleshooting betrieben

Dann zeig doch einfach deinen Minimalen Testsketch, der dein Problem zeigt und sonst nichts, aber komplett. Und beschreibe möglichst genau was und wie anders läuft als du dir wünscht.


millis > t1 + 1000){
t1 = millis;

Meinst du evtl. den Funktionsaufruf millis () ?

Ich habe das Problem eben selbst gefunden: Wie michael_x auch aufgefallen ist, habe ich bei der Funktion "millis ()" schlicht die Klammern vergessen. Die IDE hat das Ding farblich als Funktion markiert und beim Kompilieren nicht gemeckert, daher ist mir das durch die Lappen gegangen.

Edit: Jetzt funktioniert es prinzipiell. Wenn jemand einen Code parat hat, mit dem die Aufgabe auch/besser gelöst wird wär ich gespannt.

Dann zeig doch einfach deinen Minimalen Testsketch, der dein Problem zeigt und sonst nichts, aber komplett. Und beschreibe möglichst genau was und wie anders läuft als du dir wünscht.

Ist gemerkt für nächstes Mal!

Mahimus:
und beim Kompilieren nicht gemeckert, daher ist mir das durch die Lappen gegangen.

Funktionsnamen sind Adressen. Deshalb kannst du eine Zuweisung auf einen Integer machen. Eine Warnung kommt da aber:

warning: invalid conversion from 'long unsigned int (*)()' to 'long unsigned int'

Also Warnungen aktivieren!