Arduino Forum

International => Deutsch => Topic started by: big-swordfish on Feb 18, 2018, 08:07 pm

Title: Anfänger probleme
Post by: big-swordfish on Feb 18, 2018, 08:07 pm
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++;}
}
Title: Re: Anfänger probleme
Post by: Tommy56 on Feb 18, 2018, 08:09 pm
Setze Deinen Sketch bitte in Codetags (</> oben links im Forumseditor). Dann ist er für alle besser lesbar.

Gruß Tommy
Title: Re: Anfänger probleme
Post by: postmaster-ino on Feb 18, 2018, 08:40 pm
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 (https://forum.arduino.cc/index.php?topic=423688.0) an.
Das Blink_without_delay Beispiel in der IDE schadet auch nicht, wird beim Nachtwächter aber eh erwähnt.
Title: Re: Anfänger probleme
Post by: big-swordfish on Feb 18, 2018, 08:55 pm
das mit dem code in diese codetags zu setzen muss ich morgen mal am Rechner machen...mit Handy will das nicht so recht klappen
Title: Re: Anfänger probleme
Post by: big-swordfish on Feb 18, 2018, 09:04 pm
also sollte ich es so programmieren
 laser an...Delay....laser aus....
Title: Re: Anfänger probleme
Post by: postmaster-ino on Feb 18, 2018, 09:06 pm
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
Title: Re: Anfänger probleme
Post by: big-swordfish on Feb 18, 2018, 09:10 pm
das in diesen 10 Sekunden nichts geht ist gewollt
Title: Re: Anfänger probleme
Post by: big-swordfish on Feb 18, 2018, 10:37 pm
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.
Title: Re: Anfänger probleme
Post by: Tommy56 on Feb 18, 2018, 10:41 pm
Ja, i wieder auf 0 setzen, wenn ich Dich richtig verstanden habe.

Gruß Tommy
Title: Re: Anfänger probleme
Post by: big-swordfish on Feb 19, 2018, 05:43 pm
mach ich das über eine if Funktion im Loop selber oder ausserhalb des Loops?
Title: Re: Anfänger probleme
Post by: agmue on Feb 19, 2018, 06:23 pm
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?
Title: Re: Anfänger probleme
Post by: big-swordfish on Feb 19, 2018, 06:52 pm
ein digispark muss so kompackt wie möglich sein
Title: Re: Anfänger probleme
Post by: agmue on Feb 19, 2018, 07:03 pm
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;
  }
}
Title: Re: Anfänger probleme
Post by: big-swordfish on Feb 19, 2018, 07:07 pm
wtf....geil teste ich morgen mal....ok ich wurschteln mich mal durch und versuche es zu verstehen...danke
Title: Re: Anfänger probleme
Post by: big-swordfish on Feb 19, 2018, 07:14 pm
ist es ok das wenn ich fragen dazu habe, das ich einfach hier frage?
Title: Re: Anfänger probleme
Post by: agmue on Feb 19, 2018, 07:55 pm
Nee Du hast ja lustige Ideen, Fragen stellen im Forum, sowas  ;D
Title: Re: Anfänger probleme
Post by: scaniagigaliner on Feb 19, 2018, 08:09 pm
Nee Du hast ja lustige Ideen, Fragen stellen im Forum, sowas  ;D

Finde ich auch. Ziemlich dreist so ein Verhalten ;) :D
Title: Re: Anfänger probleme
Post by: big-swordfish on Feb 19, 2018, 08:25 pm
wusste ich's doch...