INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
[Dringend] Schulprojekt
15.12.2015, 22:07 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2015 22:45 von SSergejS.)
Beitrag #1
[Dringend] Schulprojekt
Hallo liebe Community,

wir müssen morgen eine Kettenreaktion mit min. 1 Aktor und 1 Sensor abgeben (Schulprojekt)

Dafür habe ich ein Programm geschrieben, das einen Schrittmotor dreht und eines, das Das Angehen einer LED erkennen soll. So. Nun soll das Programm mit dem Motor starten, sobald die LED angeht. Aber wie kann ich die Programme "ineinander" schreiben?
Einzeln habe ich sie schon geschrieben und alles funktioniert.
Wäre für alles dankbar!

Hier noch die Programme:


Schrittmotor:

Code:
#define PAUSE 30     //Pausenwert.Je geringer, desto schneller
#define POWEROFF 4   //Indexwert für Power-Off
byte stepperPins[] = {2,3,4,5};  // Stepper-Pins
byte stepValues[5][4] = {{HIGH, LOW, HIGH, LOW},  //Step 0
                          {LOW, HIGH, HIGH, LOW},  //Step 1
                          {LOW, HIGH, LOW, HIGH},  //Step 2
                          {HIGH, LOW, LOW, HIGH},  //Step 3
                          {LOW, LOW, LOW, LOW}};   //Power-Off
                          


void setup() {

  for(int i = 0; i < 4; i++)
    pinMode(stepperPins[i], OUTPUT);
  moveStepper(9000);                   //Stepper ansteuern
  }  
  
  void callStepper(int stepNumber)    {
           for(int i = 0; i < 4; i++){
               digitalWrite(stepperPins[i], stepValues[stepNumber][i]);
           }
     }
void loop() { /* leer*/}

    
void moveStepper(int steps){
    int stepNumber = 0;                    //Stepnummer deklarieren
    int moveDirection = (steps > 0)?1:-1; //Richtung festlegen
    steps = abs(steps);                   //Positive Step-Anzahl
    //Solange ausführen, wie Reststeps übrig sind.
    while(steps > 0)  {
        if(moveDirection == 1)  {
            stepNumber++;            //Stepnummer hochzählen(rechtsdrehen)
            if(stepNumber == 4)      //Falls Maximalwert => Zurücksetzen
               stepNumber = 0;
            } else  {
              if(stepNumber == 0)     //Falls Minimalwert => Hochsetzen
              stepNumber = 4;
            stepNumber--;              //Stepnummer runterzählen (Linksdrehen)
           }
           callStepper(stepNumber % 4);   //Stepper ansteuern
           steps--;                       //Reststepps neu berechnen
           delay(PAUSE);                  //Pause einlegen
         } //End while
         callStepper(POWEROFF);          //Stepper ansteuern - Power Off
       }

[/code]
Code:
/* Auslesen eines LDR
*/
int analogPin = 0;     //Sensoreingang
int analogWert = 0;  //Wert des LDR


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

void loop ()
{
    analogWert = analogRead(analogPin);
  
     if (analogWert > 500) {}
     Serial.println(analogWert);
     delay(100);
     }


Nun meine Idee zum ineinandergekoppelten Programm:


Code:
#define PAUSE 30     //Pausenwert.Je geringer, desto schneller
#define POWEROFF 4   //Indexwert für Power-Off
byte stepperPins[] = {2,3,4,5};  // Stepper-Pins
byte stepValues[5][4] = {{HIGH, LOW, HIGH, LOW},  //Step 0
                          {LOW, HIGH, HIGH, LOW},  //Step 1
                          {LOW, HIGH, LOW, HIGH},  //Step 2
                          {HIGH, LOW, LOW, HIGH},  //Step 3
                          {LOW, LOW, LOW, LOW}};   //Power-Off
                          
int analogPin = 0;  //Sensoreingang[LDR]
int analogWert = 0; //Wert des LDR [LDR]

void setup() {
  Serial.begin(9600);
  for(int i = 0; i < 4; i++)
    pinMode(stepperPins[i], OUTPUT);
  moveStepper(9000);                   //Stepper ansteuern
  }  
  
  void callStepper(int stepNumber)    {
           for(int i = 0; i < 4; i++){
               digitalWrite(stepperPins[i], stepValues[stepNumber][i]);
           }
     }
void loop() { /* leer*/
analogWert = analogRead(analogPin);
Serial.println(analogWert);
     delay(100);
     }


