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:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Problem einen code zu schreiben der das macht was ich möchte....
22.10.2015, 18:02
Beitrag #1
Problem einen code zu schreiben der das macht was ich möchte....
Guten Abend zusammen
Ich bin neu in dem Busines und versuche mich an einer Programmierung für eine Katzentüre.

Ziel Wäre es, dass das Tor hochfährt wenn die Katze in die Lichtschranke kommt (diese so lange oben bleibt wie sie in der Lichtschranke ist +2s) und anschliessend wieder schliesst. Vom Zeitpunkt des Hochfahrens bis das Tor wieder geschlossen ist soll, wenn es dunkel ist, noch die LEDs angehen.....

Als Hardware habe ich einen Arduino Uno, den Velleman Motor und Power Shield, einen DC-Motor, Endschalter oben und unten, sowie eine IR-Lichtschranke.

Soweit sogut Smile

Nun habe ich mir versucht einen Code zusammen zu stellen, welcher eben diesen beschriebenen Ablauf darstellen soll - sollte..
Einiges macht er, einiges nicht:
- Wenn die Lichtschranke ein "high" gibt, dreht der Motor vorwärts - ok
- Wenn das Tor oben ist, schaltete der Motor aus - ok > aber: die LED gehen nach 2s aus, und das Tor schliesst nicht Sad es schliesst erst, wenn der Endschalter oben nicht mehr auf "high" ist...Dodgy

Kann mir Laie bitte jemand auf die Sprünge helfen?
Ich habe schon einiges ausprobiert, aber entweder hat er zu spät auf die Endschalter reagiert, oder es war sonst immer etwas. bin mit meinem Latein am Ende.

Besten Dank schon einmal;
Matthias

Hier der Code, welcher oben beschrieben ist:

Code:
int dirMotor = 2;                    //motor Richtung
int pwmMotor = 3;                    //motor power
const int LED = 10;                  //LED licht
int daemmerung = A1;                 //dämmerungssensor
int sensorWert = 0;                  //ist es dunkel??
const int gateOpen = 11;             //Tor ist offen
const int gateClosed = 12;           //Tor ist geschlossen
const int willRein = A0;             //IR-Lichtschranke


void setup()
{
  pinMode(dirMotor, OUTPUT);            //Set motor pins to be outputs
  pinMode(pwmMotor, OUTPUT);
  pinMode(LED, OUTPUT);                 //set LED pin to be output
  pinMode(gateOpen, INPUT);             //set limit switch gateOpen to be input
  pinMode(gateClosed, INPUT);           //set limit switch gateClosed to be input
  pinMode(daemmerung, INPUT);           //set daemmerung to be input
  pinMode(willRein, INPUT);             //set willRein (IR sensor) to be input
}

void loop()
{
  sensorWert = analogRead(daemmerung);


  if (digitalRead(willRein) == HIGH && digitalRead(gateOpen) != HIGH)
  {
    {
      if (sensorWert > 200 )                                // LED-Steuerung
      {
        digitalWrite(LED, LOW);
      }
      else
      {
        digitalWrite(LED, HIGH);
      }
    }
    digitalWrite(dirMotor, LOW);                            // Tor fährt hoch
    digitalWrite(pwmMotor, HIGH);
  }
  if (digitalRead(willRein) == LOW && digitalRead(gateOpen) == HIGH)
  {
    digitalWrite(dirMotor, LOW);
    digitalWrite(pwmMotor, LOW);
    delay(2000);
    digitalWrite(dirMotor, HIGH);                           // Tor fährt runter
    digitalWrite(pwmMotor, HIGH);
  }
  if (digitalRead(willRein) == LOW && digitalRead (gateClosed) == HIGH)
  {
    digitalWrite(dirMotor, LOW);
    digitalWrite(pwmMotor, LOW);
    digitalWrite(LED, LOW);
  }



}


