Anfänger probleme

Hey liebes schwarmwissen:
ich bin komplett neu auf dem Gebiet Programmierung. doch es hat mich voll gefesselt und will das es klappt. hab schon tausend Projekte im Kopf. momentan will ich eine vorrichtung bauen die einen laser durch Tastendruck kurz aufblicken lässt. das ganze soll aber auf 5x begrenzt sein. und nach dem 5x drücken und aufblicken soll eine zwangs-Pause sein bevor es wieder geht.

mein aktueller Code steht unten am Ende vom Text....funktioniert aber nicht. ( Wer hätte das gedacht)könntet ihr mir vlt sagen was falsch ist. oder ob mein Ansatz komplett für'n arsch ist.
ich danke euch schon mal für eure Aufmerksamkeit und eure Antworten.

int tasterPin = 2; //name für taster
int ledPin    = 1; //name für led

void setup() {
 pinMode(ledPin, OUTPUT);
 pinMode(tasterPin, INPUT);
}

void loop() {
buttonState = digitalRead(tasterPin);
int i=0;
 if (buttonState == HIGH && i<5) {
   // schalte led an
   digitalWrite(ledPin, HIGH);
 } else {
   // schalte led aus
   digitalWrite(ledPin, LOW);
       delay (10000);
 }
   {i++;}
}

Setze Deinen Sketch bitte in Codetags (</> oben links im Forumseditor). Dann ist er für alle besser lesbar.

Gruß Tommy

Hi

Durch dasint i=0;wird in jedem loop()-Durchlauf die Variable i mit dem Wert Null erstellt.
Bei jedem Durchlauf hat i also den Wert Null.

Entweder, Du definierst i global (also außerhalb von allen Funktionen), oder Du stellst ein static davor.

static int i=0;

Das hat zur Folge, daß die Variable i 1x erstellt wird, auch mit dem Wert Null, aber beim Ende von loop() nicht vernichtet wird - das i bleibt erhalten, auch der aktuelle Wert.

Deine LED wird bei Tastendruck (sehr) kurz leuchten und dann recht lange aus bleiben gefolgt von einem 50/50 Blinken.

Du fragst nur ab, ob der Taster HIGH ist und machst die LED an.
Im nächsten Durchlauf, i ist mittlerweile 1, fragst Du immer noch auf HIGH ab, die LED bleibt an.
...
Im Durchlauf 5 wird die IF nicht mehr erfüllt, da i jetzt nicht mehr kleiner 5 ist, die LED geht aus.
Im Durchlauf 6 ist die LED immer noch aus, bleibt auch aus. i ist 6.
...
i ist 32767, die LED ist weiterhin aus, da i nicht kleiner 5 ist.
Jetzt passiert aber was - i++ ergibt jetzt -32768, da i (signed int, 16 bit mit einem Vorzeichenbit, effektiv also 15bit) überläuft.
Im nächsten Durchlauf ist i<5 (nämlich -32768), wenn die Taste noch gedrückt ist, ist die LED an.

Denke, Du möchtest einen Datentyp ohne negative Zahlen nehmen.
Wenn Dir die 5 Status reichen, reicht byte (0...255).
Weiter musst Du auch das Loslassen des Taster erfassen, das Aufblitzen soll jan icht so lange andauern, wie Du die Finger auf dem Taster hast.

Du musst Dir für jede Situation eine Lösung zu den bevorstehenden Problemen bauen.

Was passiert, wenn Du den Taster nur ganz kurz betätigst?
Soll der Blitz weiter eine definierte Mindestlänge haben? (10ms machen sich ganz gut)

MfG

PS: Ich hatte das delay(10000); übersehen - dann blinkt die LED doch etwas langsamer, da bei jedem i >= 5 eine 10 Sekunden Pause eingelegt wird.
In dieser Zeit macht der µC Nichts (auch nicht auf den Taster reagieren).
Schaue Dir dazu millis() und die Nachtwächter-Erklärung an.
Das Blink_without_delay Beispiel in der IDE schadet auch nicht, wird beim Nachtwächter aber eh erwähnt.

das mit dem code in diese codetags zu setzen muss ich morgen mal am Rechner machen...mit Handy will das nicht so recht klappen

also sollte ich es so programmieren
laser an...Delay....laser aus....

Hi

Wenn Das Dein Wunsch ist und die Funktionalität Dem entspricht, was Du willst - dann Ja.

Das wird aber nicht Dein Wunsch sein, zumindest nur sehr schwer vorstellbar :wink:
Lies Dir bitte den Nachtwächter durch (hatte ich zwei drüber editiert) und schaue, ob Du auf millis() umschwenken kannst/willst.

MfG

das in diesen 10 Sekunden nichts geht ist gewollt

gibt es eine Möglichkeit i zu reseten wenn es den 5 Ten Durchlauf ausgeführt hat? Sprich das ich nach 10 Sekunden das ganze wieder von vorne anfangen kann.

Ja, i wieder auf 0 setzen, wenn ich Dich richtig verstanden habe.

Gruß Tommy

mach ich das über eine if Funktion im Loop selber oder ausserhalb des Loops?

int ledPin    = 1; //name für led

Pin 0 und 1 sind beim UNO für USB reserviert, nimm besser einen anderen Pin. Welchen Arduino verwendest Du?

ein digispark muss so kompackt wie möglich sein

Ich mache Dir mal einen Vorschlag, getestet mit UNO:

const byte tasterPin = 2; //name für taster
const byte ledPin    = 13; //name für led
const uint32_t Entprellzeit = 30, blitzZeit = 100, warteZeit = 10000;
uint32_t aktMillis, tasterMillis, blitzMillis, warteMillis;
bool aktTaster, altTaster, ledStatus;
byte zaehler;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(tasterPin, INPUT_PULLUP);
}

void loop() {
  aktMillis = millis();
  altTaster = aktTaster;
  if (aktMillis - tasterMillis >= Entprellzeit)
  {
    tasterMillis = aktMillis;
    aktTaster = !digitalRead(tasterPin);
  }
  if (!altTaster && aktTaster && (zaehler < 5)) {
    ledStatus = true;
    blitzMillis = aktMillis;
    warteMillis = aktMillis;
    digitalWrite(ledPin, HIGH); // schalte led an
    zaehler++;
  }
  if ((aktMillis - blitzMillis >= blitzZeit) && ledStatus)
  {
    digitalWrite(ledPin, LOW);
  }
  if ((aktMillis - warteMillis >= warteZeit) && zaehler == 5)
  {
    zaehler = 0;
  }
}

wtf....geil teste ich morgen mal....ok ich wurschteln mich mal durch und versuche es zu verstehen...danke

ist es ok das wenn ich fragen dazu habe, das ich einfach hier frage?

Nee Du hast ja lustige Ideen, Fragen stellen im Forum, sowas ;D

agmue:
Nee Du hast ja lustige Ideen, Fragen stellen im Forum, sowas ;D

Finde ich auch. Ziemlich dreist so ein Verhalten :wink: :smiley:

wusste ich's doch...