@michael_x
Im Gegensatz zur allgemeinen Auffassung hier, mag ich auch keinen “ganzen code”
Genau so sehe ich das auch, auch wenn ich mir selber keinen Gefallen damit tue.
Ich poste jetzt den ganzen Code, vielleicht hat jemand Lust mal drüber zu schauen und kann mir ein Tipp geben wo der Fehler sein könnte. Wie gesagt, klammere ich die lcd Befehle in der Schleife aus, läuft das ganze ohne Probleme. Alle Komponenten wurden getauscht, so das kein Hardwarefehler vorliegen kann.
Am Arduino ist ein Relay was zwei Motoren über ext. Stromquelle schaltet. Der Drehwertgeber hat 1 Meter bei 30717 Impulse und stoppt bei erreichter Länge die vorher per Keypad eingegeben wird.
// Seilwickler
// 26.08.2015
// Library
#include <Wire.h> // Display
#include <rgb_lcd.h> // Display
#include <Keypad.h> // Keypad
#include <Encoder.h> // Encoder
#include <SoftReset.h> // Softreset
// Komponente Arduino Pin Komponenten Pin
// Motorrelay Digital 7,8 Pin IN1,IN2 (Motor 1 und Motor 2)
// Display Analog SDA, SCL Pin SDA,SCL identisch
// Keypad Digital 0,10,11,13,5,6,9 Pin 5,4,6,2,8,7,3 (Keypad umdrehen, Pins nach oben, links ist der unbenutze 1, rechts 8)
// Speaker Digital AO Pin beliebig, der andere auf GND
// Encoder Digital 2,3 weiß, grün (Rot +5V, Schwarz GND)
// Display
rgb_lcd lcd;
// Keypad
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {0, 10, 9, 13};
byte colPins[COLS] = {5, 6, 11};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int currentPosition = 0;
int METER[5];
int i = 0;
// Sensor
int COUNTER = 0;
int UMDREHUNG = 0;
// Encoder
Encoder myEnc(2, 3);
long IMPULS = 0;
long STOPIMPULS = 0;
// Speaker
int Speaker = 14;
// Motorrelay
int MOTOR = 7;
// Allgemein
int LAUFLAENGE = 0;
int LAUFZEIT = 0;
// Speaker
int tones[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440};
// mid C C# D D# E F F# G G# A
int keya[] = {1336, 1209, 1336, 1477, 1209, 1336, 1477, 1209, 1336, 1477, 1209, 1336, 1477};
int keyb[] = {941, 697, 697, 697, 770, 770, 770, 852, 852};
int TON = 0;
void setup() {
Serial.begin(9600);
// Display
lcd.begin(16, 2); // Zeilen und Höhe definieren
lcd.setRGB(100, 149, 237); // RGB Farben Hintergrundbeleuchtung
// Motorrelay
pinMode(7, OUTPUT);
digitalWrite(7, HIGH);
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
// Ton
pinMode(Speaker, OUTPUT);
// Display
lcd.print(" Seilwickler");
lcd.setCursor(0,1);
lcd.print("1=klein 2=gross ");
char key = keypad.waitForKey();
tone(Speaker, 941, 100);
if (key == '2') {
MOTOR = 8;
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("0 Meter");
// Keypad
keypad.addEventListener(keypadEvent); // Callback definieren
displayEingabeMeter();
}
void loop() {
char key = keypad.getKey();
}
void keypadEvent(KeypadEvent key){
switch (keypad.getState()){
case PRESSED:
if (currentPosition == 9) {
digitalWrite(MOTOR, HIGH);
tone(Speaker, 221, 2000);
lcd.clear();
lcd.print("Abbruch");
LAUFZEIT = COUNTER;
STOPIMPULS = 0;
delay(5000);
currentPosition = 0;
displayEingabeMeter();
break;
}
if (key == '*') {
tone(Speaker, 221, 100);
lcd.setCursor(6,1);
lcd.print(" ");
lcd.setCursor(6,1);
if (currentPosition == 0 ) {
LAUFLAENGE = 0;
}
currentPosition = 0;
displayEingabeMeter();
break;
}
if (key == '#') {
STARTMOTOR();
break;
}
if (currentPosition == 0) {
if (key == '0') {
tone(Speaker, 221, 100);
lcd.setCursor(6,1);
lcd.print(" ");
lcd.setCursor(6,1);
currentPosition = 0;
break;
}
METER[0] = (key)-48;
lcd.print(key);
lcd.setCursor(7,1);
currentPosition++;
tone(Speaker, 941, 100);
break;
}
if (currentPosition == 1) {
METER[1] = (key)-48;
lcd.print(key);
lcd.setCursor(8,1);
currentPosition++;
tone(Speaker, 941, 100);
break;
}
if (currentPosition == 2) {
METER[2] = (key)-48;
lcd.print(key);
lcd.setCursor(9,1);
currentPosition++;
tone(Speaker, 941, 100);
break;
}
if (currentPosition == 3) {
METER[3] = (key)-48;
lcd.print(key);
lcd.setCursor(10,1);
currentPosition++;
tone(Speaker, 941, 100);
break;
}
}
}
void STARTMOTOR()
{
lcd.noBlink();
STOPIMPULS = 0;
IMPULS = 0;
myEnc.write(0);
LAUFZEIT = 0;
COUNTER = 0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
int z;
z = 0;
while(z<currentPosition) {
LAUFZEIT = 10*LAUFZEIT+METER[z];
z++;
}
if (LAUFZEIT == 9999){
lcd.print("Neustart...");
tone(Speaker, 1041, 1000);
delay(1000);
soft_restart();
}
lcd.print(LAUFZEIT);
lcd.print(" Meter werden");
lcd.setCursor(0,1);
lcd.print("gestartet...");
delay(100);
tone(Speaker, 941, 100);
delay(500);
tone(Speaker, 941, 100);
delay(500);
tone(Speaker, 941, 100);
delay(500);
tone(Speaker, 1041, 400);
delay(1000);
currentPosition = 0;
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(LAUFLAENGE);
lcd.print(" Meter");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("0/");
lcd.print(LAUFZEIT);
lcd.print(" Meter");
lcd.setCursor(0,1);
int COUNTERALT = 0;
currentPosition = 9;
STOPIMPULS = LAUFZEIT * 30717L;
digitalWrite(MOTOR, LOW);
while (COUNTER < LAUFZEIT) {
char key = keypad.getKey();
IMPULS = myEnc.read();
if (30717 < IMPULS) {
Serial.print("COUNTER: ");
Serial.println(COUNTER);
COUNTER++;
myEnc.write(0);
lcd.setCursor(0,0);
LAUFLAENGE++;
Serial.print("LAUFLAENGE: ");
Serial.println(LAUFLAENGE);
lcd.print(LAUFLAENGE);
lcd.print(" Meter");
lcd.setCursor(0,1);
lcd.print(COUNTER);
lcd.print("/");
lcd.print(LAUFZEIT);
lcd.print(" Meter");
Serial.print("LAUFZEIT: ");
Serial.println(LAUFZEIT);
}
}
digitalWrite(MOTOR, HIGH);
tone(Speaker, 1041, 200);
delay(400);
tone(Speaker, 1041, 200);
delay(400);
tone(Speaker, 1041, 200);
delay(400);
COUNTER = 0;
currentPosition = 0;
displayEingabeMeter();
}
void displayEingabeMeter()
{
COUNTER = LAUFZEIT;
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(LAUFLAENGE);
lcd.print(" Meter");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Meter:");
lcd.blink();
}