Angehängte Datei(en)
.ino  HUM_Katze_1.ino (Größe: 1,79 KB / Downloads: 32)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.10.2015, 21:46
Beitrag #2
RE: Problem einen code zu schreiben der das macht was ich möchte....
Als "neuer" in dem Business ist es nicht optimal, wenn du mit kopiertem Code (ich nehme mal an, der ist kopiert) anfängst und diesen nicht verstehst.
Du solltest bei deinem Projekt in kleinen Schritten arbeiten, um den Code auch richtig zu verstehen.
Also den Sketch in einzelne Funktionsgruppen (Funktionen) aufteilen und diese für sich zu testen.
Wenn diese einzeln funktionieren, kann man die anschließend auch zusammen fügen und das Projekt fertig stellen.

Bitte sehe dass nur als freundlich gemeinten Tipp an.
Kurz zum delay(), diese sollte man generell vergessen, die halten den Code an und stören den Funktionsablauf.
Zu deinem Fehler: kann es sein, dass der letzte Befehl "digitalWrite(dirMotor, LOW);" auf HIGH gehen muss?

Auch versteh ich nicht, warum du die ersten Variablen mit 2 und 3 deklarierst.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.10.2015, 06:06
Beitrag #3
RE: Problem einen code zu schreiben der das macht was ich möchte....
Guten Morgen zusammen

Vielen Dank schon einmal für eure inputs

@Lötzinnerhitzer
Das mit den delays werde ich mir mal anschauen und versuchen anhand von "blink without delay" hin zu kriegen.

@hotsystems
Den Code für die Motorsteuerung habe ich nicht kopiert, den für das Einschalten der LED bei Dämmerung schon. Der Motor-Code ist durch "try and error" zustande gekommen - hatte schon einiges versucht, der hier ist dem gewünschten Ablauf schlussendlich am nächsten gekommen....

Das mit den Funktionsgruppen habe ich versucht und werde ich weiterhin versuchen - das Problem für mich ist oft, dass die Bausteine alleine funktionieren (Tor öffnen wenn "willRein" high ist bis "gateOpen" high ist; schliessen bis "gateClosed" high etc), jedoch bei der Verknüpfung hapert es dann .... wie beschrieben, dass er dann zu spät auf den Endschalter reagiert etc...

Die ersten Variablen (Motor) sind 2 und 3, weil sie vom motor shield her die Pins sind, welche beim arduino auf die Pins 2 und 3 gehen . Wären da andere Pins beim arduino vorzuziehen für den Motor?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.10.2015, 07:01
Beitrag #4
RE: Problem einen code zu schreiben der das macht was ich möchte....
Wie Lötzinnerhitzer schon schrieb, die Dealays müssen weg.
blink without delay ist der richtige Ansatz.
Ist das Programm im Delay, liegt alles still.

Auch die Funktionen, wie hotsystems schreibt, würde ich nutzen.
auf(), zu (), stop(), licht()
Dann im Loop "basteln" bis es läuft, wie gewünscht, so wird das Ganze sehr übersichtlich.

Dazu den Serial.println() einsetzen beim probieren, damit man sieht, was das Programm gerade macht.


Aber ich hab da noch andere Bedenken, ok das käme dann im Zweiten Schritt:

1.
Dir ist schon klar, das eigentlich jedes Getier, von Nachbars Katz, Nachbars Dackel bis hin zu Jägers Fuchs die Tür öffnen kann.
Selbst einer Ratte oder einem Waschbär wird Einlass gewährt.

Vielleicht ist es doch sinniger, Deinen Stubentiger an ein Halsband mit RFID-Transponder oder sowas zu gewöhnen ?!

2.
Wenn Deine Tür bei Fehlfunktionen runter fährt, obwohl der Tiger noch in der Tür steckt, sollte der Motor nicht zu kräftig sein.
Bitte an die Sicherheit denken, ich mag Tiere auch sehr gern Wink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.10.2015, 09:21
Beitrag #5
RE: Problem einen code zu schreiben der das macht was ich möchte....
Hallo Binatone

