Archiv verlassen und diese Seite im Standarddesign anzeigen : Drucktaster einbinden mit der OneButton Library
Ferdinand
18.08.2018, 14:33
Hallo ich habe ein kleines Problem mit der Lib von https://www.makerblog.at/2015/01/arduino-und-pushbuttons-drucktaster-einbinden-mit-der-onebutton-library/#comment-3895
ich bekomme mein Programm nicht zum laufen
/*
Analog Input
*/
#include "OneButton.h"
#define MOTOR_1 2
#define MOTOR_2 4
#define POTI A0
#define PWM 9
#define TASTER 5
#define LED 3
OneButton button(TASTER, true);
//int poti = A0; // select the input pin for the potentiometer
int poti_Value = 0; // variable to store the value coming from the sensor
int poti_prozent = 0;
bool sicherheit = 1;
void setup() {
// declare the ledPin as an OUTPUT:
//pinMode(ledPin, OUTPUT);
Serial.begin(9600);
//pinMode(MOTOR_1,OUTPUT);
//pinMode(MOTOR_2,OUTPUT);
pinMode(LED,OUTPUT);
pinMode(TASTER,INPUT_PULLUP);
pinMode(MOTOR_1,OUTPUT);
pinMode(MOTOR_2,OUTPUT);
pinMode(PWM,OUTPUT);
digitalWrite(LED, LOW);
poti_prozent = 4;
// Sicherheitsschaltung Poti auf 0 und Motor Aus
//poti_Value = analogRead(POTI);
//poti_prozent = map(poti_Value, 0,1023, 0,100);
pinMode(TASTER, INPUT);
button.attachClick(clickedIt);
//button.attachDoubleClick(doubleClickedIt);
while( poti_prozent >= 3 )
{
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(300);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
digitalWrite(LED, LOW);
delay(300);
}
}
void loop() {
button.tick();
int pwmSpeed;
void clickedIt() {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
// Poti Regelbereich
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
//delay(1000);
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
// Drehrichtung Links
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, LOW);
// Drehrichtung Rechts
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, HIGH);
//digitalWrite(LED, HIGH);
//delay(1000);
// ENDE
}
Folgende Meldung
Arduino: 1.8.5 (Windows 7), Board: "Arduino Nano, ATmega328P (Old Bootloader)"
C:\Users\Ferdinand\Documents\Arduino\Drehzahlregel ung\Drehzahlregelung_2\Drehzahlregelung_2.ino\Dreh zahlregelung_2.ino.ino: In function 'void setup()':
Drehzahlregelung_2.ino:43: error: 'clickedIt' was not declared in this scope
button.attachClick(clickedIt);
^
C:\Users\Ferdinand\Documents\Arduino\Drehzahlregel ung\Drehzahlregelung_2\Drehzahlregelung_2.ino\Dreh zahlregelung_2.ino.ino: In function 'void loop()':
Drehzahlregelung_2.ino:71: error: a function-definition is not allowed here before '{' token
void clickedIt() {
^
Drehzahlregelung_2.ino:74: error: 'else' without a previous 'if'
else {
^
exit status 1
'clickedIt' was not declared in this scope
Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.
- - - Aktualisiert - - -
ich habe das Programm mal vorerst fertiggemacht
/*
Analog Input
*/
#include "OneButton.h"
#define MOTOR_1 2
#define MOTOR_2 4
#define POTI A0
#define PWM 9
#define TASTER 5
#define LED 3
OneButton button(TASTER, true);
//int poti = A0; // select the input pin for the potentiometer
int poti_Value = 0; // variable to store the value coming from the sensor
int poti_prozent = 0;
bool sicherheit = 1;
void setup() {
// declare the ledPin as an OUTPUT:
//pinMode(ledPin, OUTPUT);
Serial.begin(9600);
//pinMode(MOTOR_1,OUTPUT);
//pinMode(MOTOR_2,OUTPUT);
pinMode(LED,OUTPUT);
pinMode(TASTER,INPUT_PULLUP);
pinMode(MOTOR_1,OUTPUT);
pinMode(MOTOR_2,OUTPUT);
pinMode(PWM,OUTPUT);
digitalWrite(LED, LOW);
poti_prozent = 4;
// Sicherheitsschaltung Poti auf 0 und Motor Aus
//poti_Value = analogRead(POTI);
//poti_prozent = map(poti_Value, 0,1023, 0,100);
pinMode(TASTER, INPUT);
button.attachClick(clickedIt);
//button.attachDoubleClick(doubleClickedIt);
while( poti_prozent >= 3 )
{
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(300);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
digitalWrite(LED, LOW);
delay(300);
}
}
void loop() {
button.tick();
int pwmSpeed;
void clickedIt() {
// LED Drehrichtung Links
digitalWrite(LED, HIGH);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
// Drehrichtung Links
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, LOW);
}
else {
// LED Drehrichtung Rechts
digitalWrite(LED, LOW);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
// Drehrichtung Rechts
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, HIGH);
}
}
hallo,
void clickedIt() {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
was mir hier auffällt:
das scheint eine eigenständige Funktion zu sein, die müsste dann außerhalb von loop stehen - oder was ist das?
ich kenne allerdings auch deine "OneButton.h" nicht.
Ferdinand
18.08.2018, 15:36
es scheint das irgendwas mit der einbindung der "OneButton.h" nicht inordnung ist
HaWe hat Recht, denke ich. void clickedIt() steht innerhalb von loop() und wird aber auch in setup() aufgerufen. Das void clickedIt() müsste wohl ausserhalb loop() und setup() stehen.
Ferdinand
18.08.2018, 17:04
Ja stimmt er hat rechtgehabt das mit dem taster funktionirt jetz aber der motor leuft noch nicht keine ahnung warum
/*
Analog Input
*/
#include "OneButton.h"
#define MOTOR_1 A2
#define MOTOR_2 A4
#define POTI A0
#define PWM 9
#define TASTER 5
#define LED 3
void clickedIt();
OneButton button(TASTER, true);
//int poti = A0; // select the input pin for the potentiometer
int poti_Value = 0; // variable to store the value coming from the sensor
int poti_prozent = 0;
bool sicherheit = 1;
void setup() {
// declare the ledPin as an OUTPUT:
//pinMode(ledPin, OUTPUT);
Serial.begin(9600);
//pinMode(MOTOR_1,OUTPUT);
//pinMode(MOTOR_2,OUTPUT);
pinMode(LED,OUTPUT);
//pinMode(TASTER,INPUT_PULLUP);
pinMode(MOTOR_1,OUTPUT);
pinMode(MOTOR_2,OUTPUT);
pinMode(PWM,OUTPUT);
digitalWrite(LED, LOW);
poti_prozent = 4;
// Sicherheitsschaltung Poti auf 0 und Motor Aus
//poti_Value = analogRead(POTI);
//poti_prozent = map(poti_Value, 0,1023, 0,100);
//pinMode(TASTER, INPUT);
button.attachClick(clickedIt);
//button.attachDoubleClick(doubleClickedIt);
while( poti_prozent >= 3 )
{
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(300);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
digitalWrite(LED, LOW);
delay(300);
}
}
bool Drehrichtung = true;
void loop() {
button.tick();
void clickedIt();
int pwmSpeed;
//delay(200);
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
delay(200);
if(Drehrichtung == true)
{
button.tick();
void clickedIt();
// LED Drehrichtung Rechts
digitalWrite(LED, LOW);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
// Drehrichtung Rechts
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, HIGH);
}
else
{
button.tick();
void clickedIt();
// LED Drehrichtung Links
digitalWrite(LED, HIGH);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
// Drehrichtung Links
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, LOW);
}
}
void clickedIt()
{
Drehrichtung = !Drehrichtung;
}
ich denke da #define MOTOR_1 A2 #define MOTOR_2 A4 past was nicht
Danke
Da sind noch so einige Ungereimtheiten Ferdinand
Schönheitsrepartur:
Du hast eine "Forward Deklaration" für die Funktion
clickedIt() gemacht.
das benötigst Du normalerweise nicht.
Deine Funktion clickedIt()
muss einfach ganz nach oben hin.
Dann rufst Du die Funktion mit void auf,
staune das er da nicht meckert, sieht auf jeden Fall ungewöhnlich aus....
Also den Aufruf der Funktion bitte ohne void
wie das mit den buttons genau funktioniert weis ich nicht,
aber ich vermute mal, dass durch den Aufruf von
button.attachClick(clickedIt); in der Setup Funktion
bei einem Tastendruck automatisch die entsprechende Funktion aufgerufen wird.
somit darfst Du dann nicht mehr zusätzlich clickedIt in deinef Loop aufrufen.
Vermutlich musst Du nur immer wieder die Funktion
button.tick(); in deiner Schleife aufrufen.
Da steck ich aber im Detail nicht drin, das ist nur eine Vermutung von mir.
In der eigentlichen Hauptschleife, das scheint ja die Loop zu sein
setzt Du am Anfang deine beiden Motorbits auf High
dann folgt deine Abfrage Drehrichtung und dort setzt Du die Motorbits entsprechend,
danach landet aber die Software wieder oben und setzt die Motorsignale wieder beide auf High.
damit werden alle 200ms deine Signale beide High, das gibt so nicht wirklich Sinn.
Wie dem auch sei,
ich hab mal einiges umgebaut,
ich kann das weder compilieren noch testen,
das soll lediglich ein Anhaltspunkt sein
wie man es vermutlich machen kann:
-------------
#include "OneButton.h"
#define MOTOR_1 A2
#define MOTOR_2 A4
#define POTI A0
#define PWM 9
#define TASTER 5
#define LED 3
OneButton button(TASTER, true); // wird hier eine Instanz eines Buttons kreiert ??
int poti_prozent = 0;
bool sicherheit = 1;
bool Drehrichtung = true;
//-------------------------------------------------------
// das ist vermutlich die Funktion die automatisch aufgerufen wird
// was Du durch button.attachClick(clickedIt); festgelegt hast.
// Dies Funktion muss vermutlich nie wieder aufgerufen werden.
void clickedIt()
{
Drehrichtung = ! Drehrichtung;
}
//-------------------------------------------------------
// hier wird die LED entsprechend der Drehrichtung gesetzt
// und die beiden benötigten Motorbits entsprechend der Richtung
void SetDirection(void)
{
if (Drehrichtung) // rechts
{
digitalWrite(LED, LOW); // LED Rechts
digitalWrite(MOTOR_1, LOW); // Motor rechts
digitalWrite(MOTOR_2, HIGH);
}
else // links
{
digitalWrite(LED, HIGH; // LED Links
digitalWrite(MOTOR_1, HIGH); // Motor links
digitalWrite(MOTOR_2, LOW);
}
}
//-------------------------------------------------------
// Motor Geschwindigkeit setzen
void SetSpeed(void)
{ int poti_Value ;
poti_Value = analogRead(POTI); // Potiwert lesen
poti_prozent = map(poti_Value, 0,1023, 0,100); // umrechnen
analogWrite(PWM, poti_Value / 4); // Pulsbreite setzen
}
//-------------------------------------------------------
// alle 500ms, also 2 mal pro Sekunde, sollen die Werte ueber die RS232 gesendet werden
void SendData(void)
{ static int tim;
delay(10); // eine definierte Zeit warten, ich nehm mal 10ms
if (tim++ < 50) return; // wenn Zeit kleiner als 500ms , dann nichts tun
tim=0; // ansonsten Zeitwert wieder auf 0 setzen und senden
// Die Drehrichtung senden
Serial.print("Richtung : ");
if (Drehrichtung) Serial.println("rechts");
else Serial.println("links");
// Den Potiwert in Prozent senden
Serial.print("Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
}
//-------------------------------------------------------
void setup()
{
pinMode(LED , OUTPUT);
pinMode(MOTOR_1, OUTPUT);
pinMode(MOTOR_2, OUTPUT);
pinMode(PWM , OUTPUT);
pinMode(TASTER , INPUT);
pinMode(TASTER,INPUT_PULLUP); // den braucht man eventuell
button.attachClick(clickedIt); // Die Click Funktion setzen
Serial.begin(9600); // RS232 initialisieren
// deine Startup Funktion lass ich mal so stehen, wie sie war.....
poti_prozent = 4;
while( poti_prozent >= 3 )
{
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(300); poti_Value = analogRead(POTI);poti_prozent = map(poti_Value, 0,1023, 0,100);
digitalWrite(LED, LOW);
delay(300);
}
}
//---------------------------------------
// Die Hauptschleife ist nun etwas übersichtlicher geworden:
void loop()
{
button.tick();
SetDirection();
SetSpeed();
SendData();
}
Ferdinand
19.08.2018, 02:46
Vielen Dank für die Anregungen und Hilfe Stellung war sehr nützlich hab die Fehler rausbekommen zumindest läuft das Programm jetzt so wie es soll jetzt fehlt nur noch eine 7 Segment anzeige die mir den Prozentwert anzeigt
hir noch mal mein aktueller code
/*
Analog Input
*/
#include "OneButton.h"
#define MOTOR_1 A2
#define MOTOR_2 A4
#define POTI A0
#define PWM 9
#define TASTER 5
#define LED 3
bool sto = 0;
//void clickedIt();
OneButton button(TASTER, true);
//int poti = A0; // select the input pin for the potentiometer
int poti_Value = 0; // variable to store the value coming from the sensor
int poti_prozent = 0;
bool sicherheit = 1;
void setup() {
// declare the ledPin as an OUTPUT:
//pinMode(ledPin, OUTPUT);
Serial.begin(9600);
//pinMode(MOTOR_1,OUTPUT);
//pinMode(MOTOR_2,OUTPUT);
pinMode(LED,OUTPUT);
//pinMode(TASTER,INPUT_PULLUP);
pinMode(MOTOR_1,OUTPUT);
pinMode(MOTOR_2,OUTPUT);
pinMode(PWM,OUTPUT);
digitalWrite(LED, LOW);
poti_prozent = 4;
// Sicherheitsschaltung Poti auf 0 und Motor Aus
//poti_Value = analogRead(POTI);
//poti_prozent = map(poti_Value, 0,1023, 0,100);
//pinMode(TASTER, INPUT);
button.attachClick(clickedIt);
button.attachDoubleClick(doubleClickedIt);
while( poti_prozent >= 3 )
{
Serial.println("Poti zu Hoch ! ! !");
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(60);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
digitalWrite(LED, LOW);
delay(60);
}
}
bool Drehrichtung = true;
void loop() {
button.tick();
stopp();
//void clickedIt();
int pwmSpeed;
//delay(200);
//digitalWrite(MOTOR_1, HIGH);
//digitalWrite(MOTOR_2, HIGH);
//delay(200);
if(Drehrichtung == true)
{
button.tick();
stopp();
//void clickedIt();
// LED Drehrichtung Rechts
digitalWrite(LED, LOW);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Rechts Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
// Drehrichtung Rechts
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, HIGH);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
}
else
{
button.tick();
stopp();
//void clickedIt();
// LED Drehrichtung Links
digitalWrite(LED, HIGH);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Links Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
// Drehrichtung Links
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, LOW);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
}
}
void clickedIt()
{
Drehrichtung = !Drehrichtung;
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
}
void doubleClickedIt()
{
sto = !sto;
}
void stopp(void)
{
while(sto == true )
{
button.tick();
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
Serial.println("STOPP!!!");
digitalWrite(LED, HIGH);
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
digitalWrite(LED, LOW);
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
}
}
Ferdinand
19.08.2018, 10:50
Mein Programm macht den Drehrichtung wechsel nicht sauber ich muss mehrmals die Taste türken bis er wechselt
/*
Analog Input
*/
#include "OneButton.h"
#define MOTOR_1 A2
#define MOTOR_2 A4
#define POTI A0
#define PWM 9
#define TASTER 5
#define LED 3
bool sto = 0;
//void clickedIt();
OneButton button(TASTER, true);
//int poti = A0; // select the input pin for the potentiometer
int poti_Value = 0; // variable to store the value coming from the sensor
int poti_prozent = 0;
bool sicherheit = 1;
void setup() {
// declare the ledPin as an OUTPUT:
//pinMode(ledPin, OUTPUT);
//Serial.begin(9600);
//pinMode(MOTOR_1,OUTPUT);
//pinMode(MOTOR_2,OUTPUT);
pinMode(LED,OUTPUT);
//pinMode(TASTER,INPUT_PULLUP);
pinMode(MOTOR_1,OUTPUT);
pinMode(MOTOR_2,OUTPUT);
pinMode(PWM,OUTPUT);
digitalWrite(LED, LOW);
poti_prozent = 4;
// Sicherheitsschaltung Poti auf 0 und Motor Aus
//poti_Value = analogRead(POTI);
//poti_prozent = map(poti_Value, 0,1023, 0,100);
//pinMode(TASTER, INPUT);
button.attachClick(clickedIt);
button.attachDoubleClick(doubleClickedIt);
while( poti_prozent >= 3 )
{
//Serial.println("Poti zu Hoch ! ! !");
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(60);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
digitalWrite(LED, LOW);
delay(60);
}
}
bool Drehrichtung = true;
void loop() {
button.tick();
stopp();
//void clickedIt();
int pwmSpeed;
//delay(200);
//digitalWrite(MOTOR_1, HIGH);
//digitalWrite(MOTOR_2, HIGH);
//delay(200);
if(Drehrichtung == 1)
{
button.tick();
stopp();
//void clickedIt();
// LED Drehrichtung Rechts
digitalWrite(LED, LOW);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
//Serial.print("Rechts Poti = ");
//Serial.print(poti_prozent);
//Serial.println("% ");
// Drehrichtung Rechts
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, HIGH);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
}
button.tick();
stopp();
if(Drehrichtung == 0)
{
button.tick();
stopp();
//void clickedIt();
// LED Drehrichtung Links
digitalWrite(LED, HIGH);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
//Serial.print("Links Poti = ");
//Serial.print(poti_prozent);
//Serial.println("% ");
// Drehrichtung Links
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, LOW);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
}
button.tick();
stopp();
}
void clickedIt()
{
Drehrichtung = !Drehrichtung;
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
}
void doubleClickedIt()
{
sto = !sto;
}
void stopp(void)
{
while(sto == true )
{
button.tick();
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
//Serial.println("STOPP!!!");
digitalWrite(LED, HIGH);
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
digitalWrite(LED, LOW);
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
}
}
das könnte was mit dem debounce-Verhalten in deiner Button lib zu tun haben, ich verwende und kenne diese aber nicht, ich mache es ganz anders (was dir hier jetzt aber auch nicht hilft).
Die Doku zu deiner Lib hat aber dazu sicher irgendwelche Tipps.
Meine Vermutung:
Deine Funktion clickedIt braucht mehr als 400 Millisekunden wegen deiner blinkenden Led,
da bekommt er die Tastendrücke nicht mit.
Siro sagt es! Solang der in clickedIt() hängt bekommt er nichts mit. Und das fast eine halbe Sekunde lang. Dann bleibt für das Taste Drücken nur die Zeit, bis er nach dem clickedIt() wieder im clickedIt() landet, weil es aufgerufen wird. Man müsste daher die Taste für ca. 1 Sekunde drücken, vielleicht auch etwas länger, damit er es mitbekommt oder eben öfter. Das Problem gibt es, seit es Computer gibt. Deshalb hat man sich dafür etwas einfallen lassen: Interrupt Controller. Ob der Arduino einen solchen hat, weiß ich nicht, aber er kennt Interrupts. Die Digital Pins, die für einen Interrupt (Unterbrechung) genutzt werden können sind hier soweit alle aufgeführt: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
Der Taster müsste an einen solchen Pin angeschlossen werden. Wenn dann der Taster gedrückt wird, sollte der Arduino direkt zur Interruptroutine springen und andere Dinge unterbrechen. Das nennt sich dann Interrupt Service Routine.
Auf der Seite ist alles beschrieben:
Syntax
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)
Parameters
interrupt: the number of the interrupt (int)
pin: the pin number (Arduino Due, Zero, MKR1000 only)
ISR: the ISR to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine.
mode: defines when the interrupt should be triggered. Four constants are predefined as valid values:
LOW to trigger the interrupt whenever the pin is low,
CHANGE to trigger the interrupt whenever the pin changes value
RISING to trigger when the pin goes from low to high,
FALLING for when the pin goes from high to low.
The Due, Zero and MKR1000 boards allows also:
HIGH to trigger the interrupt whenever the pin is high.
Wenn man keinen Interrupt nutzt, hat man das Problem, dass man dauernd überall im Programmcode immer wieder auf den Taster prüfen müsste, damit man den Tastendruck nicht verpasst. Das kann sogar funktionieren, bläht aber den Code auf und ist äußerst unübersichtlich (in der Regel funktioniert es auch nicht wirklich gut).
Was man tun kann, ist dieses rausschmeißen:
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
In loop() kann man immer auf den Taster prüfen. Verändert sich das Signal, kann man reagieren. Außerdem zählt man einen Zähler runter (Startwert meinetwegen bei 1000), bei jedem Durchlauf von loop() zähler = zähler -1. Wenn der Zähler auf 0 ist, setzt man die LED entweder auf HIGH oder LOW, abhängig davon, was zuletzt war (logisch) und setzt den Zähler wieder auf den Startwert. Wegen der Blinkgeschwindigkeit kann man den Zählerstartwert variieren.
Ferdinand
19.08.2018, 22:05
was halt komisch ist das wen ich den arduino nano an usb angeschlossen habe sprich an Serial funktioniert alles gut wen ich ihn ohne Laufen lasse macht er Probleme
hir noch mal den Aktuellen Code
/*
Analog Input
*/
#include "OneButton.h"
#define MOTOR_1 A2
#define MOTOR_2 A4
#define POTI A0
#define PWM 9
#define TASTER 5
#define LED 3
bool sto = 0;
//void clickedIt();
OneButton button(TASTER, true);
//int poti = A0; // select the input pin for the potentiometer
int poti_Value = 0; // variable to store the value coming from the sensor
int poti_prozent = 0;
bool sicherheit = 1;
void setup() {
// declare the ledPin as an OUTPUT:
//pinMode(ledPin, OUTPUT);
Serial.begin(9600);
//pinMode(MOTOR_1,OUTPUT);
//pinMode(MOTOR_2,OUTPUT);
pinMode(LED,OUTPUT);
//pinMode(TASTER,INPUT_PULLUP);
pinMode(MOTOR_1,OUTPUT);
pinMode(MOTOR_2,OUTPUT);
pinMode(PWM,OUTPUT);
digitalWrite(LED, LOW);
poti_prozent = 4;
// Sicherheitsschaltung Poti auf 0 und Motor Aus
//poti_Value = analogRead(POTI);
//poti_prozent = map(poti_Value, 0,1023, 0,100);
//pinMode(TASTER, INPUT);
button.attachClick(clickedIt);
button.attachDoubleClick(doubleClickedIt);
while( poti_prozent >= 3 )
{
Serial.println("Poti zu Hoch ! ! !");
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(60);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
digitalWrite(LED, LOW);
delay(60);
}
}
bool Drehrichtung = true;
void loop() {
button.tick();
stopp();
//void clickedIt();
int pwmSpeed;
//delay(200);
//digitalWrite(MOTOR_1, HIGH);
//digitalWrite(MOTOR_2, HIGH);
//delay(200);
if(Drehrichtung == true)
{
button.tick();
stopp();
//void clickedIt();
// LED Drehrichtung Rechts
digitalWrite(LED, LOW);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Rechts Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
// Drehrichtung Rechts
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, HIGH);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
}
else
{
button.tick();
stopp();
//void clickedIt();
// LED Drehrichtung Links
digitalWrite(LED, HIGH);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Links Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
// Drehrichtung Links
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, LOW);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
}
}
void clickedIt()
{
Drehrichtung = !Drehrichtung;
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
}
void doubleClickedIt()
{
sto = !sto;
}
void stopp(void)
{
while(sto == true )
{
button.tick();
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
Serial.println("STOPP!!!");
digitalWrite(LED, HIGH);
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
digitalWrite(LED, LOW);
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
}
}
- - - Aktualisiert - - -
ok hab es jetzt mal mit einer Funktion versucht leider nach einmaligen Drehrichtungswechsel reagiert er nicht mehr auf Tastendruck
/*
Analog Input
*/
#include "OneButton.h"
#define MOTOR_1 A2
#define MOTOR_2 A4
#define POTI A0
#define PWM 9
#define TASTER 5
#define LED 3
bool sto = 0;
bool drehrichtung = 0;
//void clickedIt();
OneButton button(TASTER, true);
//int poti = A0; // select the input pin for the potentiometer
int poti_Value = 0; // variable to store the value coming from the sensor
int poti_prozent = 0;
bool sicherheit = 1;
void setup() {
// declare the ledPin as an OUTPUT:
//pinMode(ledPin, OUTPUT);
Serial.begin(9600);
//pinMode(MOTOR_1,OUTPUT);
//pinMode(MOTOR_2,OUTPUT);
pinMode(LED,OUTPUT);
//pinMode(TASTER,INPUT_PULLUP);
pinMode(MOTOR_1,OUTPUT);
pinMode(MOTOR_2,OUTPUT);
pinMode(PWM,OUTPUT);
digitalWrite(LED, LOW);
poti_prozent = 4;
// Sicherheitsschaltung Poti auf 0 und Motor Aus
//poti_Value = analogRead(POTI);
//poti_prozent = map(poti_Value, 0,1023, 0,100);
//pinMode(TASTER, INPUT);
button.attachClick(clickedIt);
button.attachDoubleClick(doubleClickedIt);
while( poti_prozent >= 3 )
{
Serial.println("Poti zu Hoch ! ! !");
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(60);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
digitalWrite(LED, LOW);
delay(60);
}
}
bool Drehrichtung = true;
void loop() {
button.tick();
stopp();
if(drehrichtung == 1)
{
drehrichtun();
}
//void clickedIt();
int pwmSpeed;
//delay(200);
//digitalWrite(MOTOR_1, HIGH);
//digitalWrite(MOTOR_2, HIGH);
//delay(200);
if(Drehrichtung == true)
{
button.tick();
stopp();
//void clickedIt();
// LED Drehrichtung Rechts
digitalWrite(LED, LOW);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Rechts Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
// Drehrichtung Rechts
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, HIGH);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
}
else
{
button.tick();
stopp();
//void clickedIt();
// LED Drehrichtung Links
digitalWrite(LED, HIGH);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
// Ausgabe
Serial.print("Links Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
// Drehrichtung Links
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, LOW);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
}
}
void clickedIt()
{
drehrichtung = 1;
}
void doubleClickedIt()
{
sto = !sto;
}
void stopp(void)
{
while(sto == true )
{
button.tick();
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
Serial.println("STOPP!!!");
digitalWrite(LED, HIGH);
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
digitalWrite(LED, LOW);
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
}
}
void drehrichtun(void)
{
Drehrichtung = !Drehrichtung;
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
drehrichtung = 0;
}
ich habe das "button.tick();" noch in der schleife vergessen
void drehrichtun(void)
{
Drehrichtung = !Drehrichtung;
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
drehrichtung = 0;
}
wes geht nur sauber wen ich es am PC angeschlossen habe
Vielleicht hat es dann etwas mit der Spannungsquelle zu tun?
Ferdinand
20.08.2018, 22:58
ja du hattest recht es war was mit dem Taster nicht in Ordnung der hatte nicht den richtigen Kontakt typisch Steckbrett eben jetzt geht alles wie ich mir das vorstelle später kommt noch ein 3 * 7Segment anzeige für die Ausgabe in % hinzu
hir mein aktueller code
/*
Analog Input
*/
#include "OneButton.h"
#define MOTOR_1 A2
#define MOTOR_2 A4
#define POTI A0
#define PWM 9
#define TASTER 5
#define LED 3
bool sto = 0;
bool drehrichtung = 0;
//void clickedIt();
OneButton button(TASTER, true);
//int poti = A0; // select the input pin for the potentiometer
int poti_Value = 0; // variable to store the value coming from the sensor
int poti_prozent = 0;
bool sicherheit = 1;
void setup() {
Serial.begin(9600);
pinMode(LED,OUTPUT);
//pinMode(TASTER,INPUT_PULLUP);
pinMode(MOTOR_1,OUTPUT);
pinMode(MOTOR_2,OUTPUT);
pinMode(PWM,OUTPUT);
digitalWrite(LED, LOW);
poti_prozent = 4;
// Sicherheitsschaltung Poti auf 0 und Motor Aus
//pinMode(TASTER, INPUT);
button.attachClick(clickedIt);
button.attachDoubleClick(doubleClickedIt);
while( poti_prozent >= 3 )
{
Serial.println("Poti zu Hoch ! ! !");
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(60);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
digitalWrite(LED, LOW);
delay(60);
}
}
bool Drehrichtung = true;
void loop() {
button.tick();
stopp();
if(drehrichtung == 1)
{
button.tick();
drehrichtun();
}
//void clickedIt();
int pwmSpeed;
if(Drehrichtung == true)
{
button.tick();
stopp();
// LED Drehrichtung Rechts
digitalWrite(LED, LOW);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
button.tick();
stopp();
// Ausgabe
Serial.print("Rechts Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
button.tick();
stopp();
// Drehrichtung Rechts
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, HIGH);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
button.tick();
stopp();
}
else
{
button.tick();
stopp();
//void clickedIt();
// LED Drehrichtung Links
digitalWrite(LED, HIGH);
poti_Value = analogRead(POTI);
poti_prozent = map(poti_Value, 0,1023, 0,100);
button.tick();
stopp();
// Ausgabe
Serial.print("Links Poti = ");
Serial.print(poti_prozent);
Serial.println("% ");
button.tick();
stopp();
// Drehrichtung Links
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, LOW);
// Geschwindigkeit regeln
analogWrite(PWM, poti_Value / 4);
button.tick();
stopp();
}
}
void clickedIt()
{
drehrichtung = 1;
}
void doubleClickedIt()
{
sto = !sto;
}
void stopp(void)
{
while(sto == true )
{
button.tick();
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
Serial.println("STOPP!!!");
digitalWrite(LED, HIGH);
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
digitalWrite(LED, LOW);
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
delay(50);
button.tick();
}
}
void drehrichtun(void)
{
Drehrichtung = !Drehrichtung;
digitalWrite(MOTOR_1, HIGH);
digitalWrite(MOTOR_2, HIGH);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
drehrichtung = 0;
}
Bei Steckbrettern muss man immer damit rechnen.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.