Zählschleife

ich will eine Zählschleife erstellen, diese soll nach oben gezählt werden bis 64000. Zwischendrin soll jederzeit mit einer beliebigen Taste der Wert abgefragt werden.

Desweiteren will ich eine LED einschalten wenn man eine Taste 4x drückt

Ich wollte fragen ob ihr mir helfen könnt dies zu realisieren.

Danke

Gruss Hendrik

Guten Tag Sir. Ich habe genau das gleich Problem wie Sie. Bitte kontaktiren sie mich wenn sie eine antword haben. Mit freundlichen grüßen

xXPr0gr4mm3erXx

P.S grüß mal deine Mutter von mir :D

Eine tolle Problem-Beschreibung: "eine beliebige Taste", "Wert abgefragt", "Taste 4x gedrückt"

Von welchen Tasten sprichst Du? Welcher Wert? Wo soll der angezeigt werden? Welche LED soll eingeschaltet werden? Wie sieht der Schaltplan aus? Wie sieht Dein bisheriger Code aus?

Dann können wir Dir sicherlich auch helfen.

sehr sehr spärliche Information. Außerdem finde ich es unnötig 2 threads für das gleiche Problem in so kurzer Zeit aufzumachen Folgender sketch macht genau das was du gefragt hast aber ich glaube nicht das es das ist wast du willst

int i = 0 ;
byte tastencounter = 0 ;

void setup(){
Serial.begin(9600);
pinmode(5,OUTPUT);
pinmode(3,INPUT);
pinmode(4,INPUT);
}
void loop(){
i++;
if (i == 64000){
i = 0; 
}
  if (digitalRead(3)==HIGH){
     serial.Println(i);
}

if(digitalRead(4) == HIGH){
tastencounter ++;
if (tastencounter == 4)
{
digitalWrite(5,HIGH);
tastencounter =0;
while(digitalRead(4) == HIGH){}

}
}

der_chipo:
… Folgender sketch macht genau das was du gefragt hast …

int i = 0 ;


void loop(){
i++;
if (i == 64000){

Nein, macht er nicht. Du hast einen kapitalen Fehler eingebaut. i erreicht nie den Wert von 64000.
Hast Du den Sketch überhaupt ausprobiert?

Außerdem hilst Du dem User nicht indem Du Ihm seine Aufgaben erledigst. Er soll lernen wie es gemacht wird und selbst das machen können.

Grüße Uwe

Hallo,

Hilfe

Gruß und Spaß Andreas

Und wieder mal aufs neue schreibt der Forumsleiter nur des schreibenswillen hier rein.

unsigned int zählt bis 64000. int leider nur bis +- 32000 irgendwas das wäre dann der Fehler.

Ich habe auch nicht seine Aufgabe erledigt. wie ich geschrieben habe macht der sketch das was er soll (wenn man das int durch unsigned int oder long ersetzt). Ich denke aber das das nicht die Aufgabe ist. Der User wird sehen das er hiermit wohl nicht das gewünschte Ergebniss erziehlt. Vielleicht möchte er sich dann aber auch selber äußern

der_chipo: Ich habe auch nicht seine Aufgabe erledigt. wie ich geschrieben habe macht der scetch das was er soll. Ich denke aber das das nicht die Aufgabe ist.

Nein macht er nicht. Die Variable I erreicht nie den Wert 64000 somit ist eine kontrolle und das nullsetzen hinfällig. Grüße Uwe

Hallo, selbst wenn Du das "int" ändern wirst, dann wirft der Sketch noch Fehler raus... "das wäre dann der Fehler" einer der vielen...

  if (digitalRead(3)==HIGH){
     serial.Println(i);

Gruß und Spaß Andreas

xXPr0gr4mm3RXx: Guten Tag Sir. Ich habe genau das gleich Problem wie Sie. Bitte kontaktiren sie mich wenn sie eine antword haben. Mit freundlichen grüßen

xXPr0gr4mm3erXx P.S grüß mal deine Mutter von mir :D

Vor 30 Jahren hat es noch ausgereicht, wenn Mütter ihren Kindern bei den Mathe-Hausaufgaben mit dem Dreisatz weiterhelfen konnten. Und heute wollen die Kinder von den Müttern Mikrocontrollerprogramme als Hausaufgabe geschrieben bekommen?

Und wenn Mama nicht mehr weiterweiß, gibt es inzwischen ja auch noch das Internet, um wegen der Hausaufgabe nachzufragen.

Nochmal 30 Jahre weiter werden Mütter ihren Kindern als Hausaufgabenhilfe wohl mindestens eine Stratosphärenrakete basteln und das Steuerprogramm dafür programmieren müssen. :smiling_imp:

Moderne Zeiten!

Und wenn Mama die Hausaufgabe dann nicht auf die Reihe bekommt, lädt sich der Sohn den 3D-Bauplan aus dem Internet herunter und läßt die Stratosphärenrakete auf einem 3D Drucker ausdrucken. Hausaufgaben 2046! :smiling_imp:

unsigned int i = 0 ;
byte tastencounter = 0 ;

void setup() {
  Serial.begin(9600);
  pinMode(5, OUTPUT); // LED
  pinMode(3, INPUT); // Taser zur Datenausgabe
  pinMode(4, INPUT); // Taster für LED
}
void loop() {
  i++;
  if (i == 64000) {
    i = 0;
  }
  if (digitalRead(3) == HIGH) {
    Serial.println(i);
  }

  if (digitalRead(4) == HIGH) {
    tastencounter ++;
  }
  if (tastencounter == 4)
  {
    digitalWrite(5, HIGH);
    tastencounter = 0;
    while (digitalRead(4) == HIGH) {}

  }
}

Was soll nochmal der Sketch?

Ohne Fehler
unsigned integer
Groß klein Schreibung
Klammern

jedoch wird niemals 64000 seriell ausgegeben werden. und 0 auch nicht

@der_chipo: Dieser Code hier unten ist Mist: Auf jeden fall macht er nicht was gewünscht wurde "will ich eine LED einschalten wenn man eine Taste 4x drückt"

byte tastencounter = 0 ;

void setup() {
   pinMode(13, OUTPUT);
}

void loop() {
  if (digitalRead(4) == HIGH) {
    tastencounter ++;
  }
  if (tastencounter == 4)
  {
     digitalWrite(13,HIGH);
     while (digitalRead(4) == HIGH) {}
     tastencounter= 0;
   }
digitalWrite(13, LOW);
}

Selbst wenn du an Pin 4 einen Pulldown-Widerstand anschliesst und ihn per Taster HIGH schaltest, zählt der Sketch nicht, bis bu 4 mal den Taster gedrückt hast und signalisiert das dann per LED an Pin13.

Genaugenommen folgt die LED ohne bemerkenswerte Verzögerung dem Taster. Der Sketch hat nur die Eigenschaft, dass er, wenn der Pin 4 HIGH ist, im while hängt und also sonst nichts machen würde, wenn man ihn für andere Funktionen erweitern würde.

Das mit dem unsigned int iund dem anderen Taster ist auch eher sinnlos. Da das Serial.print() ziemlich häufig drankommt. Oder geht es dir darum, zu zeigen, dass loop langsamer läuft, wenn der Serial Ausgabepuffer nach 64 Zeichen erstmal voll ist? Das ist nach ca. 10 loop-Durchläufen, also deutlich schneller als der küzeste Tastendruck, der Fall. Danach dauert ein loop-Durchlauf bei weiter gedrückter Taste ca. 6 ms. Es werden also auch dann noch ziemlich schnell Zahlen ausgeschrieben, die aber nur Rückschlüsse auf die eingestellte Geschwindigkeit der Seriellen Schnittstelle geben.

Was soll das? Um zu zeigen, wie schnell ein loop() Durchlauf "normalerweise" ist, solltest du was bauen, was Tastendrück-Ereignisse erkennt (incl. Entprellen). Das wurde in der Aufgabenstellung nicht explizit erwähnt, ist aber eigentlich klar (Bei Tastendruck den aktuellen Wert eines durchlaufenden Zählers einmal ausgeben) (Tasterbetätigungen zählen und jedes 4. Mal eine LED einschalten) ist eigentlich eine vernünfige Aufgabenstellung, die dein Sketch NICHT erfüllt.

faszinierend finde ich das hier alle was zu sagen hat. aber keiner produktiv an der Lösung des Problems tei nimmt

zählt der Sketch nicht, bis bu 4 mal den Taster gedrückt hast

// taser Gedrückt ?
if (digitalRead(4) == HIGH) {
// Zähler hochzählen
    tastencounter ++;
// Warten bis Taster losgelassen (das nennt man entprellen)
    while (digitalRead(4) == HIGH) {}
// wenn 4x gedrückt
  if (tastencounter == 4)
  {
// lampe an und neu zählen
     digitalWrite(13,HIGH);
     tastencounter= 0;
   }
}

Da das Serial.print() ziemlich häufig drankommt.

???

// Wenn Taste gedrückt print sonst nicht
if (digitalRead(3) == HIGH) {
    Serial.println(i);
  }

den sollte man natürlich auch entprellen aber ich denke das ich hier keine fertige lösung abegebe sondern eher das Prinzip auf dem man aufbauen kann

Das entprellen kann man natürlich auch eleganter lösen. z.b. in dem man in jedem schleifendurchlauf prüft ob der taster noch gedrückt ist oder ob eine änderung eingetreten ist.

bool aktuell = digitalRead(taster);
if(aktuell == 1 && aktuell != alterstatus)
{
    // zählen oder Serielle ausgabe 
}

Aber wie gesagt hier geht es ums funktionsprinzip welches jeder so verändern darf und soll wie er möchte. Und das möglichst einfach damit es jeder versteht.

Natürlich kann ich auch wie michael_x mit fachwissen pralen. Das finde ich aber hier nicht angebracht und vor allem unnötig. Es geht um einen Ansatz und nicht um eine fertige Lösung.

// Warten bis Taster losgelassen (das nennt man entprellen)    
    while (digitalRead(4) == HIGH) {}

Warten bis Taster losgelassen: Ja, sehe ich auch so Entprellen: Definitiv nicht! Mach dich doch mal darüber schlau, was Tasterprellen ist und warum das bei Mikrocontrollern zu einem Problem führt!

Quick and dirty (vor allem dirty wegen delay() ) entprellen

if (digitalRead(4) == HIGH) {
    tastencounter ++;
    delay(30);  //muss je nach Taster angepasst werden
}

Sauber wäre eine Lösung mit millis() anstatt delay() oder eine Hardware-Entprellung!

PS: Der Code in deinem letzten Post entspricht nicht dem Code, welcher bemängelt wurde.

Gruss Peter

Ich finde es faszinierend, dass ihr hier über einen Sketch diskutiert, ohne überhaupt die genauen Anforderungen zu kennen. Der Fragesteller hat bis auf den Startpost bisher noch gar nichts weiter von sich hören lassen.

Hallo, "der_chipo" hat versucht zu helfen. Dabei hat er leider einen fehlerhaften Sketch abgeliefert- und nun ist ER dran…

Das ist ganz normal, er soll es einfach sportlich nehmen.

Verbesser den Sketch, bis keiner mehr etwas findet- dann kommt der TO und will die LED wieder ausgeschaltet haben… Gruß und Spaß Andreas

Das denke ich auch .. wie ich ganz oben schon geschrieben habe lohnt es nicht da viel energie reinzustecken. nach dem Motto "Das soll einmal funktionieren um zu sehen das es nicht das macht was man will". Ich habe auch nichts gegen kritik oder wenn man mich auf fehler aufmeksam macht. dann sollte man aberr wenigstens sagen warum was falsch ist ansttt nur mal zu schreiben ist falsch aber ich sag nocht wie es geht