sorry Tommy56 & postmaster-ino, hier mal der vollständige Sketch
#include "AccelStepper.h" // AccelStepper Library
#include <Keypad.h> // Keypad Library
#include <Wire.h> // I2C Bus Library
#include <LiquidCrystal_I2C.h> // LCD Library
LiquidCrystal_I2C lcd(0x27,20,4); // Adress for LCD
// Variables to hold entered number on Keypad
volatile int firstnumber=99; // used to tell how many numbers were entered on keypad
volatile int secondnumber=99;
volatile int thirdnumber=99;
// Variables to hold Distance and CurrentPosition
int keyfullnumber=0; // used to store the final calculated distance value
String currentposition = ""; // Used for display on LCD
// Keypad Setup
const byte ROWS = 4; // Four Rows
const byte COLS = 4; // Four Columns
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2,3,4,5}; // Arduino pins connected to the row pins of the keypad
byte colPins[COLS] = {8,9,10,11}; // Arduino pins connected to the column pins of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Keypad Library definition
// AccelStepper Setup
AccelStepper stepper(1, A0, A1); // 1 = Easy Driver interface
// Arduino A0 connected to STEP pin of Easy Driver
// Arduino A1 connected to DIR pin of Easy Driver
void setup(void) {
{
lcd.init(); // initiate LCD
lcd.begin(20,4); // start LCD
lcd.backlight(); // turn LCD backlight on
}
// AccelStepper speed and acceleration setup
stepper.setMaxSpeed(1200); // Not to fast or you will have missed steps
stepper.setAcceleration(600); // Same here
// Draw starting screen on LCD
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("NC Drehachse");
lcd.setCursor(0,1);
lcd.print("--------------------");
lcd.setCursor(1,2);
lcd.print("Indexer Ver. 1.12"); // only shown at power on
delay(2000);
lcd.setCursor(1,2);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("Winkeleingabe:");
lcd.setCursor(19,2);
lcd.write(0xDF);
lcd.setCursor(1,3);
lcd.print("Aktuelle Pos:");
lcd.setCursor(19,3);
lcd.write(0xDF);
}
}
void loop(){
char keypressed = keypad.getKey(); // Get value of keypad button if pressed
if (keypressed != NO_KEY){ // If keypad button pressed check which key it was
switch (keypressed) {
case '1':
checknumber(1);
break;
case '2':
checknumber(2);
break;
case '3':
checknumber(3);
break;
case '4':
checknumber(4);
break;
case '5':
checknumber(5);
break;
case '6':
checknumber(6);
break;
case '7':
checknumber(7);
break;
case '8':
checknumber(8);
break;
case '9':
checknumber(9);
break;
case '0':
checknumber(0);
break;
case '*':
deletenumber();
break;
case '#':
calculatedistance();
break;
case 'A': //defines key to turn motor permanently
turnmotor();
break;
case 'B': //defines key to stop motor
stopmotor();
break;
}
}
}
void checknumber(int x){
if (firstnumber == 99) { // Check if this is the first number entered
firstnumber=x;
String displayvalue = String(firstnumber); // Transform int to a string for display
lcd.setCursor(16,2);
lcd.print(displayvalue);
} else {
if (secondnumber == 99) { // Check if it's the second number entered
secondnumber=x;
String displayvalue = (String(firstnumber) + String(secondnumber));
lcd.setCursor(16,2);
lcd.print(displayvalue);
} else { // It must be the 3rd number entered
thirdnumber=x;
String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber));
lcd.setCursor(16,2);
lcd.print(displayvalue);
}
}
}
void deletenumber() { // Used to backspace entered numbers
if (thirdnumber !=99) {
String displayvalue = (String(firstnumber) + String(secondnumber));
lcd.setCursor(15,2);
lcd.print(" "); // clears LCD area for new displayvalue / delete third number
lcd.setCursor(16,2);
lcd.print(displayvalue);
thirdnumber=99;
}
else {
if (secondnumber !=99) {
String displayvalue = String(firstnumber);
lcd.setCursor(15,2);
lcd.print(" "); // clears LCD area for new displayvalue / delete second number
lcd.setCursor(16,2);
lcd.print(displayvalue);
secondnumber=99;
}
else {
if (firstnumber !=99) {
String displayvalue = "";
lcd.setCursor(15,2);
lcd.print(" "); // clears LCD area for new displayvalue / delete first number
lcd.setCursor(16,2);
lcd.print(displayvalue);
firstnumber=99;
}
}
}
}
void calculatedistance() { // Used to create a full number from entered numbers
if (thirdnumber == 99 && secondnumber == 99 && firstnumber != 99) {
keyfullnumber=firstnumber;
movestepper(keyfullnumber);
}
if (secondnumber != 99 && thirdnumber == 99) {
keyfullnumber=(firstnumber*10)+secondnumber;
movestepper(keyfullnumber);
}
if (thirdnumber != 99) {
keyfullnumber=(firstnumber*100)+(secondnumber*10)+thirdnumber;
movestepper(keyfullnumber);
}
resetnumbers(); // Reset numbers to get ready for new entry
}
void movestepper(float z) { // Move the stepper
float calculatedmove=((z*1600*4)/360); // Calkulate Steps/°(z * 1600 Microsteps * Gear ratio)/ 360° ...
stepper.runToNewPosition(calculatedmove);
currentposition = int(z); // change z into an int to display on LCD an even Number,
{
lcd.setCursor(15,2);
lcd.print(" "); // clears LCD area to reset numbers for next entry
lcd.setCursor(14,3);
lcd.print(" "); // clears LCD area to display next current position
lcd.setCursor(16,3);
lcd.print(currentposition);
}
}
void resetnumbers() { // Reset numbers for next entry
firstnumber=99;
secondnumber=99;
thirdnumber=99;
}
void turnmotor(){
int steps=1;
stepper.setMaxSpeed(300);
do{
int turn=(steps++);
stepper.moveTo(turn);
stepper.run();
}while(stopmotor);
}
void stopmotor(){
stepper.setCurrentPosition(0);
stepper.stop();
}
Ich hoffe, so ist es richtig mit dem Code....
@postmaster-ino
eigentlich lasse ich mir die Fehler schon anzeigen. Hat mir schon des öfteren geholfen, ein vergessenes Semikolon oder eine vergessene Klammer zu setzen. Bei diesem Sketch hat der Compiler nicht gemeckert. Da dachte ich .... nun gut, dann mal hoch auf den Uno damit.
Wie schon erwähnt, funktioniert soweit alles bis auf das Stoppen des Motors
LG
Michael