void loop2()  
{
     if (analogWert > 700)  {



void moveStepper(int steps){
    int stepNumber = 0;                    //Stepnummer deklarieren
    int moveDirection = (steps > 0)?1:-1; //Richtung festlegen
    steps = abs(steps);                   //Positive Step-Anzahl
    //Solange ausführen, wie Reststeps übrig sind.
    while(steps > 0)  {
        if(moveDirection == 1)  {
            stepNumber++;            //Stepnummer hochzählen(rechtsdrehen)
            if(stepNumber == 4)      //Falls Maximalwert => Zurücksetzen
               stepNumber = 0;
            } else  {
              if(stepNumber == 0)     //Falls Minimalwert => Hochsetzen
              stepNumber = 4;
            stepNumber--;              //Stepnummer runterzählen (Linksdrehen)
           }
           callStepper(stepNumber % 4);   //Stepper ansteuern
           steps--;                       //Reststepps neu berechnen
           delay(PAUSE);                  //Pause einlegen
         } //End while
         callStepper(POWEROFF);          //Stepper ansteuern - Power Off
       }
      
    }


Alles schön und gut aber es kommt folgender Fehler :


Code:
sketch_nov30a.ino: In function 'void loop2()':
sketch_nov30a.ino:38:28: error: a function-definition is not allowed here before '{' token
sketch_nov30a.ino:60:5: error: expected '}' at end of input
sketch_nov30a.ino:60:5: error: expected '}' at end of input
Fehler beim Kompilieren.[/quote]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2015, 22:29
Beitrag #2
RE: [Dringend] Schulprojekt
Dann fängst du ja zeitig an. Wink

Wenn du mit dem Arduino umgehst, solltest du wissen, das es nur eine Loop gibt.

Du musst die beiden so zusammensetzen, das die zweite Loop (Stepper) eine Funktion wird und von einer Abfrage in der ersten Loop (Led) ob diese leuchtet, abhängig ist und danach aufgerufen wird.

Leider ist dein Sketch sehr unübersichtlich und nicht mal eben zu lesen.
Du musst diesen in formatiert Code-Tags hier reinsetzen. Dann ist er lesbarer.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2015, 22:33 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2015 22:37 von SSergejS.)
Beitrag #3
RE: [Dringend] Schulprojekt
Ok. Danke für die Antwort, mache ich gerne. Wo finde ich den Code-Tag?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2015, 22:40
Beitrag #4
RE: [Dringend] Schulprojekt
Du musst deinen ersten Post im Editor bearbeiten und die Schaltfläche # verwenden.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2015, 22:46
Beitrag #5
RE: [Dringend] Schulprojekt
So, habe meinen Post aktualisiert. Und wie könnte ich die 2. Schleife in eine Funktion anhängig von der 1. Schleife machen?

P.S. Die Programme sind schon seit Tagen geschrieben, jedoch kamen wir heute auf die Idee, die Programme zu "vernetzen" Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2015, 22:49
Beitrag #6
RE: [Dringend] Schulprojekt
Na das sieht doch schon besser aus, ich werds gleich mal prüfen.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2015, 22:52
Beitrag #7
RE: [Dringend] Schulprojekt
Alles klar!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2015, 23:03
Beitrag #8
RE: [Dringend] Schulprojekt
das sollte so funktionieren.

Code:
void loop() {
  analogWert = analogRead(analogPin);
  Serial.println(analogWert);
  delay(100);

  if (analogWert > 700)  {
    moveStepper(9000);
  }
}

void moveStepper(int steps) {
  int stepNumber = 0;                    //Stepnummer deklarieren
  int moveDirection = (steps > 0) ? 1 : -1; //Richtung festlegen
  steps = abs(steps);                   //Positive Step-Anzahl
  //Solange ausführen, wie Reststeps übrig sind.
  while (steps > 0)  {
    if (moveDirection == 1)  {
      stepNumber++;            //Stepnummer hochzählen(rechtsdrehen)
      if (stepNumber == 4)     //Falls Maximalwert => Zurücksetzen
        stepNumber = 0;
    } else  {
      if (stepNumber == 0)    //Falls Minimalwert => Hochsetzen
        stepNumber = 4;
      stepNumber--;              //Stepnummer runterzählen (Linksdrehen)
    }
    callStepper(stepNumber % 4);   //Stepper ansteuern
    steps--;                       //Reststepps neu berechnen
    delay(PAUSE);                  //Pause einlegen
  } //End while
  callStepper(POWEROFF);          //Stepper ansteuern - Power Off
}

Es ist nur diel Loop.
Da ich bisher noch nichts mit Steppern zu tun hatte, kann ich nicht sagen ob das auch mit dem Stepper läuft.

Aber die Loop sollte so richtig sein.
Wird aber fehlerfrei kompiliert.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste