Go Down

Topic: Motor bei erreichtem Wert einer Variable nur einmal kurz ansteuern (Read 785 times) previous topic - next topic

combie

Die Funktion setup() wurde extra dafür erfunden, um deinen definierten Startzustand herstellen zu können.

Alternativ, schon bei der Definition initialisieren

Beispiel:
Code: [Select]
enum class Zustand:byte{Auf,Zu}zustand=Zustand::Auf;
Schreie nach Besserem, bis du es auch erhältst.
Das noch Bessere verabschiedet sich rechtzeitig vor deinem Lärm.

Quelle: Martin Gerhard Reisenberg

berni576

Das ist der Aktuelle code: 

Code: [Select]

      //NewliquidCrystal
#include <LiquidCrystal.h>  //NewliquidCrystal
LiquidCrystal lcd(12,11,5,4,3,2);

//PINS VERGEBEN
//12,11,5,4,3,2,(7),(10),(6),8,9

//MOTOR
int enA = 6;
int in1 = 7;
int in2 = 10;

//INPUTS
const int buttonPin = 8;
const int pauseButton = 9;
int pauseState = 0;

//Variablen
enum {GASSE1, GASSE2, ZU, OEFFNEN, GASSE4, GASSE5, GASSE6, OFFEN, SCHLIESSEN};
byte zustand = GASSE1;
bool aktButton, altButton;
const uint32_t buttonIntervall = 30;
uint32_t aktMillis, buttonMillis, schieberMillis;

//MOTORZEITEN
const uint32_t oeffnenzeit = 1000;
const uint32_t schliesszeit = 2000;


void setup() {
  //MOTOR
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
 

  //INPUTS
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(pauseButton, INPUT);

  //Serielle Verbindung
  Serial.begin(9600);
  Serial.println("Serial port opened");

  //Display
  lcd.begin(16, 2);                     // initialize the lcd
  lcd.setCursor(0, 0);
  lcd.print("SCHIEBER-");
  lcd.setCursor(0, 1);
  lcd.print("SCHALTUNG");
  //Grundstellung bei Start - waehrend Startsequenz
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 255);
     
  delay(4500);
  lcd.clear();

  delay(4500);
  // Motor wieder in Stillstand nach 2x delay    
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 255);

 
 
 


}

void loop()
{
  aktMillis = millis();
  altButton = aktButton;
  if (aktMillis - buttonMillis >= buttonIntervall)
  {  //Entprellen
    buttonMillis = aktMillis;
    aktButton = digitalRead(buttonPin);
  }
 
    pauseState = digitalRead(pauseButton);
 
 
 
  switch (zustand) {

   
    case GASSE1:   
    if (!altButton && aktButton && pauseState == LOW) {
       lcd.setCursor(0,1);
       lcd.print("SPUR 1          ");
       lcd.setCursor(0,0);
       lcd.print("AKTIV           ");
       //Serial.print("ANZAHL: ");
       //Serial.print("GASSE 1");
       //Serial.println("");
        zustand = GASSE2;

    }
    break;

    case GASSE2:
    if (!altButton && aktButton && pauseState == LOW) {
       lcd.setCursor(0,1);
       lcd.print("SPUR 2          ");
       lcd.setCursor(0,0);
       lcd.print("AKTIV           ");
       //Serial.print("ANZAHL: ");
       //Serial.print("GASSE 2");
       //Serial.println("");
        zustand = ZU;
    }
    break;
   
    case ZU:
      if (!altButton && aktButton && pauseState == LOW) {
        lcd.setCursor(0, 1);
        lcd.print("SCHLIESSEN      ");
        lcd.setCursor(0,0);
        lcd.print("AKTIV           ");
        //Serial.print("ANZAHL: ");
        //Serial.print("STREUEN 1");
        //Serial.println("");
        //digitalWrite(rotPin, HIGH);
        //digitalWrite(blauPin, LOW);
        //MOTOR
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        digitalWrite(enA, HIGH);
        //analogWrite(enA, 255);
        schieberMillis = aktMillis;
        zustand = SCHLIESSEN;
      }
      break;

   
   
    case SCHLIESSEN:
      if (aktMillis - schieberMillis >= schliesszeit) {
        lcd.setCursor(0, 1);
        lcd.print("STREUEN 1      ");
        lcd.setCursor(0,0);
        lcd.print("AKTIV           ");
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
        //
        //digitalWrite(enA, LOW);
        analogWrite(enA, 255);
       
        zustand = GASSE4;
      }
      break;

    case GASSE4:
      if (!altButton && aktButton && pauseState == LOW) {
       lcd.setCursor(0,1);
       lcd.print("STREUEN 2     ");
       lcd.setCursor(0,0);
       lcd.print("AKTIV           ");
       //Serial.print("ANZAHL: ");
       //Serial.print("STREUEN 2");
       //Serial.println("");
        zustand = OFFEN ;

    }
    break;


     
    case OFFEN:
     
        if (!altButton && aktButton && pauseState == LOW) {
        lcd.setCursor(0, 1);
        lcd.print("OEFFNEN         ");
        lcd.setCursor(0,0);
        lcd.print("AKTIV           ");       
 //MOTOR
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        analogWrite(enA, 255);
       
        schieberMillis = aktMillis;
        zustand = OEFFNEN;
     
      }
      break;
     
    case OEFFNEN:
      if (aktMillis - schieberMillis >= oeffnenzeit) {
        lcd.setCursor(0, 1);
        lcd.print("SPUR  5         ");
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
       
        lcd.setCursor(0, 0);
        lcd.print("AKTIV           ");
       

        zustand = GASSE5;
      }
      break;

    case GASSE5:
      if (!altButton && aktButton && pauseState == LOW) {
       lcd.setCursor(0,1);
       lcd.print("SPUR 6          ");
       lcd.setCursor(0, 0);
       lcd.print("AKTIV           ");
       
        zustand = GASSE1;
        }
    break;
   
//    default:
   
 //   zustand = GASSE1;


   
  }
  if(pauseState == HIGH)
  {
    lcd.setCursor(0,0);
    lcd.print("           PAUSE");
  }
  else
  {
    lcd.setCursor(0,0);
    lcd.print("AKTIV           ");
   
  }
    }

Tommy56

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *).

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

berni576

Hallo Leute!


ICH HAB'S :D

Ich hab jetzt, nach ca. 5h, einfach Spaßhalber die gleichen Zeilen wie in case GASSE 1 stehen in setup() kopiert... ich tro**el... :D

VIELEN DANK AN EUCH ALLE!

Vielleicht brauch ich nochmal eine Kleinigkeit und da freue ich mich schon wieder auf eure Antworten! Ihr seid super!!

Gruß,
berni576

Tommy56

Es wäre gut, wenn Du den funktionierenden Code für die Nachwelt hier noch mal einstellen würdest.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

berni576

--> es tritt ein großes Problem auf.. :(

Schaltung, bzw. das Programm funktionieren Tadellos, jedoch wenn der verbaute Linearmotor in Endstellung fährt gibt mir der 1602a nur mehr irgendwelche Zeichen aus.. Hab ich da störsignale vom Motor drauf? wie bekomme ich die leicht weg?

könnt ihr mir da bitte helfen :( :(

Vielen lieben Gruß!

Go Up