Doppelbelegung eines Tasters...

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
tiieto
Junior Member
**

Beiträge: 14
Registriert seit: Jan 2017
Bewertung: 0
#1
30.01.2017, 20:42

Hallo...

Ich habe am letzten Freitag damit begonnen in die Arduino Materie einzusteigen (da kam mein erster Arduino mega per Post nach Hause..)

Ich habe diverse Lernprogramme geschrieben (LED an, aus, fading, ablaufsteuerung, Taster einlesen, und & oder Verknüpfungen, etc..)

Dabei bin ich auf ein Problem gestoßen, welches ich jetzt noch nicht zu lösen vermag... - vielleicht geht das ja auch gar nicht..

Ist es möglich einen Taster für 2 unterschiedliche Funktionen zu programmieren?

Ich stelle mir das so vor:
Taster weniger als 2 sek gedrückt, LED an oder aus (Stromstossschalter - Öhm wie geht das? Vermutlich über das ändern einer Variablen?)

Drücke ich den Taster länger als 2 sek und die LED ist bereits an, möchte ich das die LED rauf und runter gedimmt wird bis ich den Taster wieder loslasse...

Lg..
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 728
Registriert seit: Apr 2014
Bewertung: 5
#2
30.01.2017, 22:41

Hallo Tiieto,

herzlich willkommen im Forum. Schön, dass Du Dich für den Arduino interessierst.

Zu Deiner Frage: Klar geht das.

Zugegeben, es ist nicht das primitivste Programm der Welt. Es gibt sogar verschiedene Lösungswege. Ich würde wie folgt vorgehen (wobei das jetzt nur ein Vorschlag ist und auch nicht den Anspruch auf "best practice" erhebt):

Prinzipiell würde ich den Taster in einem Interrupt abfragen. Also der Taster löst einen Interrupt aus und in der daraufhin gestarteten Routine machst Du den Rest.

Alternativ kannst Du den Taster natürlich in der Loop()-Schleife dauernd abfragen und sobald ein "High-Signal" anliegt, startest Du eine Routine, die den Rest macht.

In der Routine, die den Rest macht, musst Du natürlich prüfen, ob der Taster noch gedrückt ist oder eben nicht. Wenn nicht (also Signal = Low), startest Du eine Routine, die per Pulsweitenmodulation (Fader hast Du ja schon probiert) die LED dimmt (Ob die LED an oder aus ist, kannst Du per Variable speichern).

Sollte der Status weiterhin "High" sein, könntest Du entweder einen Zähler hochzählen, und so lange weiter zählen, bis 2 Sekunden um sind (Da müsstest Du wohl vorher herausfinden, wie lange der Zähler zählen muss, bis 2 Sekunden vorbei sind).

Die Alternative, zugegebenermaßen etwas komplexer, wäre es, einen Timer zu programmieren. Solche Timer sind im Chip bereits eingebaut. Mit dem Timer könntest Du solange warten, bis entweder der Taster losgelassen wird, bevor 2 Sekunden um sind oder eben bis 2 Sekunden um sind, um dann wieder eine Aktion durchzuführen.

Zugegeben... Das ist jetzt alles sehr theoretisch....

Hast Du denn Programmiererfahrung? Wie gut kennst Du Dich mit der Hardware des Mega aus? Hast Du das Datenblatt des Mega schon?

Gruß
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
tiieto
Junior Member
**

Beiträge: 14
Registriert seit: Jan 2017
Bewertung: 0
#3
30.01.2017, 23:28

Oje oje.... wo fang ich an...

Aaaaaalso... Programmiererfahrung hab ich...

SPS: Siemens S7 (FUP), AEG (AWL)

Steuerrelais: Siemens Logo, Moeller / Eaton Easy.

Programmiersprachen: HTML, PHP, MYSQL & etwas JavaScript

Mit der Hardware des Arduino Mega kenn ich mich nicht soooo gut aus, weiß nur das er Analoge & Digitale ein & Ausgänge hat wobei man die digitalen nach Belieben als ein oder Ausgang definieren kann...

