[Gelöst]Timeout integrieren

Hallo,
ich habe für meine Katzen einen Futterautomat mit folgendem sketch:

//---------Sketch by Thomas Krichbaumer, 11.09.2019--------------------------

//ATTENTION: You have to add the HX711 library / L298N library first

//---------HX-711--------------------------
#include "HX711.h"
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;
HX711 scale;

//---------L298N--------------------
#include <L298N.h>
#define EN 9
#define IN1 8
#define IN2 7
L298N motor(EN, IN1, IN2);

void setup() {
  Serial.begin(9600);

//---------L298N--------------------
  motor.setSpeed(255);

//---------HX-711--------------------------
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.tare();
  }

void loop() {

    Serial.println(scale.read());
    long reading = scale.read();
    long maxfilllevel = 150000; // Max fillevel read from seriel monitor to adjust

    while (reading <= maxfilllevel){
      motor.forward(); //Change to "forward" if wrong motor direction
      delay(4000);
      motor.backward();  //Change to "backward" if wrong motor direction
      delay(500);
      reading = scale.read();
      Serial.println(scale.read());
      }
      motor.stop();
  delay(7200000); //Feeding interval to adjust in milliseconds

}

Das funktioniert soweit sehr gut. Problem ist nur, das der Motor nicht aufhört zu laufen, wenn das Futter alle ist und das Gewicht im Napf nicht erreicht wird.
Schön wäre, wenn der Motor nach 2 bis 3 Minuten von alleine abschaltet.
Kann mir vielleicht jemand zeigen wie der code dann aussehen müßte?
Gruß Holger

Schau Dir das Beispiel BlinkWithoutDelay in der IDE an und verstehe es. Dann kannst Du mit millis() Deine Zeitsteuerungen aufbauen.

Gruß Tommy

Moin,
davon abgesehen, das einige Variablen gerne auch const sein können, hat mich irritiert das wiedergeben via serial.print des Gewichtes, welches unterschiedlich zum verarbeiteten Wert sein kann.
Ok, das ist Feinarbeit…

The-Holgi:
ich habe für meine Katzen einen Futterautomat mit folgendem sketch:

    Serial.println(scale.read());

long reading = scale.read();

while (reading <= maxfilllevel){
[…]
     reading = scale.read();
     Serial.println(scale.read());




Schön wäre, wenn der Motor nach 2 bis 3 Minuten von alleine abschaltet.
Kann mir vielleicht jemand zeigen wie der code dann aussehen müßte?

Ungetestet und wirklich nur unter der Prämisse, das die delay() tatsächlich so bleiben, kann man folgendes versuchen:

// Forumsketch mit Bauchschmerzen - Basis: https://forum.arduino.cc/index.php?topic=708125.msg4758357#msg4758357
// ungetestet

//---------Sketch by Thomas Krichbaumer, 11.09.2019--------------------------

//ATTENTION: You have to add the HX711 library / L298N library first

//---------HX-711--------------------------
#include "HX711.h"
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;
HX711 scale;

//---------L298N--------------------
#include <L298N.h>
#define EN 9
#define IN1 8
#define IN2 7
L298N motor (EN, IN1, IN2);

const unsigned long maxfilllevel = 150000;
const unsigned long maxmotortime = 300000; // Hier einstellen, wie lange der Antrieb läuft

void setup()
{
  Serial.begin (9600);
  //---------L298N--------------------
  motor.setSpeed (255);
  //---------HX-711--------------------------
  scale.begin (LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.tare();
}

void loop()
{
  long reading = scale.read();
  Serial.println (reading);
  unsigned long motortime = millis();
  while ((reading <= maxfilllevel) && millis() - motortime < maxmotortime))
  {
    motor.forward(); //Change to "forward" if wrong motor direction
    delay (4000);
    motor.backward();  //Change to "backward" if wrong motor direction
    delay (500);
    reading = scale.read();
    Serial.println (reading);
  }
  motor.stop();
  delay (7200000); //Feeding interval to adjust in milliseconds
}

Der Motor läuft dann wieder an, wenn delay(7200000) abgelaufen ist. - kommt kein Futter nach ist nach maxmotortime Schluss und der Zyklus beginnt mit delay(7200000) von vorn.

Nicht schön, aber ggfls. ein Ansatz.

(deleted)

Besten Dank, werde ich beides testen, wobei mir beim sketch von Peter nicht ganz klar ist wie lange der
Motor noch „nach läuft“ wenn kein Futter mehr vorhanden ist bzw wenn sich das Gewicht nicht mehr ändert.
Gruß Holger

(deleted)

So, habe beide sketche mal getestet.
@Peter hier schaltet der Motor beierreichen des eingestellten gewichtes nicht mehr ab.
@my_xy_projekt im code ist ein Fehler:

expected primary-expression before ')' token

inder Zeile

while ((reading <= maxfilllevel) && millis() - motortime < maxmotortime))

