// Include libs
#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
#include "Wire.h"
#include <AccelStepper.h>
#include "ESPRotary.h"
#include "Button2.h"
// Include Header Files
#include "configuration.h"
#include "globals.h"
#include "rotary_encoder.h"
#include "lcd_Display.h"
#include "stepper.h"
#include "my_eeprom.h"
ESPRotary r; // Rotary Encoder Instanz erstellen
Button2 btn_rotary; // Btn2 Instanz für Button am Rotary erstellen
//LCDDisplay lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
LCDDisplay lcd; // LCD Display Instanz erstellen
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
AccelStepper unipolar(MotorInterfaceType_unipolar, IN1_PIN, IN3_PIN, IN2_PIN, IN4_PIN); // Unipolar Stepper Motor Intsanz erstellen
AccelStepper bipolar(MotorInterfaceType_bipolar, stepPin, dirPin); // Bipolar Stepper Motor Intsanz erstellen
// Status Menue Position
byte MENUE_POS = MENUE_HAUPTANZEIGE;
// Je loop wird der Entsprechende Step ausgefährt
byte loop_step = 0;
//uint32_t previousMillis;
unsigned long previousMillis;
boolean eingabe_aktiv = false;
boolean spoolen_aktiv = false;
boolean winder_in_startposition = true;
boolean winder_aktiv = false;
boolean spoolen_stop_aktiv = false;
boolean speed_fast_aktiv = false;
boolean manuell_aktiv = false;
byte unipolar_EnPin = LOW; // HIGH = ON / LOW = OFF
byte bipolar_EnPin = LOW; // HIGH = ON / LOW = OFF
// Nema Stepper wird bei High = OFF und Low = ON
// digitalWrite(EnPin, HIGH);
long spulen_sollwert = 0; // mm Menue 0 nur Anzeige und Menue 1 für Eingabe
long spulen_istwert = 0; // step Menue 0 nur Anzeige, Menue 2 für vor und zurück bewegen und Menue 7 RESET
long winder_istwert = 0; // mm Menue 3
long winder_startposition = 0; // mm Ausgangsposition für Winder
int spulen_breite = 50; // mm Menue 4 Endposiotion für Winder
int spulen_durchmesser = 75; // mm Menue 5
byte bipolar_one_rotation = 2; // Menue 13
double spule_istposition = 0.00; // Variable zum Berechen von Schritte in mm
int spule_windungen = 0; // Anzahl an Umdrehungen
// Vorgabewerte werden im EEprom gespeichert und können geändert werden
byte bipolar_speed_slow = 10;
byte bipolar_speed_fast = 40;
byte unipolar_speed_slow = 10;
byte unipolar_speed_fast = 90;
byte unipolar_speed_spoolen = 70;
byte stepper_acceleration = 50;
byte display_refresh_delay = 200;
void setup() {
//Serial.begin(9600);
// bipolar Stepper Motor bei Prog. Start Ausschalten
pinMode(EnPin, OUTPUT);
digitalWrite(EnPin, HIGH); // OFF
pinMode(Endstop, INPUT_PULLUP);
eeprom_laden();
// LCD Display Initialisieren
lcd.init();
lcd.backlight();
lcd.custom_character();
lcd.display_print();
lcd.display_run_stop();
// Rotary Encoder Initialisieren
r.begin(ROTARY_PIN1, ROTARY_PIN2, CLICKS_PER_STEP);
r.setChangedHandler(rotate);
// Rotary Encoder Btn Initialisieren
btn_rotary.begin(BUTTON_PIN);
btn_rotary.setLongClickTime(250);
btn_rotary.setClickHandler(click);
btn_rotary.setLongClickDetectedHandler(longClick);
set_stepper_Acceleration();
}
void loop() {
r.loop();
btn_rotary.loop();
switch (loop_step) {
case 0:
// unipolar Stepper run bis Ziel erreicht
if (unipolar.distanceToGo() != 0 && digitalRead(Endstop) == HIGH) unipolar.run();
if (manuell_aktiv == true && unipolar.distanceToGo() == 0) unipolar_off();
loop_step++;
break;
case 1:
// bipolar Stepper run bis Ziel erreicht
if (bipolar.distanceToGo() != 0) bipolar.run();
if (manuell_aktiv == true && bipolar.distanceToGo() == 0) bipolar_off();
loop_step++;
break;
case 2:
if (spoolen_aktiv == true) {
//spulen_istwert = bipolar.currentPosition();
//spule_istposition = berechne_spulen_istposition_in_mm();
berechen_spulen_positon_werte();
if (spule_istposition >= spulen_sollwert || spoolen_stop_aktiv == true) {
bipolar_off();
//unipolar_off();
spoolen_aktiv = false;
spoolen_stop_aktiv = false;
lcd.display_run_stop();
//spulen_istwert = bipolar.currentPosition();
//spule_istposition = berechne_spulen_istposition_in_mm();
berechen_spulen_positon_werte();
winder_istwert = unipolar.currentPosition() / unipolar_one_rotation;
} else {
bipolar.move(1);
bipolar.setMaxSpeed(bipolar_speed_fast * 10);
}
}
loop_step++;
break;
case 3:
if (spoolen_aktiv == true) {
winder_istwert = unipolar.currentPosition() / unipolar_one_rotation;
if (winder_in_startposition == true) {
if (winder_istwert <= (spulen_breite + winder_startposition)) {
unipolar.move(unipolar_one_rotation);
unipolar.setMaxSpeed(unipolar_speed_spoolen * 10);
} else {
winder_in_startposition = !winder_in_startposition;
spule_windungen++;
}
}
if (winder_in_startposition == false) {
if (winder_istwert >= winder_startposition) {
unipolar.move(-unipolar_one_rotation);
unipolar.setMaxSpeed(unipolar_speed_spoolen * 10);
} else {
winder_in_startposition = !winder_in_startposition;
spule_windungen++;
}
}
} else {
if (winder_aktiv == true) {
if (unipolar.distanceToGo() == 0) {
unipolar_off();
winder_aktiv = !winder_aktiv;
}
}
}
loop_step++;
break;
case 4: // letzter loop
if (millis() - previousMillis >= (display_refresh_delay * 10)) {
previousMillis = millis();
if (MENUE_POS == MENUE_HAUPTANZEIGE) {
//spulen_istwert = bipolar.currentPosition();
//spule_istposition = berechne_spulen_istposition_in_mm();
berechen_spulen_positon_werte();
lcd.display_print_value(spule_istposition);
}
}
loop_step = 0;
break;
}
}