Liebes Forum,
ich habe folgendes Problem welches ich einfach nicht gelöst bekomme:
Ich steuere mit dem Arduino (NANO, V3, CH340, IDE 1.8.0) einen DC Motor (ca. 200 rpm ). Eine Lichtschranke zählt die Umdrehungen und gibt den Wert auf einem LCD ( Hier LCD mit Keypad Board) weiter. Ein Schalter startet den Motor über ein Relais. Die Lichtschranke zählt bis ein bestimmter Wert an Umdrehungen erreicht ist und dreht dann über das Schalten eines zweiten Relais rückwärts für einen Wert an Umdrehungen und stoppt dann den Motor. Die Werte für die Umdrehungen können über Tasten verändert werden.
Das Problem ist, dass der Arduino zu viele Umdrehungen zählt und den Motor entsprechend zu früh stoppt. Auf dem LCD sieht man, dass sozusagen Zahlen übersprungen werden - 21, 22, 23, 25, 26 ... Ich habe mein Sketch auf Verzögerungen geprüft finde aber nichts, ich vermute es hängt mit dem debouncen zusammen.
Irgendwie komme ich nicht weiter, vielleicht finden ja hier einer den Fehler.
Vielen Dank im Vorraus
Code: (entschuldigt meine schlecht Programmierung bin Neuling
*WICHTIG
* LCDKeypad shield is quite common and popular. It includes 16x2 HD44780 compatible LCD and 5 push buttons. Pins 4, 5, 6, 7, 8, 9 are used to interface with the LCD. Backlight on/off function is controlled via pin 10. Analog pin 0 is used to read the buttons.
LCD und tastn so anschließen.
LCDKeypad Arduino library
https://github.com/dzindra/LCDKeypad
Copyright 2014 Jindřich Doležy (jindrich@dolezy.cz)
based on the code by fj604 from http://forum.arduino.cc/index.php?topic=38061.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#include <LiquidCrystal.h>
#include <LCDKeypad.h>
LCDKeypad lcd;
const int zahlerPin = 2;
const int schalter1 = 3;
const int LEDpin = 13;
int relay1 = 11;
int relay2 = 12;
int zahlerState = 0;
int zahler = 0;
int zahlerStateHIGH = 0;
int ziel = 52;//Zaeler Wert der erreicht werden soll Vorwarts
//boolean relayState = false;
int relay1State = 0;
int backrpm = 3;//Zaeler Wert der erreicht werden soll Rueckwaerts
int menu = 0;
int ziel2 = ziel;//Zaeler Wert brrechnet
void setup() {
lcd.begin(16,2);
lcd.clear();
lcd.print("");// TEXT
lcd.setCursor(0,1);
lcd.print(""); // TEXT
delay(1000);
lcd.clear();
lcd.print("");//TEXT
pinMode(zahlerPin, INPUT);
// Serial.begin(9600);
// initialize digital pin LED_BUILTIN as an output.
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(schalter1, INPUT);
pinMode(LEDpin, OUTPUT);
}
static int counter = 0;
void loop() {
// use buttonBlocking in menus or other cases
// when you need repeated and debounced key presses
// key direction will be returned once only for each blocking period (default 500ms)
switch (lcd.buttonBlocking()) {
case KEYPAD_LEFT:
counter -= 10;
menu = !menu;
break;
case KEYPAD_RIGHT:
counter += 10;
lcd.setCursor(0,1);
lcd.print(" ");
zahler=0;
break;
case KEYPAD_DOWN:
counter += 1;
if(menu==1){
ziel--;
}else{
backrpm--;
}
break;
case KEYPAD_UP:
counter -= 1;
if(menu==1){
ziel++;
}else{
backrpm++;
}
break;
case KEYPAD_SELECT:
counter = 0;
relay1State = !relay1State;
break;
}
// lcd.setCursor(9,0);
// lcd.print(counter);
// lcd.print(" ");
zahlerState = digitalRead(zahlerPin);
if (zahlerState == HIGH)
{
zahlerStateHIGH = 1;
}
if (zahlerState == LOW && zahlerStateHIGH == 1)
{
zahler++;
zahlerStateHIGH = 0;
}
// Serial.println(counter);
lcd.setCursor(0,1);
lcd.print(zahler);
lcd.setCursor(5,1);
lcd.print(ziel);
lcd.setCursor(9,1);
lcd.print(backrpm);
if(zahler>=ziel)
{
digitalWrite(relay1, LOW); // turn the relay1 on (HIGH is the voltage level)
lcd.setCursor(12,1);
lcd.print("AUS");
relay1State = 0;
}
else
{
//digitalWrite(relay1, LOW); // turn the LED off by making the voltage LOW
lcd.setCursor(12,1);
lcd.print("EIN");
// do Thing C
}
if (relay1State==HIGH){
digitalWrite(relay1, HIGH); // turn the relay1 on (HIGH is the voltage level)
}
else{
digitalWrite(relay1, LOW); // turn the LED off by making the voltage LOW
}
lcd.setCursor(8,0);
lcd.print(relay1State);
//--------------------Relay 2 Schalten---------------
ziel2=ziel + backrpm;
lcd.setCursor(0,0);
lcd.print(ziel2);
if(zahler>=ziel && zahler<=ziel2){
digitalWrite(relay2, HIGH); // relay 2 ein
lcd.setCursor(12,0);
lcd.print("EIN");
}
else{
digitalWrite(relay2, LOW); // relay 2 aus
lcd.setCursor(12,0);
lcd.print("AUS");
}
int buttonState = digitalRead(schalter1);
if(buttonState==HIGH){
digitalWrite(LEDpin, HIGH);
digitalWrite(relay2, HIGH); // relay 2 ein
}
else{
digitalWrite(LEDpin, LOW);
//digitalWrite(relay2, LOW); // relay 2 aus
}
}











