Hab mich wieder an meinen Hauptrechner gesetzt, den kompletten Sketch neu gestaltet, Anforderungen geändert, gestestet, und nur noch einen Fehler drin.
mein Buzzertaster(SpeedPedalSchalter) schaltet den Motor an bis er seine Strecke abgelaufen hat.
er soll aber als Totmanntaster funktionieren, also nur den Motor laufen lassen wenn er gedrückt ist.
vielen Dank erstmal an alle die mich inspiriert haben, es waren soviele neue Möglichkeiten, die ich erstmal verarbeiten musste.
Hier der komplette Sketch
// 03.08.2019 auf COM18
// Version 1.7 steps an DM542
// (800(5on,6off,7on,8on)) > aus
// (1600(5off,6off,7on,8on)) > aktiv
// (2000(5off,6on,7on,8off)) > aus
// Einschalten Stillstand ok; > Status0
// Voreinstellung der Länge ok; > kalibriert
// Cutter ok Länge ok Lauf ok; > Status1
// Geschwindigkeit-Voreinstellung ok; > kalibriert
// Buzzer ok Länge ok; Lauf ok; > Status2
//
// Version 1.7
// Gerät einschalten
// Befehl SET >> Button RUN drücken und POTI Gesamtlänge einstellen
// Befehl CUT >> Cutterhebel betätigen für Vorablänge und
// Befehl CUT >> Taster +/- für Einstellung Vorablänge
// Befehl Go >> Buzzertaster für Restlänge (Gesamtlänge - Vorlauflänge)
// Befehl Go >> Taster +/- für Einstellung Geschwindigkeit Restlänge
// TODO: Befehl Go von schalten auf Totmanntaster umstellen
// Regelpedal für Dauerlauf einbauen >dann Geschwindigkeit neu kalibrieren
#include <LiquidCrystal.h>
#include <AccelStepper.h>
LiquidCrystal mylcd(8, 9, 4, 5, 6, 7);
#define LCDdimmer 10
#define Brightness 200
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
#define DIR 2 // Endstufe: DIR grün
#define STEP 3 // Endstufe: Puls rot
#define ENABLE 12
//#define frei 11
AccelStepper stepper (1, 3, 2); // Driver 1, Step 3, Dir2)
int sens1;
int fake1;
int sens2;
int fake2;
int cms;
int Vorlauf; // LCD-switch case für Vorlauflänge
int SpeedPedalSensor = A1; // Sensor Eingang A1 für Speed-Pedal-Regler
int Cutter = 18; // Sensor Eingang A4 /D18 für Schalter
int SpeedPedalSchalter = 17; // Sensor Eingang A3 /D17 für Speed-Pedal-Schalter
int LaengenRegler = A2; // Sensor Eingang A2 für Längen-Regler
char Status;
char ascii[10]; //--------LCD-Anzeigeformat
int lcd_key = 0; //--------LCD-Buttons
int adc_key_in = 0;
//-------------------------------switch--case--LCD------------
int read_LCD_buttons() {
adc_key_in = analogRead(0);
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 250) return btnUP;
if (adc_key_in < 450) return btnDOWN;
if (adc_key_in < 650) return btnLEFT;
if (adc_key_in < 850) return btnSELECT;
return btnNONE;
}
void setup() {
pinMode(DIR, OUTPUT);
digitalWrite(DIR, HIGH);
pinMode(ENABLE, OUTPUT);
digitalWrite(ENABLE, LOW);
pinMode(STEP, OUTPUT);
digitalWrite(STEP, HIGH);
pinMode(LCDdimmer, INPUT);
pinMode(Cutter, INPUT);
pinMode(SpeedPedalSchalter, INPUT);
digitalWrite(LCDdimmer, LOW);
mylcd.begin(16, 2);
mylcd.setCursor(0, 0);
mylcd.print(" CUTTER-2NM ");
mylcd.setCursor(0, 1);
mylcd.print("V1.7 03.08.2019");
delay(3000);
mylcd.clear();
mylcd.setCursor(4, 0);
mylcd.print("Soll ");
mylcd.setCursor(13, 0);
mylcd.print(" mm");
mylcd.setCursor(4, 1);
mylcd.print("Vorab");
mylcd.setCursor(13, 1);
mylcd.print(" mm");
Vorlauf = 20;
mylcd.setCursor(10, 1);
mylcd.print (dtostrf(Vorlauf * 10, 3, 0, ascii));
Status = 0;
mylcd.setCursor(0, 0);
mylcd.print ("SET");
cms = 20;
mylcd.setCursor(0, 1);
mylcd.print (dtostrf(cms, 3, 0, ascii));
stepper.setMaxSpeed(4000);
stepper.setAcceleration(4000.0);
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
void loop() {
lcd_key = read_LCD_buttons();
switch (lcd_key) {
case btnUP: {
if (Status == 1) { //Vorlaufeinstellung
Vorlauf++;
Vorlauf = constrain(Vorlauf, 1, 100);
mylcd.setCursor(10, 1);
mylcd.print (dtostrf(Vorlauf * 10, 3, 0, ascii));
delay(500);
}
if (Status == 2) { //Geschwindigkeitseinstellung
cms++;
cms = constrain(cms, 1, 25);
mylcd.setCursor(0, 1);
mylcd.print (dtostrf(cms, 3, 0, ascii));
delay(500);
}
break; //Vorlaufeinstellung
}
case btnDOWN: {
if (Status == 1) {
Vorlauf--;
Vorlauf = constrain(Vorlauf, 1, 100);
mylcd.setCursor(10, 1);
mylcd.print (dtostrf(Vorlauf * 10, 3, 0, ascii));
delay(500);
}
if (Status == 2) { //Geschwindigkeitseinstellung
cms--;
cms = constrain(cms, 1, 25);
mylcd.setCursor(0, 1);
mylcd.print (dtostrf(cms, 3, 0, ascii));
delay(500);
}
break;
}
case btnRIGHT: {
//-------------------analogRead(A2)------LängeneinstellPoti------
sens2 = analogRead(LaengenRegler); // 0-1023 -> 0-265
fake2 = map(sens2, 0, 1023, 275, Vorlauf);
mylcd.setCursor(9, 0);
mylcd.print (dtostrf(fake2 * 10, 4, 0, ascii));
mylcd.setCursor(0, 0);
mylcd.print ("CUT");
Status = 1;
break;
}
}
//---------------------Status 0---RegelPedal auslesen----------------------
//-------------------analogRead(A1)------SpeedPedalSensor------------------
// sens1 = analogRead(SpeedPedalSensor); // 0-1023 -> 0-25 cms
// fake1 = map(sens2, 0, 1023, 0, 25);
//---------------------Status 1---Cutter auslesen--------------------------
if (Status == 1) {
if (digitalRead(18) == HIGH) { //Cutter betätigt
stepper.setMaxSpeed(2200);
stepper.setAcceleration(2200.0);
stepper.move(88.25 * Vorlauf); //Vorlauf setzen
delay(1500); //Wartezeit Cutter Rücksprung
mylcd.setCursor(0, 0);
mylcd.print ("GO ");
Status = 2;
}
else {
Status = 1;
}
}
//---------------------Status 2---Regellänge und Buzzer auslesen---------
if (Status == 2) {
if (digitalRead(17) == HIGH) { // Buzzer betätigt
stepper.setMaxSpeed(105 * cms);
stepper.setAcceleration(2500.0);
stepper.move(88.25 * (fake2 - Vorlauf));
mylcd.setCursor(0, 0);
mylcd.print ("CUT");
Status = 1;
}
else {
Status = 2;
}
}
stepper.run();
}