Taster am Arduino

Ich möchte gerne einen Belichtungskasten bauen (Hab ich auch schon) und diesen nun gerne über einen Attiny 84A ansteuern, da der ne555, der aktuel verbaut ist, ungünstig ist wenn man an der Zeit was nachbessern muss.

Das Prinziep ist einfach wenn man die Folie und die Platine reinlegt macht man den Deckel zu (im Deckel ist ein Taster der beim Verschließen ausgelöst wird) und das Gerät fängt an zu arbeiten.

Zwei Statuslampen Grün für "Kannste auf machen" rot für "Finger Weg" und ein Beeper für " ich bin fertig!"

Funktioniert auch alles super bis auf eine Tatsache.

Wenn der Deckel unten ist ist der Taster gedrückt und der Attiny sagt sich "eine neue Runde eine neue Wahnsinnsfahrt" und fängt direkt wieder an.

Ich möchte also mit meinem Code erreichen das er das abfragen des Tasters erst wieder aufnimmt wenn der Decke geöffnet und der Taster deaktiviert wurde.

Ich habe versucht das über eine BYTE Variabele zu lösen aber es funktioniert nicht bzw weis ich nicht wo ich diese am besten wieder abfrage

int Delay =500;
byte ButtonOn =0
;


void setup() {
 
  pinMode(0,   INPUT);//Button
  pinMode(1,  OUTPUT); //Lammpeweis
  pinMode(2,  OUTPUT);//LampeMitteRot
  pinMode( 3, OUTPUT);//LampeRechtsRot Beep
  pinMode( 7, OUTPUT);//Last 

    //Konfiguration Beim Einschalten
     digitalWrite(1, HIGH);
     digitalWrite(2, LOW);
     digitalWrite( 7, LOW);
     digitalWrite( 8, LOW);

     //Kurze beep Welle (fand ich irgendwie witzig)
       digitalWrite(3, HIGH);
       delay (5);
       digitalWrite(3, LOW);
       delay (50);
       digitalWrite(3, HIGH);
       delay (5);
       digitalWrite(3, LOW);
       delay (50);
       digitalWrite(3, HIGH);
       delay (5);
       digitalWrite(3, LOW);
}


void loop() {

 if (ButtonOn==0)//Abfragen ob der Taster Gedrückt wurde 0=nein
     {
    
  
if(digitalRead(0)==LOW) //jetzt gucken ob er gedruckt ist
  { ButtonOn==1;        //Speichern das er gedrückt wurde
  digitalWrite(1, LOW);//Status Wechseln
  digitalWrite(2, HIGH);//Status Wechseln
  digitalWrite( 7, HIGH);//Status Wechseln

  
   delay (Delay);//Belichtugnszeit abwarten
    digitalWrite(2, LOW);//Status Wechseln
    digitalWrite( 7, LOW);//Status Wechseln
    //das "ich bin fertig" Beepen)
    digitalWrite(3, HIGH);
    delay (5);
    digitalWrite(3, LOW);
    delay (50);
    digitalWrite(3, HIGH);
    delay (5);
    digitalWrite(3, LOW);
    delay (50);
    digitalWrite(3, HIGH);
    delay (5);
    digitalWrite(3, LOW);
    
    digitalWrite(1, HIGH);
      }// so und nun weis ich nicht so richtig weiter 
      
     }
   
  
    
    
     
}//Void

Du musst eine Statusvariable einbauen, die über den Taster gesetzt wird und erst wieder gelöscht wird, wenn der Taster seinen Zustand ändert.
Diese fragst du dann in der Loop ständig ab, welchen Zustand die Variable hat und reagierst entsprechend darauf.

Hallo,

na ja Du musst den Vorgang starten wenn der Deckel zu ist und vorher offen war. Flanke erhennen nennt man das.

wenn er Deckel zu ist und merker nicht gesetzt dann
merker setzen
Vorgang starten

Wenn Deckel nicht zu dann Merker rücksetzen

Du kannst auch noch einen Statusmerker verwenden "Vorgang läuft" und den mit einfliessen lassen

Heinz

Ja, normalerweise macht man sowas mit Flankenauswertung.

In deinem Fall sollte es aber auch einfacher gehen: Das ButtonOn lässt Du wieder weg, aber am Ende des Durchlaufs mit deinen delays fragst Du ab, ob der Taster noch gedrückt ist und machst erst dann weiter, wenn er wieder losgelassen wurde. Also etwa so:

 ...
    digitalWrite(1, HIGH);
    while(digitalRead(0)==LOW); //jetzt warten, bis er nicht mehr gedrückt ist.
    delay(10); // Prellen abwarten
  }// so und nun weis ich nicht so richtig weiter
  ...