(deleted)

Hallo, Danke für die Hilfe.
So funktioniert es zwar, aber der Motor läuft weiter auch wenn das eingestellte Gewicht erreicht ist.

(deleted)

Hallo Peter, hier der komplette sketch:

// Forumsketch mit Bauchschmerzen - Basis: https://forum.arduino.cc/index.php?topic=708125.msg4758357#msg4758357
// ungetestet

//---------Sketch by Thomas Krichbaumer, 11.09.2019--------------------------

//ATTENTION: You have to add the HX711 library / L298N library first

//---------HX-711--------------------------
#include "HX711.h"
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;
HX711 scale;

//---------L298N--------------------
#include <L298N.h>
#define EN 9
#define IN1 8
#define IN2 7
L298N motor (EN, IN1, IN2);

const unsigned long maxfilllevel = 150000;
const unsigned long maxmotortime = 300000; // Hier einstellen, wie lange der Antrieb läuft
long readingOld=0;

void setup()
{
  Serial.begin (9600);
  //---------L298N--------------------
  motor.setSpeed (255);
  //---------HX-711--------------------------
  scale.begin (LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.tare();
}

void loop()
{
  long reading = scale.read();
  Serial.println (reading);
  unsigned long motortime = millis();
  while ((reading <= maxfilllevel) && not (reading == readingOld)) // ist das Geamtgewicht errreicht oder keine Änderung = Abbruch   // && millis() - motortime < maxmotortime))
  {
    motor.forward(); //Change to "forward" if wrong motor direction
    delay (4000);
    motor.backward();  //Change to "backward" if wrong motor direction
    delay (500);
    readingOld=reading;   // Gewicht merken
    reading = scale.read();
    Serial.println (reading);
   
  }
  delay (2*60*1000);
  motor.stop();
  delay (7200000); //Feeding interval to adjust in milliseconds
}

Gruß Holger

(deleted)

Hm,
jetzt läuft die Schnecke bzw der Motor rückwärts wenn das Gewicht erreicht wird.

The-Holgi:
@my_xy_projekt im code ist ein Fehler:

expected primary-expression before ')' token

inder Zeile

while ((reading <= maxfilllevel) && millis() - motortime < maxmotortime))

Nach maxmotortime sind zwei schliessende Klammern, von denen eine zuviel ist.

Das passiert mir immer mal wieder, wenn keine Entwicklungsumgebung vorhanden ist und nur in einem rudimentären Editor was versucht wird. Spätestens nach dem zweiten Versuchsballon gehts dann schief.
Ich bitte um Nachsicht, habe das aber auch in den ersten Codezeilen angekündigt…
:wink:

Bitte nochmal testen.

Hallo,
so funktioniert es jetzt ohne Probleme.
Besten Dank dafür, da freuen sich die Katzen.
Hier der Link zum Automaten, vielleicht möchte ihn ja jemand "nachbauen".

Gruß Holger

The-Holgi:
so funktioniert es jetzt ohne Probleme.

vielleicht möchte ihn ja jemand "nachbauen".

Gehe mal ins erste Post von Dir und schreib ein "gelöst" ins Subject.
Und wenn Du den noch ergänzt um "Futterautomat" findet man das evtl. auch noch zu späterer Zeit....