Werde es mit den Funktionen versuchen

Die Katzen sind nicht gechipt, ist auch nicht nötig da andere Katzen, Fuchs & co auch kein Problem sind... das mit dem RFID hatte ich mir aber auch schon überlegt

Der Motor und das Getriebe sind zu schwach um den lieben ernsthaften Schaden zuzufügen zu können - wollte ja auch keine Guillotine bauen Wink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.10.2015, 12:27
Beitrag #6
RE: Problem einen code zu schreiben der das macht was ich möchte....
so.....
habe nun den code soweit zusammen, dass er an sich sauber funktioniert - jetzt kommt noch das mit dem "blink without delay", sprich dass das Tor nach dem Öffnen bei "willRein == LOW" nicht sofort wieder schliesst, sondern 2s wartet.....Dodgy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.10.2015, 12:57
Beitrag #7
RE: Problem einen code zu schreiben der das macht was ich möchte....
joah...
Den Zustand des Tores beim erreichen eines Endschalters speichern in einer Var.
z.B. eine byte Var. (Step)
0= zu, 1 gleicht fährt rauf, 2 = Tor auf, 3 = fährt runter.
also nach "auf" (1) das Tor beim Erreichen des Endschalters oben stoppen und speichern "Step = 2"
gleichzeitig den wert aus Miilis() PLUS deine Verzögerung in ms (z.B. 5000) in eine unsignedlong Variable speichern.
unsignedLong (Zeit)
Zeit = millis();


im loop dann abfragen:
If (Step==2)
{
if( millis() >= Zeit )
{
Step = 3
runter_fahren ();
}
}


Naja so in etwa...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.10.2015, 15:18 (Dieser Beitrag wurde zuletzt bearbeitet: 25.10.2015 17:23 von Katzenfreund.)
Beitrag #8
RE: Problem einen code zu schreiben der das macht was ich möchte....
Danke Binatone für deinen Ansatz!

ich probiere mal etwas in dieser Art zum Laufen zu bringen....

arrrrch.....
Steh auf dem Schlauch...!Sad
Habe unten den Code, welcher als solches funktioniert - wie schon erwähnt.

Nun aber eben die Verzögerung vor dem Schliessen....

@ Binatone
" Den Zustand des Tores beim erreichen eines Endschalters speichern in einer Var.
z.B. eine byte Var. (Step) " > da stehe ich auf dem Schlauch

vom Prinzip her wäre es ja so:

0 = Tor ist zu wäre ja (digitalRead(gateClosed) == HIGH)
1 = Tor fährt hoch wäre ja (digitalRead(willRein) == HIGH && myStatus=2)
etc

Muss ich jetzt da
#define STATUS_tor_ist_zu 0
#define STATUS_tor_fährt_hoch 1
machen? ... aber wie dann weiter?

Irgendwie habe ich grad einen Riesen Knüppel...
Kann mir jemand helfen bitte?


Code:
int motor_dir1 = 2;                    //motor Richtung
int motor_dir2 = 3;                    //motor power
const int LED = 10;                  //LED licht
int daemmerung = A1;                 //dämmerungssensor
int sensorWert = 0;                  //ist es dunkel??
const int gateOpen = 11;             //Tor ist offen
const int gateClosed = 12;           //Tor ist geschlossen
const int willRein = A0;             //IR-Lichtschranke


int LEDState = LOW;

int myStatus = 1;



void LED_ein ()
{
  if (sensorWert > 200)                                // LED-Steuerung
  {
    digitalWrite(LED, LOW);
  }
  else
  {
    digitalWrite(LED, HIGH);
  }
}

