Go Down

Topic: Anfänger probleme (Read 821 times) previous topic - next topic

big-swordfish

Feb 18, 2018, 08:07 pm Last Edit: Feb 19, 2018, 06:50 pm by big-swordfish
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.

Code: [Select]
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++;}
}

Tommy56

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

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

postmaster-ino

#2
Feb 18, 2018, 08:40 pm Last Edit: Feb 18, 2018, 09:01 pm by postmaster-ino
Hi

Durch das
Code: [Select]
int 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.
Code: [Select]
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.
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

big-swordfish

#3
Feb 18, 2018, 08:55 pm Last Edit: Feb 18, 2018, 09:03 pm by big-swordfish
das mit dem code in diese codetags zu setzen muss ich morgen mal am Rechner machen...mit Handy will das nicht so recht klappen

big-swordfish

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

postmaster-ino

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 ;)
Lies Dir bitte den Nachtwächter durch (hatte ich zwei drüber editiert) und schaue, ob Du auf millis() umschwenken kannst/willst.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

big-swordfish

das in diesen 10 Sekunden nichts geht ist gewollt

big-swordfish

#7
Feb 18, 2018, 10:37 pm Last Edit: Feb 19, 2018, 06:49 am by big-swordfish
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.

Tommy56

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

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

big-swordfish

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

agmue

Code: [Select]
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?
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

big-swordfish

ein digispark muss so kompackt wie möglich sein

agmue

Ich mache Dir mal einen Vorschlag, getestet mit UNO:

Code: [Select]
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;
  }
}
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

big-swordfish

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

big-swordfish

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

Go Up