Das Datenblatt hab ich noch nicht...

In der Zwischenzeit hab ich es hinbekommen das der Mega nur auf Tastendruck dimmt, aber der Rest... *tilt*

Lg...
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 728
Registriert seit: Apr 2014
Bewertung: 5
#4
31.01.2017, 12:34

Hallo Tiieto,

hier ist schon mal das Datenblatt: http://www.atmel.com/Images/Atmel-2549-8...asheet.pdf. Dieses ist absolut unverzichtbar bei der Arbeit mit dem Mikrocontroller. Viele Dinge werden einem zwar von der Entwicklungsumgebung des Arduino abgenommen, und viele Dinge werden ja auch von Bibliotheken erledigt, aber spezielle Dinge lassen sich häufig nur umsetzen, wenn man die Interna des Chips kennt.

Javascript ist insofern schon nicht schlecht, weil die Entwicklungsumgebung des Arduino ja auf der Programmiersprache C aufbaut. Und Javascript hat doch auch ein paar Ähnlichkeiten mit C. Das kann also helfen.

Deine Anforderung könnte, wie schon gesagt mit Timer erledigt werden. Hilfreiche Artikel findest Du hier:

https://www.arduino.cc/en/Reference/attachInterrupt

und hier:

http://playground.arduino.cc/Code/Timer1

Poste doch einmal Deinen Code hier im Forum. Mal sehen, ob wir daraus etwas basteln können, was Deine Anforderung erfüllt. Schön wäre es natürlich, wenn Du dann den Weg zum Ziel alleine finden würdest. Aber unterstützen kann ich gerne!

Gruß
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
tiieto
Junior Member
**

Beiträge: 14
Registriert seit: Jan 2017
Bewertung: 0
#5
31.01.2017, 19:29

Hallo...

Erstmal vielen Dank für das Datenblatt... Da hab ich bestimmt ne Woche dran zu lesen...

hier mein aktueller Programmcode, der 2 LEDs über einen jeweils zugewiesenen Taster und nur bei Betätigung des selben dimmt..

Code:
int LED= 11;
int LED2= 10;
int taster1= 2;
int taster2= 3;
int helligkeit= 0;
int helligkeit2= 0;
int fadeschritte= 5;

void setup()
{
pinMode(LED, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(taster1, INPUT);
pinMode(taster2, INPUT);
}

void loop()
{
analogWrite(LED, helligkeit);
analogWrite(LED2, helligkeit2);

if (digitalRead(taster2) == HIGH)
{

helligkeit = helligkeit + fadeschritte;
delay(25);

if (helligkeit == 0 || helligkeit == 255)
{
fadeschritte = -fadeschritte ;
}
}

if (digitalRead(taster1) == HIGH)
{

helligkeit2 = helligkeit2 + fadeschritte;
delay(25);

if (helligkeit2 == 0 || helligkeit2 == 255)
{
fadeschritte = -fadeschritte ;
}
}

}


Hab mich dann mal an die Programmierung eines Stromstoßschalters gemacht... Hat - bis auf ein paar kleine Anpassungen im delay - sofort funktioniert...

Jetzt muss da nur noch die Dimmfunktion mit rein...

Code:
int LED= 11;
int LED2= 10;
int taster1= 2;
int taster2= 3;
int lampe1=0;
int DELAY=250;


void setup()
{
pinMode(LED, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(taster1, INPUT);
pinMode(taster2, INPUT);
}

void loop()
{
if (digitalRead(taster1) == HIGH && lampe1 == 1)
  {
    lampe1 = 0;
    delay(DELAY);
  }
if (digitalRead(taster1) == HIGH && lampe1 == 0)
  {
    lampe1 = 1;
    delay(DELAY);
  }

if (lampe1 == 1)
  {
    digitalWrite(LED, HIGH);
  }
if (lampe1 == 0)
  {
    digitalWrite(LED, LOW);
  }

}


LG
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste