Fischfutterautomat

Hallo!

Ich habe ein Problem, vermutlich weil meine Programmierkenntnisse nicht sonderlich gut sind.

Über einen kleinen Schrittmotor 28BYJ-48 mit ULN2003 wird eine kleine Schnecke angetrieben die Fischfutter fördert. Die Mechanik samt Motor funktioniert soweit nur das Programm nicht.

Über ein Poti soll die Futtermenge eingestellt werden, also die Zeit/Anzahl der Umdrehungen des Motors.
Ist dieser Wert erreicht soll das Programm enden.

Aber irgendwie zählt er das i immer über den Wert des Poti hinaus und fängt von vorne an => der Motor dreht sich dauerhaft.

Es würde reichen, wenn er in ein ewiges Delay geht wenn der Wert erreicht ist, da der Arduino morgens zusammen mit dem Licht eingeschaltet wird und abends ausgeschaltet wird.Also Füttern und dann delay(15Stunden)

Vielleicht kann mir jemand helfen.

/*
 Fischfutterautomat
*/

const int motorPin1 = 8;  // Blue   - In 1
const int motorPin2 = 9;  // Pink   - In 2
const int motorPin3 = 10; // Yellow - In 3
const int motorPin4 = 11; // Orange - In 4
                         // Red    - pin 5 (VCC)
unsigned int motorSpeed =  1000;    

unsigned int sensorValue ;                         
                         

void setup() {
 Serial.begin(9600);
 
 pinMode(motorPin1, OUTPUT);
 pinMode(motorPin2, OUTPUT);
 pinMode(motorPin3, OUTPUT);
 pinMode(motorPin4, OUTPUT);
 
 
 sensorValue = analogRead(A0);
 Serial.println(sensorValue);
 delay(1000);       
 
}

void loop() {
 
 for (int i=0; i<sensorValue; i++){
   
 // 1
 digitalWrite(motorPin4, HIGH);
 digitalWrite(motorPin3, LOW);
 digitalWrite(motorPin2, LOW);
 digitalWrite(motorPin1, LOW);
 delayMicroseconds(motorSpeed);

 // 2
 digitalWrite(motorPin4, HIGH);
 digitalWrite(motorPin3, HIGH);
 digitalWrite(motorPin2, LOW);
 digitalWrite(motorPin1, LOW);
 delayMicroseconds(motorSpeed);

 // 3
 digitalWrite(motorPin4, LOW);
 digitalWrite(motorPin3, HIGH);
 digitalWrite(motorPin2, LOW);
 digitalWrite(motorPin1, LOW);
 delayMicroseconds(motorSpeed);

 // 4
 digitalWrite(motorPin4, LOW);
 digitalWrite(motorPin3, HIGH);
 digitalWrite(motorPin2, HIGH);
 digitalWrite(motorPin1, LOW);
 delayMicroseconds(motorSpeed);

 // 5
 digitalWrite(motorPin4, LOW);
 digitalWrite(motorPin3, LOW);
 digitalWrite(motorPin2, HIGH);
 digitalWrite(motorPin1, LOW);
 delayMicroseconds(motorSpeed);

 // 6
 digitalWrite(motorPin4, LOW);
 digitalWrite(motorPin3, LOW);
 digitalWrite(motorPin2, HIGH);
 digitalWrite(motorPin1, HIGH);
 delayMicroseconds(motorSpeed);

 // 7
 digitalWrite(motorPin4, LOW);
 digitalWrite(motorPin3, LOW);
 digitalWrite(motorPin2, LOW);
 digitalWrite(motorPin1, HIGH);
 delayMicroseconds(motorSpeed);

 // 8
 digitalWrite(motorPin4, HIGH);
 digitalWrite(motorPin3, LOW);
 digitalWrite(motorPin2, LOW);
 digitalWrite(motorPin1, HIGH);
 delayMicroseconds(motorSpeed);
 
 Serial.println(i);
 delay(10);
 
 if (i = sensorValue)
{
Serial.println("Futtermenge erreicht");
delay(1000); //Ausschalten
}


}

  }
if (i = sensorValue)

= ist eine Zuweisung. == ist ein Vergleich

Wenn du denn Arduino komplett anhalten willst kannst du eine Endlos-Schleife machen. while(1) oder while(true)

versuch es mal so

//*
  Fischfutterautomat
 */

const int motorPin1 = 8;  // Blue   - In 1
const int motorPin2 = 9;  // Pink   - In 2
const int motorPin3 = 10; // Yellow - In 3
const int motorPin4 = 11; // Orange - In 4
                          // Red    - pin 5 (VCC)
unsigned int motorSpeed =  1000;    
bool state;
unsigned int sensorValue ;  



                          
                          

void setup() {
  Serial.begin(9600);
  
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  
  
  sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(1000);       
  
}

void loop() {
  if (!state)
  {
  for (int i=0; i<sensorValue; i++){
    
  // 1
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

  // 2
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

  // 3
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

  // 4
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

  // 5
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

  // 6
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);

  // 7
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);

  // 8
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);
  
  Serial.println(i);
  delay(10);
  
  if (i == sensorValue)
{
 Serial.println("Futtermenge erreicht");
 delay(1000); //Ausschalten
 state=1;
}

  }
}

   }

kennst Du das?

Für den Schrittmotor kannst Du die Stepper.h Bibliothek der Arduino-IDE verwenden
Stepper - Arduino Reference und
Stepper - Arduino Reference

Grüße Uwe

Und hier gibt es einen Beispielsketch dazu.

Muno:
if (i = sensorValue)

Diesen Fehler habe ich mindestens ein paar Dutzend mal gemacht. Und das ist immer noch einer meiner häufigsten Fehler.

'=' ist eine Zuweisung [a=10]
'==' ist ein Vergleich [if(a==10)...]

Gruß

Gregor

ardubu:
versuch es mal so

//*

Fischfutterautomat
*/

const int motorPin1 = 8;  // Blue  - In 1
const int motorPin2 = 9;  // Pink  - In 2
const int motorPin3 = 10; // Yellow - In 3
const int motorPin4 = 11; // Orange - In 4
                          // Red    - pin 5 (VCC)
unsigned int motorSpeed =  1000;   
bool state;
unsigned int sensorValue ;

void setup() {
  Serial.begin(9600);
 
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
 
 
  sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(1000);     
 
}

void loop() {
  if (!state)
  {
  for (int i=0; i<sensorValue; i++){
   
  // 1
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

// 2
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

// 3
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

// 4
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

// 5
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

// 6
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);

// 7
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);

// 8
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);
 
  Serial.println(i);
  delay(10);
 
  if (i == sensorValue)
{
Serial.println("Futtermenge erreicht");
delay(1000); //Ausschalten
state=1;
}

}
}

}

Erstmal vielen Dank für die Hilfe! Mit dem Code läuft es leider genauso wie bisher, er zählt bis zum Wert hoch und fängt dann von vorne an.

Mach statt dem delay(1000) am Schluss ein while(1)

for (int i=0; i<sensorValue; i++){

if (i == sensorValue)

Das steht im Widerspruch, ist aber auch nicht nötig, da am Ende der for-Schleife eh Schluß sein soll:

...
      // 8
      digitalWrite(motorPin4, HIGH);
      digitalWrite(motorPin3, LOW);
      digitalWrite(motorPin2, LOW);
      digitalWrite(motorPin1, HIGH);
      delayMicroseconds(motorSpeed);
      Serial.println(i);
    }
    Serial.println("Futtermenge erreicht");
    state = true;
  }
}

Probiere mal, ob das in Deine Richtung geht.