void setup()
{
  pinMode(motor_dir1, OUTPUT);            //Set motor pins to be outputs
  pinMode(motor_dir2, OUTPUT);
  pinMode(LED, OUTPUT);                 //set LED pin to be output
  pinMode(gateOpen, INPUT);             //set limit switch gateOpen to be input
  pinMode(gateClosed, INPUT);           //set limit switch gateClosed to be input
  pinMode(daemmerung, INPUT);           //set daemmerung to be input
  pinMode(willRein, INPUT);             //set willRein (IR sensor) to be input
  digitalWrite(willRein, LOW);
}


void loop()
{
  sensorWert = analogRead(daemmerung);
  
  if ((digitalRead(willRein) == HIGH) && (digitalRead(gateOpen) == HIGH))
  
  {
    myStatus = 1;
    if (sensorWert > 200 )                                // LED-Steuerung
      {digitalWrite(LED, LOW);}
      else
      {digitalWrite(LED, HIGH);}
  }
  else if ((digitalRead(willRein) == HIGH) && (digitalRead(gateOpen) == LOW))
  {
    myStatus = 2;
    if (sensorWert > 200 )                                // LED-Steuerung
      {digitalWrite(LED, LOW);}
      else
      {digitalWrite(LED, HIGH);}
  }
  if ((digitalRead(willRein) == LOW) && (digitalRead(gateOpen) == HIGH))
  {
    myStatus = 3;
    if (sensorWert > 200 )                                // LED-Steuerung
      {digitalWrite(LED, LOW);}
      else
      {digitalWrite(LED, HIGH);}
  }
  if ((digitalRead(willRein) == LOW) && (digitalRead(gateClosed) == HIGH))
  {
    myStatus = 1;
    digitalWrite(LED, LOW);
  }

  switch (myStatus)
  {
    case 1:    // motor aus
      digitalWrite(motor_dir1, LOW);
      digitalWrite(motor_dir2, LOW);
      break;
    case 2:    //hoch
      digitalWrite(motor_dir1, LOW);
      digitalWrite(motor_dir2, HIGH);
      break;
    case 3:    //runter
      digitalWrite(motor_dir1, HIGH);
      digitalWrite(motor_dir2, HIGH);
      break;
  }
  delay(20);
}

oder geht dieser Ansatz in die richtige Richtung?

int tor_ist_zu = 0
int tor_faehrt_hoch = 1
int tor_ist_offen = 2
int tor_fährt_runter = 3

inputVariable0= (digitalRead(gateClosed) == High)
inputVariable1= (digitalRead(willRein) == HIGH && myStatus=2)
....
....

> dann stellt sich mir aber immer noch die Frage, wie man das mit dem Speichern des Zustandes des Tores beim Erreichen des Endschalters in einer byte variablen macht....Huh
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Data Logger Daten auf SD Card schreiben Crichton 12 312 22.11.2016 18:32
Letzter Beitrag: Crichton
  Einfacher Tacho für niedrige Geschwindigkeiten – Code optimieren Bastelo 2 261 12.10.2016 20:31
Letzter Beitrag: Bastelo
  Code mit Verifikation über Keypad & LCD machnetz 5 216 10.10.2016 15:01
Letzter Beitrag: torsten_156
  Problem mit SD Card Library BennIY 4 194 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Problem mit SD.remove Eichner 6 212 22.08.2016 19:42
Letzter Beitrag: Eichner
  Serial Monitor ASCII 1 schreiben BennIY 11 582 01.08.2016 16:42
Letzter Beitrag: Mathias
  4x16 Tastermatrix Problem Michel 16 855 14.07.2016 10:02
Letzter Beitrag: StephanBuerger
  Ausgabe druckt immer 2 Werte anstatt nur einen. Finde den Fehler nicht TimeMen 24 744 02.07.2016 14:18
Letzter Beitrag: hotsystems
  Problem mit Delay und Millis funnyzocker 1 461 26.06.2016 09:54
Letzter Beitrag: hotsystems
  Problem mit ESP8266 und EMail senden torsten_156 1 608 13.06.2016 21:14
Letzter Beitrag: torsten_156

Gehe zu:


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