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.
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.
Ja stimmt er hat rechtgehabt das mit dem taster funktionirt jetz aber der motor leuft noch nicht keine ahnung warum
ich denke da #define MOTOR_1 A2 #define MOTOR_2 A4 past was nichtCode:/* 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; }
Danke
habe schreiben erst heute gelernt.
bin legasteniger.
by Ferdinand.
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:
-------------
Code:#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(); }
Geändert von Siro (18.08.2018 um 21:42 Uhr)
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
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(); } }
Geändert von Ferdinand (19.08.2018 um 01:57 Uhr)
habe schreiben erst heute gelernt.
bin legasteniger.
by Ferdinand.
Mein Programm macht den Drehrichtung wechsel nicht sauber ich muss mehrmals die Taste türken bis er wechselt
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 == 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(); } }
habe schreiben erst heute gelernt.
bin legasteniger.
by Ferdinand.
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.
Lesezeichen