Encoder & Relais

Hi,

ich bin absoluter Neuling und bräuchte Hilfe beim Code.

Folgendes: Ich habe einen Encoder, der nach 2-3 Umdrehungen (Richtung egal) das Relais einschaltet. Wenn das passiert ist, sollen sich die Umdrehungen quasi "nullen" und alles von vorne losgehen. Das Relais soll nach einer bestimmten Zeit wieder ausschalten.

Ich habe folgenden Encoder:
GRV ENCODER: Arduino - Grove Encoder bei reichelt elektronik
und Relais
DEBO RELAY 5V: Entwicklerboards - Relais-Modul, 5 V, SRD-05VDC-SL-C bei reichelt elektronik

Alles auf einem Arduino Uno.

Ich hab auch folgende Codes schon gefunden und beide funktionieren soweit ich das beurteilen kann einzeln einwandfrei. Nur ich krieg sie nicht zusammen.

zum Encoder:

int encoderPinA = 2;
int encoderPinB = 3;
int encoderPos = 0;
int encoderPinALast = LOW;
int encoderPinANow = LOW;

void setup() {
 pinMode (encoderPinA, INPUT_PULLUP);
 pinMode (encoderPinB, INPUT_PULLUP);
 Serial.begin (115200);
}

void loop() {
 encoderPinANow = digitalRead(encoderPinA);
 if ((encoderPinALast == HIGH) && (encoderPinANow == LOW)) {
 if (digitalRead(encoderPinB) == HIGH) {
 encoderPos++;
 } else {
 encoderPos--;
 }
 Serial.println(encoderPos);
 }
 encoderPinALast = encoderPinANow;
}

und zum Relais:

[/td][/tr][/table]

int PINOUT = 8;                 // Pin 8 am Arduino festlegen
    
void setup() {
   pinMode(PINOUT, OUTPUT);     // Initialisieren des Ausgangs
}
 
void loop() {
   digitalWrite(PINOUT, HIGH);  // Schaltet ein
   delay(1000);
   digitalWrite(PINOUT, LOW);   // Schaltet aus
   delay(1000); 
}

Hallo,

Dein Sketch ist fast nicht zu lesen. In einem Mobilgerät überhaupt nicht.

Setze deinen Sketch bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken, oder [ code] davor und [ / code] dahinter ohne Leerzeichen.
Oder
im IDE-Fenster rechte Maustaste und für "Forum kopieren klicken", danach hier einfügen.

Das kannst du in deinem Startbeitrag noch nachträglich machen.

Damit wird dieser für alle besser lesbar.

Hallo,

naja , für den Anfang vieleicht etwas zu viel auf eimal. Also erst mal die Beispiele aus der IDE studieren.

1.Was die vairable encoderPos macht hast Du verstanden. Die zählt rauf oder runter.

  1. wie das relais eingeschaltete wird hast Du auch verstanden. digitalWrite(pin, HIGH)

  2. So jetzt schaust Du dir an wie if... else funktioniert.
    wenn encoderPos > xxx dann Relais ein
    encoderPos=0

  3. Jetzt kommt dann als nächstes allerdings ein Problem auf Dich zu. Wenn Du das Relais eingeschaltet hast willst Du es ja nach einer festgelegten Zeit wieder ausschalten. Das kannst Du mit delay zwar machen, allerdings kannst Du dann während der Zeit nicht die Signale des Encoders zählen wenn er gedreht wird.

  4. jetzt kommt millis() ins Spiel. Dazu schaust Du dir das Beispiel blinkWithoutDelay an und suchst nach dem Nachtwächter. Das solltest Du verstanden haben, und damit eine Ausschaltverzöerung realisieren. Also einen Taster kurz drücken eine LED geht an und nach 5s geht sie wieder aus.

schritt 4/5 kannst Du überspringen wenn Du nach einer Lib suchst die eine Ausschaltverzögerung kann. Allerdings wirst Du dann bei dem nächten Sketch wieder an einen Punkt kommen an dem Du nur mit millis() weiterkommst.

Wenn Du bis hier hin dann alles verstanden hast wird es kein Problem mehr für Dich sein die Aufgabe zu lösen.

Heinz

Rentner:
Hallo,

naja , für den Anfang vieleicht etwas zu viel auf eimal. Also erst mal die Beispiele aus der IDE studieren.

1.Was die vairable encoderPos macht hast Du verstanden. Die zählt rauf oder runter.

  1. wie das relais eingeschaltete wird hast Du auch verstanden. digitalWrite(pin, HIGH)

  2. So jetzt schaust Du dir an wie if... else funktioniert.
    wenn encoderPos > xxx dann Relais ein
    encoderPos=0

  3. Jetzt kommt dann als nächstes allerdings ein Problem auf Dich zu. Wenn Du das Relais eingeschaltet hast willst Du es ja nach einer festgelegten Zeit wieder ausschalten. Das kannst Du mit delay zwar machen, allerdings kannst Du dann während der Zeit nicht die Signale des Encoders zählen wenn er gedreht wird.

  4. jetzt kommt millis() ins Spiel. Dazu schaust Du dir das Beispiel blinkWithoutDelay an und suchst nach dem Nachtwächter. Das solltest Du verstanden haben, und damit eine Ausschaltverzöerung realisieren. Also einen Taster kurz drücken eine LED geht an und nach 5s geht sie wieder aus.

schritt 4/5 kannst Du überspringen wenn Du nach einer Lib suchst die eine Ausschaltverzögerung kann. Allerdings wirst Du dann bei dem nächten Sketch wieder an einen Punkt kommen an dem Du nur mit millis() weiterkommst.

Wenn Du bis hier hin dann alles verstanden hast wird es kein Problem mehr für Dich sein die Aufgabe zu lösen.

Heinz

Hallo Heinz,
erstmal vielen Dank. Die Tipps haben mir wirklich geholfen.
Ich habe es jetzt folgendermaßen gelöst:

int encoderPinA = 2;
int encoderPinB = 3;
int encoderPos = 0;
int PINOUT = 8;
int encoderPinALast = LOW;
int encoderPinANow = LOW;

long lastInteraction = 0;

void setup() {
  pinMode (encoderPinA, INPUT_PULLUP);
  pinMode (encoderPinB, INPUT_PULLUP);
  Serial.begin (9600);
  pinMode(PINOUT, OUTPUT);
  digitalWrite(PINOUT, LOW);
}

void loop() {
  encoderPinANow = digitalRead(encoderPinA);
  if ((encoderPinALast == HIGH) && (encoderPinANow == LOW)) {
    if (digitalRead(encoderPinB) == HIGH) {
      encoderPos++;
    } else {
      encoderPos--;
    }
    Serial.println(encoderPos);
    lastInteraction = millis();
    //Serial.println(millis());
  }
  encoderPinALast = encoderPinANow;


  if(millis() - lastInteraction > 5000){
    encoderPos = 0;
  }

  if(abs(encoderPos) > 60){
     digitalWrite(PINOUT, HIGH);
     delay(5000);
     digitalWrite(PINOUT, LOW);
     encoderPos = 0;
  }
}

Ich habe es trotzdem mit einem Delay gemacht, da es in meinem Fall egal ist, dass der Encoder zu der Zeit nicht ausgelesen werden kann.
Vielen Dank nochmal!

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.