Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal.h>
- LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
- unsigned long aktuelleZeit;
- unsigned long vergangeneZeit_A;
- unsigned long interval_1 = 2000;
- int messungPin1 = HIGH;
- int messungPin1Alt = HIGH;
- byte encoderWert = 1; // -1 ( eins weniger als 0 ) == 255
- const byte hal = 3;
- const byte encoderPinA = 10; // Phase A vom Drehencoder
- const byte encoderPinB = 11; // Phase B vom Drehencoder
- const byte tasterEnter = 12; // Pin an dem der Encoder Taster angeschlossen ist
- int wertSpeichern = 0; // gespeicherter Encoderwert
- int encoderGedrueckt = 0; // Statusspeicher ob Encodertaster betätigt wurde
- int encoderTaster = HIGH; // Taster im Encoder
- int gleisAlt = 1; // Scheibe Position alt
- int gleisNeu = 0; // Position welche die Scheibe anfahren soll
- int schritte = 0; // Schritte die deer Motor (Hallsensor betätigt) zurücklegen muss
- int sensor = LOW;
- const byte tasterWenden = A3;
- int status_tasterWenden = HIGH;
- int tasterWenden_gedrueckt = 0;
- unsigned long tasterWenden_Druckzeit;
- unsigned long encoderDruckzeit; // Zeit wann der Encodertaster betaetigt wurde
- unsigned long entprellZeit = 200; // Zeit die nach der betaetigung eines Tasters gewartet wird
- unsigned long startZeit; // Abfrage begin Sensor an Bühne
- unsigned long interval = 2000; // Zeitabstand nachdem ein Zustand des Sensors erkannt wird
- unsigned long vergangeneZeit = 0; // Speichervariable um die Vergangene Zeit zu speichern
- int pin_motor_links = A1; // Richtungspin an H-Brücke für Links
- int pin_motor_rechts = A2; // Richtungspin an H-Brücke für Rechts
- const byte sensor_referenz = 2; // Pin für Sensor Referenz aussen an der Grube (Nullstellung)
- int status_sensor_referenz; // Speichervariable für Status von Sensor für Referenzfahrt
- // Statusvariablen
- bool nullStellung = false; // Speichervariable ob Referenzfahrt erfolgt ist
- bool enter = false; // Bestaetigung das der Encoder gedrueckt wurde
- bool ergebnis = false; // Berechnung der Schritte und Richtung beendet/gestartet
- bool start = false; // Schritte Zaehlen beendet/gestartet
- bool drehung = false; // 180 Grad Drehung beendet/gestartet
- bool motorAnsteuerung = false; // Motor steht/läuft
- void setup() {
- pinMode(sensor_referenz, INPUT);
- pinMode(pin_motor_links, OUTPUT);
- pinMode(pin_motor_rechts, OUTPUT);
- pinMode(encoderPinA, INPUT);
- pinMode(encoderPinB, INPUT);
- pinMode(tasterEnter, INPUT);
- pinMode(hal, INPUT);
- pinMode(tasterWenden, INPUT);
- Serial.begin(9600);
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Drehscheiben-");
- lcd.setCursor(0, 1);
- lcd.print("steuerrung");
- delay (2000);
- //lcd.clear();
- //lcd.begin(16, 2);
- //lcd.setCursor(0, 0);
- //lcd.print("Wert");
- //lcd.setCursor(0, 1);
- //lcd.print(encoderWert);
- }
- void loop() {
- referenzFahrt();
- encoder_lesen();
- schritt();
- schritteZaehlen();
- wenden();
- }
- void referenzFahrt() {
- aktuelleZeit = millis();
- status_sensor_referenz = digitalRead(sensor_referenz);
- if ((nullStellung == false) && (status_sensor_referenz == HIGH)) {
- digitalWrite (pin_motor_rechts, HIGH);
- digitalWrite (pin_motor_links, LOW);
- if (millis() - vergangeneZeit_A >= interval_1) {
- Serial.println("2 Sekunden abgelaufen");
- lcd.clear();
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Referenzfahrt");
- lcd.setCursor(0, 1);
- lcd.print("gestartet");
- vergangeneZeit_A = millis();
- }
- }
- else if ((nullStellung == false) && (status_sensor_referenz == LOW)) {
- Serial.println(nullStellung);
- Serial.println(status_sensor_referenz);
- Serial.println(vergangeneZeit_A);
- nullStellung = true;
- digitalWrite(pin_motor_rechts, LOW);
- digitalWrite(pin_motor_links, LOW);
- lcd.clear();
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Referenzfahrt");
- lcd.setCursor(0, 1);
- lcd.print("beendet");
- delay(2000);
- lcd.clear();
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Gleis");
- lcd.setCursor(0, 1);
- lcd.print(encoderWert);
- }
- }
- void encoder_lesen () {
- messungPin1 = digitalRead(encoderPinA);
- if ((messungPin1 == LOW) && (messungPin1Alt == HIGH) && (nullStellung == true)) {
- if (digitalRead(encoderPinB) == HIGH) {
- encoderWert++ ;
- if (encoderWert > 48) {
- encoderWert = 1;
- }
- } else {
- encoderWert-- ;
- if (encoderWert < 1) {
- encoderWert = 48;
- }
- }
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Gleis");
- lcd.setCursor(0, 1);
- lcd.print(encoderWert);
- }
- encoderTaster = digitalRead(tasterEnter);
- if (encoderTaster == LOW)
- {
- encoderDruckzeit = millis();
- encoderGedrueckt = 1;
- }
- if ((millis() - encoderDruckzeit > entprellZeit) && encoderGedrueckt == 1) {
- wertSpeichern = encoderWert;
- Serial.println(wertSpeichern);
- encoderGedrueckt = 0;
- enter = true;
- }
- messungPin1Alt = messungPin1;
- }
- void schritt () {
- if (enter == true) {
- gleisNeu = wertSpeichern;
- //von = random(schritte_max) + 1; //von und bis 'auswürfeln'
- //nach = random(schritte_max) + 1;
- Serial.print("Von "); // Von 1
- Serial.print(gleisAlt);
- Serial.print(" nach "); // nach 12
- Serial.println(gleisNeu);
- if (gleisAlt > gleisNeu) {
- int schritte_links = (gleisAlt - gleisNeu);
- Serial.println("Entfernung in Drehrichtung links");
- Serial.println(schritte_links);
- Serial.println(" ");
- int schritte_rechts = gleisNeu - gleisAlt;
- Serial.println("Entfernung in Drehrichtung rechts");
- Serial.println(schritte_rechts);
- int schritte_rechts_erg = schritte_rechts + 48;
- Serial.println(schritte_rechts_erg);
- Serial.println(" ");
- if (schritte_links >= schritte_rechts_erg) {
- schritte = schritte_rechts_erg;
- pin_motor_links = 0;
- pin_motor_rechts = 255;
- Serial.println("Drehrichtung rechts");
- }
- else if (schritte_links < schritte_rechts_erg) {
- schritte = schritte_links;
- pin_motor_links = 255;
- pin_motor_rechts = 0;
- Serial.println("Drehrichtung links");
- }
- }
- if (gleisAlt < gleisNeu) {
- int schritte_links = abs ((gleisNeu - gleisAlt) - 48);
- Serial.println("Entfernung in Drehrichtung links");
- Serial.println(schritte_links);
- Serial.println(" ");
- int schritte_rechts = (gleisNeu - gleisAlt);
- Serial.println("Entfernung in Drehrichtung rechts");
- Serial.println(schritte_rechts);
- Serial.println(" ");
- if (schritte_links >= schritte_rechts) {
- Serial.println("Drehrichtung rechts");
- schritte = schritte_rechts;
- pin_motor_links = 0;
- pin_motor_rechts = 255;
- }
- else if (schritte_links < schritte_rechts) {
- Serial.println("Drehrichtung links");
- schritte = schritte_links;
- pin_motor_links = 255;
- pin_motor_rechts = 0;
- }
- }
- enter = false;
- ergebnis = true;
- lcd.clear();
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Drehung start");
- lcd.setCursor(0, 1);
- lcd.print("Restl. Pos.");
- lcd.setCursor(14, 1);
- lcd.print(schritte);
- Serial.println("Schritte");
- Serial.println(schritte);
- }
- }
- void schritteZaehlen () {
- sensor = digitalRead (hal);
- startZeit = millis();
- if ((schritte != 0) && (ergebnis == true)) {
- start = true;
- if ((startZeit - vergangeneZeit >= interval) && (sensor == LOW) && (start == true)) {
- vergangeneZeit = startZeit;
- schritte--;
- lcd.clear();
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Drehung start");
- lcd.setCursor(0, 1);
- lcd.print("Restl. Pos.");
- lcd.setCursor(14, 1);
- lcd.print(schritte);
- //Serial.println("Schritte");
- //Serial.println(schritte);
- }
- }
- else if ((schritte == 0) && (start == true)) {
- start = false;
- Serial.println("Ziel");
- lcd.clear();
- lcd.begin(16, 2);
- lcd.print("Drehung");
- lcd.setCursor(0, 0);
- lcd.setCursor(0, 1);
- lcd.print("beendet");
- delay(2000);
- lcd.clear();
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Gleis");
- lcd.setCursor(0, 1);
- lcd.print(encoderWert);
- ergebnis = false;
- drehung = false;
- encoderWert = gleisNeu;
- gleisAlt = gleisNeu;
- }
- }
- void wenden() {
- status_tasterWenden = digitalRead(tasterWenden);
- if ((status_tasterWenden == LOW) && (enter == false) && (nullStellung == true) && (ergebnis == false)) {
- tasterWenden_Druckzeit = millis();
- tasterWenden_gedrueckt = 1;
- drehung = true;
- }
- if ((millis() - tasterWenden_Druckzeit > entprellZeit) && tasterWenden_gedrueckt == 1) {
- if (encoderWert >= 25) {
- int merker1 = 48 - gleisAlt;
- gleisNeu = 24 - merker1;
- schritte = 24;
- Serial.println(gleisAlt);
- tasterWenden_gedrueckt = 0;
- ergebnis = true;
- lcd.clear();
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Drehung start");
- lcd.setCursor(0, 1);
- lcd.print("Restl. Pos.");
- lcd.setCursor(14, 1);
- lcd.print(schritte);
- Serial.println("Schritte");
- Serial.println(schritte);
- encoderWert = gleisNeu;
- Serial.println(" ");
- Serial.println(encoderWert);
- Serial.println(gleisAlt);
- Serial.println(gleisNeu);
- }
- else if (gleisNeu < 25) {
- gleisNeu = gleisAlt + 24;
- schritte = 24;
- Serial.println(gleisAlt);
- tasterWenden_gedrueckt = 0;
- ergebnis = true;
- lcd.clear();
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Drehung start");
- lcd.setCursor(0, 1);
- lcd.print("Restl. Pos.");
- lcd.setCursor(14, 1);
- lcd.print(schritte);
- Serial.println("Schritte");
- Serial.println(schritte);
- encoderWert = gleisNeu;
- Serial.println(" ");
- Serial.println(encoderWert);
- Serial.println(gleisAlt);
- Serial.println(gleisNeu);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement