Go Down

Topic: Einsteiger braucht Hilfe mit Ablaufsteuerung (Read 2757 times) previous topic - next topic

0skill

Hallo

Ich habe vor kurzem mit Arduino angefangen.
Hab am Anfang mal die meisten Tutorials durchgearbeitet um mich damit etwas vertraut zu machen.
Ich habe Grundkenntnisse in C und möchte mir gerne auch noch das micro Controller programmieren beibringen

als erstes eigenes Projekt hab ich eine kleine Ablaufsteuerung geplant, die folgendes machen/können sollte:
als erstes wird ein Ventil für eine gewisse Zeit aufgemacht dann wieder geschlossen.
Danach werden zwei weitere Ventile aufgemacht dann eines nach dem andere wieder geschlossen
gestartet sollte das ganze via einem Startknopf werden ebenso sollte am ende der Ablauf so lange stehen bleiben bis ein Stopknopf gedrückt wird.

Zum testen habe ich die Schaltung auf einem Prototyping Board zusammengesteckt und anstatt der Ventile einfach LED's mit einem Vorwiderstand verwendet.
Die Sensoren wurden einfach mit einem Widerstand simuliert.
Das ganze sieht jetzt in etwa so aus:

https://www.dropbox.com/s/9kehq82hphesi3a/IMAG0708.jpg


Mein Problem ist nun folgendes, es passiert einfach garnichts .
Ich habe auch schon versucht die LED's anders rum ein zu stecken hilft nichts dann hab ich auch noch versucht GND und + zu vertauschen
(am breed board)
Hat alles nix gebracht
Dann dachte ich das mein Arduino Board kaputt ist und hab den Hello World code rauf geladen und der geht einwandfrei  :smiley-sad-blue:

hier mal mein Code:
Code: [Select]

#include <Arduino.h>

int Start_button = 2; //Start Button
int CPS1 = 3;  //CPS = Cover Plate Sensor
int CPS2 = 4;
int CPS3 = 5;
int Vacuum_valve = 6;  //Vacuum Valve
int Helium_valve = 8;  //Helium Valve
int Flushing_valve = 9;  //Helium Flushing Valve
int test_result = 10; //End of the test (led shows when the test has finished)
int Stop_button = 11; //Stop test
int Savety_chain = 12; //Savety chain
int a, b, c;

int Start(void);
int get_vacuum(int);
int flushing(int);
void test_result_funktion(int);

void setup()
{
  // put your setup code here, to run once:
  pinMode(Start_button, INPUT);
  pinMode(CPS1, INPUT);
  pinMode(CPS2, INPUT);
  pinMode(CPS3, INPUT);
  pinMode(Vacuum_valve, OUTPUT);
  pinMode(Helium_valve, OUTPUT);
  pinMode(Flushing_valve, OUTPUT);
  pinMode(test_result, OUTPUT);
  pinMode(Savety_chain, OUTPUT);
  pinMode(Stop_button, INPUT);
}
void loop()
{
  // put your main code here, to run repeatedly:
  a = 0;
  b = 0;
  c = 0;
 
  a = Start();
  b = get_vacuum(a);
  c = flushing(b);
  test_result_funktion(c);
}

int Start(void)
  {
    int i = 0;
   
    //for(i = 1; i < 4; i++)
      //{
        digitalRead(CPS1);  //Read the current status of the cover plate sensors
        digitalRead(CPS2);  //Read the current status of the cover plate sensors
        digitalRead(CPS3);  //Read the current status of the cover plate sensors
      //}
    digitalRead(Start_button);  //Read the start button
   
    if((CPS1 == HIGH) && (CPS2 == HIGH) && (CPS3 == HIGH) && (Start_button == HIGH))
      {
        return 0;
      }else{digitalWrite(Savety_chain, HIGH);}
  }
int get_vacuum(int a)
  {
    int i = 0;
   
    if(a == 0)
      {
        digitalWrite(Vacuum_valve, HIGH);  //Vacuum valve is opened
        delay(15000);  //Time where the vacuum valve is open
        digitalWrite(Vacuum_valve, LOW);  //Vacuum valve is closed
      }else{i = 1;}
     
    if(i == 1)
      {
        return 1;
      }else{return 0;}
   }
int flushing(int b)
  {
    int i = 1;
   
    if(b == 0)
      {
        digitalWrite(Helium_valve, HIGH);
        digitalWrite(Flushing_valve, HIGH);
        delay(5000);
        digitalWrite(Flushing_valve, LOW);
        delay(1000);
        digitalWrite(Helium_valve, LOW);
      }else{i = 1;}
     
    if(i == 1)
      {
        return 1;
      }else{return 0;}
  }
void test_result_funktion(int c)
  {
    if(c == 0)
      {
        do
          {
            digitalWrite(test_result, HIGH);
            digitalRead(Stop_button);
           
          }while(Stop_button != HIGH);
      }
    digitalWrite(test_result, LOW);
  } 
[code/]

Serenifly

Das geht so nicht:
Code: [Select]

    digitalRead(CPS1);  //Read the current status of the cover plate sensors
    digitalRead(CPS2);  //Read the current status of the cover plate sensors
    digitalRead(CPS3);  //Read the current status of the cover plate sensors

    digitalRead(Start_button);  //Read the start button
   
    if((CPS1 == HIGH) && (CPS2 == HIGH) && (CPS3 == HIGH) && (Start_button == HIGH))


Schau mal hier:
http://arduino.cc/en/Reference/digitalRead

DigitalRead hat einen Return-Wert und zwar LOW oder HIGH.

Du musst also sowas machen:
Code: [Select]
if(digitalRead(CPS1) == HIGH)
{
}


Du machst im Prinzip das:
Code: [Select]

if(3 == 1)
{
}


Das ist immer false

uwefed

Die C-Syntax scheint Dir noch nicht ins Blut übergegangen zu sein.

Code: [Select]
int Start(void);
int get_vacuum(int);
int flushing(int);
void test_result_funktion(int);

kannst Du löschen.

Du mußt Pullup-Widerstände anschließen oder die internen aktivieren.

Verwende kein delay sondern millis().

Benutze eine Statusvariable um zu wissen in welchem Schritt du gerade bist.

Grüße Uwe

0skill

schon mal danke für eure tipps

Das mit der millis() Funktion werde ich mir noch ansehen (kannte ich bis jetzt noch nicht)

Das ich die Prototypen streichen kann ist mir jetzt unklar
zumindest kenne ich es nur so aus dem Unterricht
also entweder vor der main() die Prototypen deklarieren und nach der main() schreiben oder gleich die ganzen Funktionen vor der main() schreiben und dann in der main() aufrufen

danke nochmals

Serenifly

Arduino hat keine main Methode, bzw. die IDE versteckt diese. Es gibt nur setup() und loop(). Daher werden auch Methoden erkannt die nach loop() stehen.

millis() verwendet man damit Delays den Code nicht blockieren. Das kommt aber darauf an was gemacht wird. Wenn du für 1 Sekunde einen Ausgang schalten willst und es dir egal ist, dass in dieser Zeit nichts anderes gemacht wird kannst du das auch lassen. Dass es generell falsch ist, ist etwas extrem. Das kommt auf die Anwendung an.

Wenn du aber während der Zeit noch ein Display updaten oder etwas messen möchtest musst das so machen:
http://arduino.cc/en/Tutorial/BlinkWithoutDelay

michael_x


Die C-Syntax scheint Dir noch nicht ins Blut übergegangen zu sein.

Code: [Select]
int Start(void);
int get_vacuum(int);
int flushing(int);
void test_result_funktion(int);

kannst Du löschen.


Kannst du als echter c Programmierer aber auch drin lassen. ( muss ich ausnahmsweise mal uwe etwas widersprechen).
Das ist eine Arduino-Spezialität: Wenn die IDE aus der .ino eine .cpp Datei macht, werden erforderliche Deklarationen hinzugefügt.

Dass deine int Start(void) Funktion nicht immer einen Wert zurückliefert, merkt die IDE leider nicht, und auch der gcc wird ohne Warnungen aufgerufen und legt dich so rein.

Go Up