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 - 2 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Code funktioniert nicht - Motor startet nicht, trotz das die Bedingungen erfüllt sind
28.01.2014, 01:30
Beitrag #1
Code funktioniert nicht - Motor startet nicht, trotz das die Bedingungen erfüllt sind
Hallo liebes Forum,

ich bin neu hier und habe gleich einen nichtfunktionierenden Sketch im Gepäck.
Wer kann mir sagen ob mein Ansatz richtig ist, bzw. warum der Motor bei case0 nicht startet obwohl beide Bedingungen (gesehen auf dem Serial Monitor) erfüllt waren...

Danke im Voraus

hier der CODE
------------------------------------------------------------
#include <AFMotor.h>
AF_DCMotor motor(3);

#define Morgens_auf 0
#define Oben_halt 1
#define Abends_zu 2
#define Unten_halt 3

int sensorWert = 0;
int tasterOben = 2;
int tasterUnten = 6;
int tasterStatusOben;
int tasterStatusUnten;


void setup(){

sensorWert = analogRead(A0);
Serial.begin(9600);
pinMode (2,INPUT);
pinMode (6,INPUT);
motor.setSpeed(200);

}

void loop() {

Serial.println(sensorWert);
delay (1000);
Serial.println(tasterStatusUnten);
delay (1000);
Serial.println(tasterStatusOben);
delay (1000);
tasterStatusOben = digitalRead(2);
tasterStatusUnten = digitalRead(6);


int range = (Morgens_auf, Oben_halt, Abends_zu, Unten_halt);


switch (range) {
case 0:
if (sensorWert >> 700 && tasterStatusUnten == HIGH)
motor.run(FORWARD);
break;
case 1:
if (tasterStatusOben == HIGH)
motor.run(RELEASE);
break;
case 2:
if (sensorWert << 400 && tasterStatusOben == HIGH)
motor.run(BACKWARD);
break;
case 3:
if (tasterStatusUnten == HIGH)
motor.run(RELEASE);
break;

delay(0);
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2014, 07:27
Beitrag #2
RE...
Hey,

du solltest beim Codeposten unbedingt die Codefunktion nutzen (das # Symbol).

Dein Code ist auch nicht sehr leserlich. Wenn du deinen TasterOben auf Pin 2 legst, solltest du auch beim I/O-Deklarieren den Namen, und nicht die Zahl verwenden. Aber das nur am Rande Wink

Code:
int range = (Morgens_auf, Oben_halt, Abends_zu, Unten_halt);

Was genau machst du in dieser Zeile?

MfG demo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2014, 07:57
Beitrag #3
RE: Code funktioniert nicht
Guten Morgen,

danke für deine Antwort und den Hinweis demokrit.

Ich sollte vielleicht mal erklären was ich eigentlich vor habe.

Es soll ein Stallschieber Dämmerungsabhängig (Tag, Nacht) soll geöffnet werden, die Abschaltung mittels Endschalter oben bzw. unten erfolgen.

So ergeben sich aus meiner Sicht folgende Zustände:

1. Morgens_auf: (Lichtsensor erkennt es wird hell, Taster unten erkennt das Klappe zu) infolgedessen soll der Motor so lange fahren
2. Oben-halt: bis Taster oben meldet (angekommen, Motor kannst stoppen)
3. Abends_zu: (Lichtsensor erkennt es wird dunkel, Taster oben erkennt das Klappe auf) infolgedessen soll der Motor so lange fahren
4. Unten_halt: bis Taster unten meldet (angekommen, Motor kannst stoppen)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2014, 09:18 (Dieser Beitrag wurde zuletzt bearbeitet: 29.01.2014 09:28 von demokrit.)
Beitrag #4
RE: Code funktioniert nicht ...
Ok, dein Vorhaben klingt für mich soweit schlüssig. Variablennamen sind ja Geschmackssache Wink

Trotzdem verstehe ich die von mir zitierte Zeile nicht ganz...

Was mir noch auffällt. Du liest den analogen Eingang in der setup() ein. Diese wird nur beim Start ein einziges Mal ausgeführt. Ich gehe davon aus, das an dem Eingang dein Dämmerungsschalter hängt. Eine Wertänderung würde also unbemerkt bleiben.

Ich würde es so versuchen:
- defines
- Variablen deklarieren
- setup(), hier nur I/O festlegen und serielle Kommunikation herstellen (zu Testzwecken)
- Loop(): Sensor auslesen und den 10bit-Wert (0...1023) in einer if-Bedingung auswerten. Also wenn Endlage zu, dann Motor bis Endlage auf erreicht. Das ganze dann in einer if-else mit den Dunkel-Dämmerwerten und Tür schließen machen.

MfG demo

EDIT: Hier mal ein Snippet als Pseudocode (nicht geprüft)
Code:
if(deammerwert_hell && endlage_zu)  // wenn Dämmerungsschalter Grenzwert für hell liefert
{
  while(!endlage_auf) // Tür öffnen, bis Endlage erreich
  {
    motor_auf;
  }
}
else if(deammerwert_dunkel && endlage_auf) // wenn Dämmerungsschalter Grenzwert für dunkel liefert
{
  while(!endlage_zu)   // Tür schließen, bis Endlage erreich
  {
    motor_zu;
  }
} else {
  for(int i = 0; i < 30; i++)  // Lange warten (z.B ca. 30*9,999sek = 5min)
  {
    delay(9999)
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2014, 09:51
Beitrag #5
RE: Code funktioniert nicht
werde mich heute abend mal mit dem von dir vorgeschlagenen CODE beschäftigen...
...

#int range = (Morgens_auf, Oben_halt, Abends_zu, Unten_halt);

bei dieser Zeile fehlt das "map" nach dem = ; wollte den befehl "switch, case" verwenden...in meinem fall ist die Codezeile falsch, da "map" ja min,max, und noch irgendwas braucht.

Im wesentlichen wollte ich die 4 Zustände definieren, und als "case" abfragen lassen...bin da aber nicht durchgestiegen.

VG
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.02.2014, 10:56 (Dieser Beitrag wurde zuletzt bearbeitet: 03.02.2014 10:57 von Daniel Zorn.)
Beitrag #6
RE: Code funktioniert nicht
Hallo demokrit, und alle anderen

habe mal versucht deinen Vorschlag in einen Sketch zu bringen...aber nur im Word geschrieben und noch nicht getestet...vielleicht kannst du/ihr was dazu sagen ob er funktionieren könnte.

@demokrit: erkläre mir bitte mal die funtion der letzten "else" mit den 5 minuten.
Bedeutet das, das 5min. gewartet wird und dann die schleife erneut geprüft wird...?

Danke

Code:
#define hell 700
#define dunkel 300
Int Sensor = A0;
Int Zustand = hell │ dunkel;
Int Endlage_oben = 7;
Int Endlage_unten = 8;
Int Motor_vor = 3;
Int Motor_zurück =4;

Setup()
{
Begin.serial (9600)
pinMode(Endlage_oben, INPUT)
pinMode(Endlage_unten, INPUT)
pinMode(Motor_vor, OUTPUT)
pinMode(Motor_zurück, OUTPUT)


}
Loop()
{
Zustand = analogRead(Sensor);
digitalRead(Endlage_oben);
digitalRead(Endlage_unten);
{
If(hell && Endlage_unten == HIGH)
{
While(!Endlage_oben == LOW)
{
digitalWrite(Motor_vor);
}
}
else if(dunkel && Endlage_unten == LOW)
{
While(!Endlage_oben == HIGH)
{
digitalWrite(Motor_zurück);
}
}
Else for(int i = 0; i < 30; i++)  // Lange warten (z.B ca. 30*9,999sek = 5min)
}
{
delay(9999)
{
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.02.2014, 22:02
Beitrag #7
RE: Code funktioniert nicht - Motor start...
Oh oh, dein Code sieht gar nicht gut aus Big Grin

Hau den mal in den Editor und compiliere...

Da gehts schon in der 4. Zeile los. "|" ist ein Vergleichsoperator. Du kannst keine Variable damit nicht deklarieren

Ein Funktionsbauch beginnt immer mit "{" und endet mit "}". in deiner loop() fängst du VOR deiner ersten if-Abfrage mit "{" an. Das geht so nicht.

Variablennamen wie "Motor_zurück" sind auch nicht zulässig (Umlaute).

Die letzt fro-Schleife läuft so auch nicht (gleicher "{}"-Fehler).

Meine for-Schleife macht folgendes:

Code:
for(int i = 0; i < 30; i++)  // Lange warten (z.B ca. 30*9,999sek = 5min)
  {
    delay(9999)
  }

das delay(9999) sind 9999ms, also ca. 10s. Die schleife wird einfach 30 Mal durchlaufen.

10s * 30 = 300s = 5min Wink

MfG demo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.02.2014, 22:30
Beitrag #8
RE: Code funktioniert nicht
...überarbeiteter Code...und nichts passiert...bin ja auch noch am Arduino lernen...

Code:
#define hell 700
#define dunkel 300
int Sensor = A0;
int Zustand = 0;
int Endlage_oben = 7;
int Endlage_unten = 8;
int Motor_vor = 3;
int Motor_back = 4;

void setup()
{
    Serial.begin(9600);
      pinMode(Endlage_oben, INPUT);
      pinMode(Endlage_unten, INPUT);
      pinMode(Motor_vor, OUTPUT);
      pinMode(Motor_back, OUTPUT);
}

void loop()
{
Zustand = analogRead(Sensor);
    digitalRead(Endlage_oben);
    digitalRead(Endlage_unten);
    
    Serial.println(Zustand);                            

  if(Zustand >> hell && Endlage_unten == HIGH)
  {
    while(!Endlage_oben == LOW)
    {
      digitalWrite(Motor_vor, HIGH);
    }
  }
       else
      {
       if(Zustand << dunkel && Endlage_unten == LOW)
      {
        while(!Endlage_oben == HIGH)
         {
           digitalWrite(Motor_back, HIGH);
         }
           }
            else
           {
            for(int i = 0; i < 30; i++)
           {
            delay(1000);
           }  
      }
    }
   }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino lässt sich nicht installieren bergfrei 4 137 20.11.2016 18:34
Letzter Beitrag: bergfrei
  Arduino Mega 2560 läuft nicht Wolfgang50 6 174 13.11.2016 10:50
Letzter Beitrag: Wolfgang50
  Ardublock übertragt nicht an IDE oder UNO R3 tobi83 5 328 16.10.2016 14:07
Letzter Beitrag: Pit
  Einfacher Tacho für niedrige Geschwindigkeiten – Code optimieren Bastelo 2 259 12.10.2016 20:31
Letzter Beitrag: Bastelo
  Code mit Verifikation über Keypad & LCD machnetz 5 215 10.10.2016 15:01
Letzter Beitrag: torsten_156
  Upload funktioniert nicht Levi 5 237 22.09.2016 20:19
Letzter Beitrag: hotsystems
  ESP8266 tuts nicht sowerum 7 387 19.09.2016 21:01
Letzter Beitrag: sowerum
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 222 16.09.2016 20:36
Letzter Beitrag: Datatom
  SD Karte wird nicht erkannt... Maxi290997 2 202 16.08.2016 14:36
Letzter Beitrag: Maxi290997
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 965 07.08.2016 11:40
Letzter Beitrag: Maxi290997

Gehe zu:


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