Drehgeber mit Richtungs-Erkennung

Veröffentlicht von

Der Drehgeber erkennt Vorlauf und Rücklauf, der Taster setzt den Wert wieder auf 0, die LED geht erst an, wenn beide Lichtschranken ein Signal haben.

Bauteile

Sketch

// Die Lochscheibe hat 46 Löcher
// 1 Takt = 6,5 mm

double mmProTakt = 7.51;

int sensorPin = A0;
int sensorPin_2 = A5;

int sensorValue = 0;
int sensorValue_2 = 0;

int ledPin = 13;
int ledPin_2 = 12;
int taster = 8;

int richtung = 0; // 1 = vor, 2 = zurück

static unsigned long timeStamp = 0L;
unsigned long countSlots = 0;
double countSlots_2 = 0;

unsigned long takt = 0;
unsigned long takt_2 = 0;

//unsigned long saveCountSlots = 0;

// erst wenn es einen hohen Wert und einen tiefen Wert gibt,
// erst dann ein "countSlots" mehr
bool sensorAn = false;
bool sensorAus = false;

bool sensorAn_2 = false;
bool sensorAus_2 = false;



void setup()
{ 
   pinMode(ledPin, OUTPUT); 
   pinMode(ledPin_2, OUTPUT); 
   pinMode(taster, INPUT);
   
   digitalWrite(ledPin, HIGH);
   digitalWrite(ledPin_2, HIGH);
   digitalWrite(taster, LOW);

   Serial.begin(9600);

   Serial.print("Bereit...");
}
 
void loop()
{ 
   sensorValue = analogRead(sensorPin);
   sensorValue_2 = analogRead(sensorPin_2);

   if(digitalRead(taster) == HIGH){
      Serial.println("Taster");      
      if(countSlots_2 != 0){
        countSlots_2 = 0;
        Serial.print("countSpin: ");
        Serial.println(countSlots_2);
     }
   }

   //Serial.println(sensorValue);

   if (sensorValue > 500) {
      //Serial.println("Lichtschranke 1 An: ");
      if(richtung == 0) {
        richtung = 1;
        Serial.println("+1");
      }
      
      sensorAn = true;    
   } else {
      sensorAn = false;
   }

    //Serial.println(sensorValue_2);

   if (sensorValue_2 > 500) {
    //Serial.println("Lichtschranke 2 An: ");
      if(richtung == 0) {
        richtung = 2;
        Serial.println("-1");
      }
    
        sensorAn_2 = true;  
   } else {
      sensorAn_2 = false; 
   }

  //Serial.print("Lichtschranke 1 An: ");
  //Serial.println(sensorValue);
  //Serial.print("Lichtschranke 2 An: ");
  //Serial.println(sensorValue_2);
  
   if (sensorAn && sensorAn_2) {
      digitalWrite(ledPin_2, HIGH);
      if (takt == 0) {

          if(richtung == 1) {
            //Serial.println("+1");
            countSlots_2++;
          }

          if(richtung == 2) {
            //Serial.println("-1");
            countSlots_2--;
          }
          
          //sensorAn_2 = false;


          takt = 1; 
          
          Serial.print("Takt: ");
          Serial.print(countSlots_2);
          Serial.print(" = ");
          Serial.print(countSlots_2 * mmProTakt);
          Serial.println("mm");
//          Serial.print("Richtung: ");
//          Serial.println(richtung);
      }
   }
   
   if (!sensorAn && !sensorAn_2) {
      digitalWrite(ledPin_2, LOW);
      takt = 0;
      richtung = 0;
   }

   // kein delay()einbauen, sonst wird nicht alles gezählt
   //delay(10);  
}

void getSpins(){



 // if(millis() - timeStamp >= 60000L){
    
    // gezählte Schlitze in einer Minute
    //Serial.print("countSpin: ");
    //Serial.println(countSlots);

    // Umdrehungen pro Minute, es sind 23 Schlitze in der Zählscheibe
    int rpm = countSlots / 23;
    //Serial.print("rpm: ");   
    //Serial.println(rpm);



    // reset Daten
    //timeStamp = millis();
    //countSlots = 0;
 // }

}

Code-Sprache: PHP (php)