Ist dann zwar eine klassische 'blockierende' Programmierung. Aber wenn dein ATtiny eh sonst nichts anderes machen soll, ist das auch ok.

Sehr geil, das "While" kannte ich noch gar nicht, ich glaub das wird mein neuer Liebling

Mathrim:
Sehr geil, das "While" kannte ich noch gar nicht, ich glaub das wird mein neuer Liebling

Das sollte es nicht werden , damit hängt der Sketch in einer Schleife fest und kann nichts anderes mehr machen.

Heinz

Mathrim:
Sehr geil, das "While" kannte ich noch gar nicht, ich glaub das wird mein neuer Liebling

Mantra:
Jedes vermiedene While ist ein gutes While.
Jedes vermeidbare While ist ein böses While.

Dazwischen gibt es die kleine Hysterese/Menge an unvermeidbaren While.
Man muss vor sich selber (und auch evtl. vor anderen) diese Entscheidung für While schlüssig begründen können.

Tipp:
Ersetze While in den Aussagen durch jedes beliebige andere Sprachkonstrukt,

Mathrim:
Sehr geil, das "While" kannte ich noch gar nicht, ich glaub das wird mein neuer Liebling

Wie schon von geschrieben wurde, dein 'Liebling' sollte es nicht gerade werden.
Aber in so einem simplen Fall wie bei deinem Kasten kann man das mal machen :wink:

ok ist also mit Vorsicht zu genießen...^^

Mal noch n anderes Problem

Um meine Lastkette zu schalten benutze ich einen BD441 Transistor (hat mit dem NE555 Super geklappt) mit dem Arduino wirds allerdings iwi nichts.

Ich hab das ganze mal skizziert BD411.PNG

Findet ihr den Fehler?

Hi

Möchte ein Transistor keinen Basis-Widerstand haben?
SO sollte Dir eigentlich der Arduino-Pin sterben, da hier NICHTS den Strom nach GND begrenzt.

... zum Glück für Deinen Arduino benutze ich Transistoren äußerst selten und dann eher intuitiv, meine Wahl sind N-FETs, kommen an die gleiche Steppe wie NPN und schalten ebenfalls 'GND' - nur halt per Spannung (max 20V G-S, S auf GND, D an der Last, Die an PLUS hängt), nicht per Strom.
Bei Ansteuerung mit TTL-SIgnal ist ein LL-FET (Logik-Level-FET) die Wahl - Der schaltet schon bei TTL-Pegel genug durch wo 'normale' FETs eher 10V am Gate 'sehen' wollen, bevor richtig was geht.

MfG

Ja, in der Schaltung fehlt definitiv der Basiswiderstand.

Wobei der BD441 für den Zweck etwas überdimensioniert ist. Oder sind das Leistungs-Leds?

Ne aber was anderes gab es bei uns im Dorfladen nicht und der nächst kleinere BC547 währe zu klein gewesen.

Mal ne andere Frage wenn beide, also er BD441 und der Arduino, eine Masse haben, aber nicht die selbe, also der Arduino ist über usb gespeißt und der Bd441 über ein 12V Netzteil Könnte das Probleme auslösen?
BZW kann ich die Massen einfach miteinander verbinden also vom GND vom Arduino einfach auf die Masse am Steckbret vom Netzteil?

BZW kann ich die Massen einfach miteinander verbinden also vom GND vom Arduino einfach auf die Masse am Steckbret vom Netzteil?

Ja, dafür solltest du sorge tragen, dass das möglich ist.

Du kennt das Wort "Stromkreis", oder?
Wenn auch nicht, trotzdem musst du sowas bauen.

oh man Gnd Verbunden läuft alles, manchmal hab ich echt Pech beim denken

na super, wenns jetzt läuft 8)

Mathrim:
... und der nächst kleinere BC547 währe zu klein gewesen.

Wieso? Wenn es normale standard-Leds sind, reden wir doch von Strömen nicht wesentlich über 20mA, wenn überhaupt. Das packt der BC547 locker. Bei 20mA liegt seine Sättigungsspannug im Schaltbetrieb sicher unter 0,5 V. Das macht eine Verlustleistung von 10mW. Das juckt den überhaupt nicht.

Nicht schätzen, mal auch ein bisschen rechnen :wink: