ich versuche eine Funktion z.B. Funktion 1 dreimal durchlaufen zu lassen, dannach soll diese Funktion enden und eine weitere Funktion z.B. Funktion2 auch dreimal durchlaufen.
Jedoch weiß ich nicht genau, wie ich das am besten lösen könnte.
Über einen Taster soll die Funktion1 im Loop aufegrufen werden. Die Funktion1 soll nach den loslassen des Taster gestartet werden, also wenn die Variable Tasterstaus==HIGH ist. Dannach soll die Funktion1 dreimal durchlaufen und dannach enden.
Wenn die Funktion1 beendet ist soll die Funktion2 starten und auch dreimal durchlaufen.
Habe an zwei if-Abfragen gedacht eine um die Funktion1 zu starten und eine um die Funktion 2 zu starten.
Der Sketch sieht im Moment so aus, dass wenn der Taster gedrückt wird, die Funktion1 startet und so lange an bleibt, bis der Taster ein zweites mal betätigt wird dann startet die Funktion2.
Es wäre sehr Nett, wenn mir jemand dabei helfen könnte und mir eine einfache Lösung vorschlagen würde.
Wie könnte ich es den mit einer Schleife hinbekommen?
So dass die Funktion1 dreimal durchläuft dannach endet und dann die Funktion2 dreimal druchläuft?
sowas in der Art.
Also über einen Counter soll mit die Funktion1 dreimal und dannach die Funktion2 dreimal durchlaufen werden.
Das ganze soll aber ohne delay passieren, da nebenbei noch in der Funktion 1 und Funktion 2 LEDs angesteuert werden.
int TasterZeit = 0; //Zeit beim drückeb des Taster
int Entprellzeit = 200; //Entprellzeit (200ms)
//Variable für den Lichtmodus
int Lichtmodus = 0;
//Variable für den Poti
int Poti = A0;
int intervall;
//Variablen für das Lauflichtprogramm1
boolean Startwert = LOW; //Startwert der LED
unsigned long letzterwechsel1; //Speichert, wie viele Sekunden seit der letzten Änderung vergangen sind
int LEDPin1 = 6; //LEDPin1 ist der Pin6
int LEDPin2 = 7; //LEDPin2 ist der Pin7
//Variablen für das Lauflichtprogramm2
int LEDPin3 []= {6,7}; //Variable, die die Ausgänge zu einer Variablen mit den Namen LEDPins zusammenfasst
unsigned long letzterwechsel2; //Variable, die speicher, wann von einer LED zu anderen gesprungen wurde
int aktuelleLED = 1; //Legt den Startwert der LED fest
void setup() {
// put your setup code here, to run once:
pinMode (Taster, INPUT);
pinMode (LEDRueckmeldung, OUTPUT);
pinMode (LEDPin1, OUTPUT);
pinMode (LEDPin2, OUTPUT);
for (int i=0; i < 2; i++){ //For-Schleife mit der Variable i, die von 0-2 hochgezähglt wird
pinMode(LEDPin3[i], OUTPUT);
}
}
void loop() {
Tasterabfrage();
Potiabfrage();
Lauflichtprogramm1(); //Lauflichtprogramm1 (Blinken nur Kanal 1 und 2)
Lauflichtprogramm2(); //Lauflichtprogramm2 (Springender Ball nur Kanal 1 und 2)
}
void Tasterabfrage() {
Tasterstatus = digitalRead(Taster); //Auslesen des Tasters
if (Tasterstatus==HIGH) //Wenn der Tasterstaus HIGH ist..
{
TasterZeit=millis(); //Aktualisieren der Tasterzeit
Tastergedruckt = 1; //Speichern, dass der Taster gedrückt wurde
digitalWrite(LEDRueckmeldung, HIGH); //Die RückmeldeLED wird auf HIGH gesetzt
}
//Wenn die gewählte Entprellzeit vergangen ist und der Taster gedrückt wurde
if ((millis() - TasterZeit > Entprellzeit) && Tastergedruckt == 1)
{
Lichtmodus++; //Lichtmodus wird um eins hochgezählt
Tastergedruckt = 0; //Variable Tastergedrückt wird auf 0 gesetzt
digitalWrite(LEDRueckmeldung, LOW); //Die RückmeldeLED wird auf LOW gesetzt
}
}
void Potiabfrage() {
intervall = analogRead(Poti); //Auslesen des Potis
}
void Lauflichtprogramm1(){
if (Lichtmodus==0){
if (millis()- letzterwechsel1 > intervall){
letzterwechsel1 = millis(); //aktuelle Zeit speichern
Startwert = !Startwert; //Zustand der LED wechseln
digitalWrite(LEDPin1, Startwert); //Zustand an den Ausgang 6 & 7 schreiben
digitalWrite(LEDPin2, Startwert);
}
}
}
void Lauflichtprogramm2(){
if (Lichtmodus==1){
unsigned long aktuellezeit = millis (); //Greift die Zeit für den wechsel der LED ab
if (aktuellezeit - letzterwechsel2 > intervall){ //Überprüft, ob die Differenz aus der aktuellen Zeit minus den letzten Wechsel größer als der Intervall ist
digitalWrite(LEDPin3[aktuelleLED], LOW); //Aktuelle LED wird auf LOW gesetzt
aktuelleLED = (aktuelleLED + 1) % 2; //Aktuelle LED wird um 1 erhöht und durch 2 geteilt
digitalWrite(LEDPin3[aktuelleLED], HIGH); //Aktuelle LED wird auf HIGH gesetzt
letzterwechsel2 = aktuellezeit; //Weist die aktuellezeit den letztenwechsel2 zu
}
}
}
Nun soll im Lopp eine weitere Routine/Funktion die Automatikbetrieb() heißt rein, wenn diese über die IF-Schleife if (Lichtmodus==3){} aufgerufen wird, soll das Lauflichtprogramm1 dreimal durchlaufen und dann dannach das Lauflichtprogramm2 ebenfals dreimal
Habe den Pseudocode gerade mal getestet, jedoch funktioniert es bei mir irgendwie nicht.
Kann es sein, dass ich irgendwas verkehrt mache.
Hätte den Pseudocode so eingefügt.
//Einbinden der Bibliothek (Für den EEPROM)
#include <EEPROM.h>
//Konstanten für den Tater und RückmeldeLED
const int Taster = 3;
const int LEDRueckmeldung = 2;
//Variablen für den Tater
int Tasterstatus = 0; //Aktuelles Signal vom Taster
int Tastergedruckt = 0; //Abfrage ob Taster gedrückt wurde
int TasterZeit = 0; //Zeit beim drückeb des Taster
int Entprellzeit = 200; //Entprellzeit (200ms)
//Variable für den Lichtmodus
int Lichtmodus = 0;
int counter=0;
boolean ende = false;
//Variable für den Poti
int Poti = A0;
int intervall;
//Variablen für das Lauflichtprogramm1
boolean Startwert = LOW; //Startwert der LED
unsigned long letzterwechsel1; //Speichert, wie viele Sekunden seit der letzten Änderung vergangen sind
int LEDPin1 = 6; //LEDPin1 ist der Pin6
int LEDPin2 = 7; //LEDPin2 ist der Pin7
//Variablen für das Lauflichtprogramm2
int LEDPin3 []= {6,7}; //Variable, die die Ausgänge zu einer Variablen mit den Namen LEDPins zusammenfasst
unsigned long letzterwechsel2; //Variable, die speicher, wann von einer LED zu anderen gesprungen wurde
int aktuelleLED = 1; //Legt den Startwert der LED fest
void setup() {
// put your setup code here, to run once:
pinMode (Taster, INPUT);
pinMode (LEDRueckmeldung, OUTPUT);
pinMode (LEDPin1, OUTPUT);
pinMode (LEDPin2, OUTPUT);
for (int i=0; i < 2; i++){ //For-Schleife mit der Variable i, die von 0-2 hochgezähglt wird
pinMode(LEDPin3[i], OUTPUT);
}
}
void loop() {
i[color=red]f (!ende) {
Lauflichtprogramm1();
Lauflichtprogramm2();
counter++;
if (counter >= 3) {
counter = 0;
Lichtmodus++;
}
if (Lichtmodus > 1) ende = true;
}[/color]
Tasterabfrage();
Potiabfrage();
}
void Tasterabfrage() {
Tasterstatus = digitalRead(Taster); //Auslesen des Tasters
if (Tasterstatus==HIGH) //Wenn der Tasterstaus HIGH ist..
{
TasterZeit=millis(); //Aktualisieren der Tasterzeit
Tastergedruckt = 1; //Speichern, dass der Taster gedrückt wurde
digitalWrite(LEDRueckmeldung, HIGH); //Die RückmeldeLED wird auf HIGH gesetzt
}
//Wenn die gewählte Entprellzeit vergangen ist und der Taster gedrückt wurde
if ((millis() - TasterZeit > Entprellzeit) && Tastergedruckt == 1)
{
Lichtmodus++; //Lichtmodus wird um eins hochgezählt
Tastergedruckt = 0; //Variable Tastergedrückt wird auf 0 gesetzt
digitalWrite(LEDRueckmeldung, LOW); //Die RückmeldeLED wird auf LOW gesetzt
}
}
void Potiabfrage() {
intervall = analogRead(Poti); //Auslesen des Potis
}
void Lauflichtprogramm1(){
if (Lichtmodus==0){
if (millis()- letzterwechsel1 > intervall){
letzterwechsel1 = millis(); //aktuelle Zeit speichern
Startwert = !Startwert; //Zustand der LED wechseln
digitalWrite(LEDPin1, Startwert); //Zustand an den Ausgang 6 & 7 schreiben
digitalWrite(LEDPin2, Startwert);
}
}
}
void Lauflichtprogramm2(){
if (Lichtmodus==1){
unsigned long aktuellezeit = millis (); //Greift die Zeit für den wechsel der LED ab
if (aktuellezeit - letzterwechsel2 > intervall){ //Überprüft, ob die Differenz aus der aktuellen Zeit minus den letzten Wechsel größer als der Intervall ist
digitalWrite(LEDPin3[aktuelleLED], LOW); //Aktuelle LED wird auf LOW gesetzt
aktuelleLED = (aktuelleLED + 1) % 2; //Aktuelle LED wird um 1 erhöht und durch 2 geteilt
digitalWrite(LEDPin3[aktuelleLED], HIGH); //Aktuelle LED wird auf HIGH gesetzt
letzterwechsel2 = aktuellezeit; //Weist die aktuellezeit den letztenwechsel2 zu
}
}
}
Den Taster hatte ich übersehen und der Counter muss in den Led-Funktionen erhöht werden (counter bis 6, da ja jede Funktion 2 Zustände hat).
//Einbinden der Bibliothek (Für den EEPROM)
#include <EEPROM.h>
//Konstanten für den Tater und RückmeldeLED
const int Taster = 3;
const int LEDRueckmeldung = 2;
//Variablen für den Tater
int Tasterstatus = 0; //Aktuelles Signal vom Taster
int Tastergedruckt = 0; //Abfrage ob Taster gedrückt wurde
int TasterZeit = 0; //Zeit beim drückeb des Taster
int Entprellzeit = 200; //Entprellzeit (200ms)
//Variable für den Lichtmodus
int Lichtmodus = 0;
int counter=0;
boolean ende = true;
//Variable für den Poti
int Poti = A0;
int intervall;
//Variablen für das Lauflichtprogramm1
boolean Startwert = LOW; //Startwert der LED
unsigned long letzterwechsel1; //Speichert, wie viele Sekunden seit der letzten Änderung vergangen sind
int LEDPin1 = 6; //LEDPin1 ist der Pin6
int LEDPin2 = 7; //LEDPin2 ist der Pin7
//Variablen für das Lauflichtprogramm2
int LEDPin3 []= {6,7}; //Variable, die die Ausgänge zu einer Variablen mit den Namen LEDPins zusammenfasst
unsigned long letzterwechsel2; //Variable, die speicher, wann von einer LED zu anderen gesprungen wurde
int aktuelleLED = 1; //Legt den Startwert der LED fest
void setup() {
// put your setup code here, to run once:
pinMode (Taster, INPUT);
pinMode (LEDRueckmeldung, OUTPUT);
pinMode (LEDPin1, OUTPUT);
pinMode (LEDPin2, OUTPUT);
for (int i=0; i < 2; i++){ //For-Schleife mit der Variable i, die von 0-2 hochgezähglt wird
pinMode(LEDPin3[i], OUTPUT);
}
}
void Lauflichtprogramm1(){
if (Lichtmodus==0){
if (millis()- letzterwechsel1 > intervall){
letzterwechsel1 = millis(); //aktuelle Zeit speichern
Startwert = !Startwert; //Zustand der LED wechseln
digitalWrite(LEDPin1, Startwert); //Zustand an den Ausgang 6 & 7 schreiben
digitalWrite(LEDPin2, Startwert);
counter++;
}
}
}
void Lauflichtprogramm2(){
if (Lichtmodus==1){
unsigned long aktuellezeit = millis (); //Greift die Zeit für den wechsel der LED ab
if (aktuellezeit - letzterwechsel2 > intervall){ //Überprüft, ob die Differenz aus der aktuellen Zeit minus den letzten Wechsel größer als der Intervall ist
digitalWrite(LEDPin3[aktuelleLED], LOW); //Aktuelle LED wird auf LOW gesetzt
aktuelleLED = (aktuelleLED + 1) % 2; //Aktuelle LED wird um 1 erhöht und durch 2 geteilt
digitalWrite(LEDPin3[aktuelleLED], HIGH); //Aktuelle LED wird auf HIGH gesetzt
letzterwechsel2 = aktuellezeit; //Weist die aktuellezeit den letztenwechsel2 zu
counter++;
}
}
}
void loop() {
if (!ende) {
Lauflichtprogramm1();
Lauflichtprogramm2();
if (counter >= 6 { // An und aus je 3 Mal
counter = 0;
Lichtmodus++;
}
if (Lichtmodus > 1) ende = true;
}
Tasterabfrage();
Potiabfrage();
}
void Tasterabfrage() {
Tasterstatus = digitalRead(Taster); //Auslesen des Tasters
if (Tasterstatus==HIGH) //Wenn der Tasterstaus HIGH ist..
{
TasterZeit=millis(); //Aktualisieren der Tasterzeit
Tastergedruckt = 1; //Speichern, dass der Taster gedrückt wurde
digitalWrite(LEDRueckmeldung, HIGH); //Die RückmeldeLED wird auf HIGH gesetzt
}
//Wenn die gewählte Entprellzeit vergangen ist und der Taster gedrückt wurde
if ((millis() - TasterZeit > Entprellzeit) && Tastergedruckt == 1)
{
ende = false; // es geht los
Lichtmodus=0; //Lichtmodus wird auf 0 gesetzt
Tastergedruckt = 0; //Variable Tastergedrückt wird auf 0 gesetzt
digitalWrite(LEDRueckmeldung, LOW); //Die RückmeldeLED wird auf LOW gesetzt
}
}
void Potiabfrage() {
intervall = analogRead(Poti); //Auslesen des Potis
}
ich hoffe, jetzt geht es. Ohne zu Testen ist es immer fehlerfreudig.
Danke es funktioniert soweit, könnten Sie mir villeicht noch erklären, wass in diesem Teil passiert und warum beide lauflichtprogramm dann nur dreimal durchlaufen werden?
if (!ende) {
Lauflichtprogramm1();
Lauflichtprogramm2();
if (counter >= 6 { // An und aus je 3 Mal
counter = 0;
Lichtmodus++;
}
if (Lichtmodus > 1) ende = true;
}
Wie könnte ich es den realisieren, dass beide Funktionen hintereinander dreimal druchlaufen werden und dann das programm in einer Endlosschleife abläuft also.
Wenn der Tasterstaus == 2 ist, das Lauflichtprogramm1 dreimal druchlaufen, dann das Lauflichtprogramm2 dreimal durchlaufen und wieder mit den Lauflichtprogramm1 starten, dass dann wieder 3 mal druchläuft?
if (!ende) { // ! heißt nicht, d.h. wenn ende == true ist, ist !ende false und damit gehen wir nicht in den Block
// Da sich das Ganze ja nicht immer wiederholen soll, müssen wir uns merken, ob wir die LEDs steuern wollen oder nicht
// am Anfang wird ende auch auf false gesetzt, damit es erst nach dem Taster los läuft
Lauflichtprogramm1(); // hier wird jeweils der Counter bei jedem Statuswechsel hoch gezählt
Lauflichtprogramm2(); // Die Programme haben immer 2 Zustände und die mal 3
if (counter >= 6 { // An und aus je 3 Mal erfüllt
counter = 0; // dann counter wieder auf 0 für den nächsten Lauf
Lichtmodus++; // den Lichtmodus um 1 erhöhen
}
if (Lichtmodus > 1) ende = true; // Wenn wir über 1 sind, dann sind wir fertig.
}
Danke, wenn ich die If(!ende){} Schleife änder würde das Programm dann in Endlosmodus ablaufen, sprich wenn der Tasterstatus==2 ist, dann soll das Lauflichtprogramm1 dreimal durchlaufen werden, dann das lauflichtprogramm2 dreimal und dann wieder mit den lauflichtprogramm´1 gestartet werden.
Okay Danke erstmal.
Also das void lauflichtprogramm1 und void Lauflichtprogramm2 wollte ich gerne beibehalten und ein neues void Automatikbetrieb hinzufügen, dass dann gestartet wird, wenn der Lichtmodus==2 ist.
Könntest du mir villeicht erklären, wie ich den Teil von dir in den void Automatikbetrieb einfügen müsste und gibt es noch eine andere Möglichkeit, wie man mein Vorhaben realiseren kann.
So dass der erste Lauflichtprogramm und das zweite lauflichtprogramm dreimal durchlaufen werden in der void Automatikprogramm, wenn der Lichtmodus==2 ist?
Ich glaube, jetzt müssen wir mal von vorn anfangen und etwas Struktur in die Sache bringen.
Was soll das "Automatikprogramm machen und wodurch soll es ausgelöst werden?
Einfach so nach 2?
Das Automatikprogramm soll mir das Lauflichtprogramm1 dreimal durchlaufen und dannach das lauflichtprogramm2 dreimal durchlaufen und zwar in einer Endlosschleife, die durch ein weiteres betätigen des Tasters (Taster 3 mal betätigt) beendet werden kann.
Also folgender Maßen:
-Arduino mit Strom versorgt ---> Lauflichtprogramm1 ausführen
-Taster erstes mal betätigt ---> Lauflichtprogramm2 ausführen
-Taster zweites mal betätigt ---> Lauflichtprogramm1 dreimal durchlaufen, dannach Lauflichtprogramm2 dreimal durchlaufen (Im einer Endlosschleife, wie wenn der Programmteil im LOOP stehen würde).
-Taster drittes mal betätigt ---->Wieder mit den Lauflichtprogramm 1 starten.
Das mir das Lauflichtprogramm1 ausgeführt wird, wenn der Arduino mit Strom versorgt wird habe ich in meinem Sketch ja geschafft, sowie wie mir das Lauflichtprogramm2 ausgeführt wird, wenn ich den Taster das erste mal betätige.
Was mir jetzt nur Schwierigkeiten verursacht ist der Automatikbetrieb des aktiviert werden soll, wenn der Taster das zweite mal betätigt wird.
Könntest du mir vielleicht dabei helfen?
Das solltest Du eigentlich aus dem vorhandenen Code selbst zusammen bauen können.
Wennn in Automatik und Taster, dann ende = true;
Alles andere ist bekannter Code. Lediglich für Automatik brauchst Du eine eigene Variable, weil Du ja 0 und 1 trotzdem brauchst.