#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <MobaTools.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int STEPS_UMDREHUNG = 800;
//Stepper einrichten ( 800 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepper( STEPS_UMDREHUNG, STEPDIR );
const byte dirPin = 8;
const byte stepPin = 9;
const byte enaPin = 10;
// Taster einrichten ( die Taster müssen gegen Gnd schalten, keine Widerstände notwendig )
enum { Taster1, Taster2, Taster3, Taster4, Taster5} ; // Den Tasternamen die Indizes 0...3 zuordnen
const byte tasterPins[] = {A1, A3, A2, 11, 12 }; // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
const byte tasterZahl = sizeof(tasterPins);
MoToButtons taster( tasterPins, tasterZahl, 20, 500 );
bool dirR = false, dirL = false;
const long maxSpeed = 1500; //U/min
const long rampLen = 50; //Steps
MoToTimebase speedIntervall; // Zeitinterval zum Auslesen des Speedpotentiometers
bool menueOpen = false;
const byte potiPin = A0; //Poti fuer Geschwindigkeit
int vspeed = 0; //Steppergeschwindigkeit in U/min*10
int oldSpeed = 0; // Zur Erkennung von Geschwindigkeitsänderungen
void setup()
{ Serial.begin(115200); while (!Serial);
myStepper.attach( stepPin, dirPin );
myStepper.attachEnable( enaPin, 10, LOW ); // Enable Pin aktivieren ( LOW=aktiv )
myStepper.setSpeed(map((analogRead(potiPin)), 0, 1023, 0, maxSpeed));
vspeed = map((analogRead(potiPin)), 0, 1023, 0, maxSpeed);
myStepper.setRampLen( rampLen ); // Rampenlänge 10 Steps bei 20U/min
speedIntervall.setBasetime( 100 ); // 100ms Tickerzeit
pinMode(LED_BUILTIN, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(" Guten Morgen ");
lcd.setCursor(0,1);
lcd.print(" Friedrich ");
delay(2000); // Waiting for a while
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Speed: ");
lcd.print(map(vspeed, 0, maxSpeed, 0, 100));
lcd.print("% ");
lcd.setCursor(0,1);
lcd.print(" STOP ");
//toRefPoint();
}
void loop() {
taster.processButtons(); // Taster einlesen und bearbeiten
// Speed alle 100ms neu einlesen und setzen
if ( speedIntervall.tick() ) {
// wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
vspeed = map((analogRead(potiPin)), 0, 1023, 0, maxSpeed); //Poti mappen auf 2 ... 180 Umdr/Min
//min speed =2 and max speed =180 rpm
if ( abs( oldSpeed - vspeed ) > 5 ) {
myStepper.setRampLen( rampLen );
myStepper.setSpeed( vspeed );
oldSpeed = vspeed;
}
if ( map(vspeed, 0, maxSpeed, 0, 100) < 1 ) {
myStepper.setRampLen( 0 );
myStepper.setSpeed( 0 );
oldSpeed = 0;
}
}
lcd.setCursor(0,0);
lcd.print(" Speed: ");
lcd.print(map(vspeed, 0, maxSpeed, 0, 100));
lcd.print("% ");
// Endschalter links ausgelöst
if ( taster.longPress( Taster4 ) ){
myStepper.setRampLen( 0 );
myStepper.rotate(0);
myStepper.attachEnable( enaPin, 10, HIGH );
lcd.setCursor(0,1);
lcd.print(" E-STOP LINKS ");
dirL=true;
}
// Endschalter rechts ausgelöst
if ( taster.longPress( Taster5 ) ){
myStepper.setRampLen( 0 );
myStepper.rotate(0);
myStepper.attachEnable( enaPin, 10, HIGH );
lcd.setCursor(0,1);
lcd.print(" E-STOP RECHTS ");
dirR=true;
}
// Stopp taste ausgelöst
if ( taster.longPress( Taster3 ) ){
myStepper.setRampLen( rampLen );
myStepper.rotate(0);
myStepper.attachEnable( enaPin, 10, HIGH );
lcd.setCursor(0,1);
lcd.print(" Stop ");
}
//
for ( byte tastIx = 0; tastIx < tasterZahl; tastIx++ ) {
// die 4 Taster auf Click/Doppelclick abfragen
byte clickTyp = taster.clicked(tastIx);
if ( clickTyp == SINGLECLICK ) {
//Taste wurde einfach gedrückt
//Serial.print("Fahre zu Pos "); Serial.println( tasterPos[tastIx] );
//myStepper.writeSteps(tasterPos[tastIx]);
switch ( tastIx ) {
case Taster1:
if(dirL)break;
myStepper.attachEnable( enaPin, 10, LOW );
myStepper.setRampLen( rampLen );
myStepper.rotate(1);
lcd.setCursor(0,1);
lcd.print(" Links ");
dirR=false;
break;
case Taster2:
if(dirR)break;
myStepper.attachEnable( enaPin, 10, LOW );
myStepper.setRampLen( rampLen );
myStepper.rotate(-1);
lcd.setCursor(0,1);
lcd.print(" Rechts ");
dirL=false;
break;
case Taster3:
myStepper.setRampLen( rampLen );
myStepper.rotate(0);
myStepper.attachEnable( enaPin, 10, HIGH );
lcd.setCursor(0,1);
lcd.print(" Stop ");
break;
case Taster4:
myStepper.setRampLen( 0 );
myStepper.rotate(0);
myStepper.attachEnable( enaPin, 10, HIGH );
lcd.setCursor(0,1);
lcd.print(" E-Stop Links ");
dirL=true;
break;
case Taster5:
myStepper.setRampLen( 0 );
myStepper.rotate(0);
myStepper.attachEnable( enaPin, 10, HIGH );
lcd.setCursor(0,1);
lcd.print(" E-Stop Rechts ");
dirR=true;
break;
default:
;
}
} else if ( clickTyp == DOUBLECLICK ) {
// ein Doppelclick wurde erkannt
switch ( tastIx ) {
case Taster1:
if(dirL)break;
myStepper.attachEnable( enaPin, 10, LOW );
myStepper.setRampLen( rampLen );
myStepper.rotate(1);
lcd.setCursor(0,1);
lcd.print(" Links ");
dirR=false;
break;
case Taster2:
if(dirR)break;
myStepper.attachEnable( enaPin, 10, LOW );
myStepper.setRampLen( rampLen );
myStepper.rotate(-1);
lcd.setCursor(0,1);
lcd.print(" Rechts ");
dirL=false;
break;
case Taster3:
myStepper.setRampLen( rampLen );
myStepper.rotate(0);
myStepper.attachEnable( enaPin, 10, HIGH );
lcd.setCursor(0,1);
lcd.print(" Stop ");
break;
default:
;
}
}
}
}