Pages: 1 [2]   Go Down
Author Topic: Auswahltaster für Programmabschnitt  (Read 1410 times)
0 Members and 1 Guest are viewing this topic.
Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2854
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aber erst als ich duch rumprobieren die Taster Massegeschalten gemacht habe.
War das Absicht?  Sowas bin ich nicht gewohnt.  smiley

Ja klar ist das Absicht. Ich bin ne faule Socke und habe keine Lust, externe PullDown-Widerstände an Buttons zu verschalten. Stattdessen schließe ich einen Button ohne externen Widerstand nur an GND und seinen Pin an und aktiviere mit INPUT_PULLUP den im Atmega eingebauten internen PullUp-Widerstand. Dadurch vertauscht sich die Programmlogik und ein gedrückter Button wird LOW, während ein nicht gedrückter Button HIGH liefert.

Der Sketch selbst ist aber für beides vorbereitet und Du brauchst nur INPUTTYPE im Sketch ändern.

Mir ist jetzt aufgefallen das das umschalten ja nur dann funktioniert, wenn der gerade aktive Loop am Ende ist und von vorne beginnt. (ist irgendwie logisch wo ich jetzt darüber nachdenke)
Ich weis noch nicht genau ob das bei dem was ich vorhab relevant ist.
Könnte man sowas noch umgehen?

Dass irgendwie dann eine loop0 zur Hälfte, eine loop1 zu zwei Drittel, eine loop2 zu ein fünftel und eine loop3 zu ein siebtel abgearbeitet ist und dann wird umgeschaltet?

Vergiß es oder frage in der betroffenen loop selber ab, ob noch die "richtige" LED für diese loop leuchtet und wenn nicht, verlasse die loop mit "return"!

Eine "normal" programmierte loop-Funktion läuft mehrere tausend mal pro Sekunde durch, sagen wir mal viertausend mal pro Sekunde. Dann erfolgt eine Umschaltung spätestens eine viertausendstel Sekunde, nachdem Du die Taste gedrückt hast.

Sag nicht, eine viertausendstel Sekunde ist zu lang als Umschaltdauer!

Wenn Deine loop nicht so oft läuft, dann liegt das vermutlich daran, dass Du mit "delay()" programmierst.
Gewöhne Dir halt das Programmieren mit delay() ab, das ist für ALLE interaktiven Programme absolut notwendig, wenn diese schnell auf Interaktionen reagieren solllen, z.B. auf gedrückte Buttons.
« Last Edit: October 21, 2013, 02:23:05 pm by jurs » Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ach so, mit Pullup wird der automatisch invertiert. Ist eigentlich klar wenn ich so darüber nachdenke.
Ich sollte wohl doch bei den analogen Schaltungen bleiben....

Ja, ich hab zum testen ein einfaches Blink-Programm reingeschrieben, da war eben dieses delay dabei.
Wieder was gelernt.

Das Programm läuft übrigens so wie ich es mir vorgestellt habe, habs ausprobiert.
Danke, du hast mir sehr geholfen!
Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hab doch noch ein Problem....


Hab den eigentlichen Programmcode zum testen nur in einen Loop geschrieben (in den andern loops was anderes) und da hat es funktioniert, wenn ich ihn auch in die anderen schreibe funktioniert es nicht.

Im Loop steht z.B.:

Code:
void loop0()
{
  if (irrecv.decode(&results))    // have we received an IR signal?
  {                              // Serial.println(results.value, HEX);  UN Comment to see raw values
    translateIR();
    irrecv.resume();              // receive the next value
  }
 
}
void translateIR()             // takes action based on IR code received                            
                               // describing KEYES Remote IR codes
{
  switch(results.value)
  {
  case 0x9B83842D: Keyboard.write('1');    break;         // 1
  case 0x30CD5BE2: Keyboard.write('2');    break;         // 2
  case 0xD051C300: Keyboard.write('3');    break;         // 3
  case 0x613F0C2D: Keyboard.write('4');    break;         // 4
  case 0xC17C1F16: Keyboard.write('5');    break;         // 5
  case 0x91799AD5: Keyboard.write('6');    break;         // 6
  case 0x30137BB8: Keyboard.write('7');    break;         // 7
  case 0x22C5F96C: Keyboard.write('8');    break;         // 8
  case 0x722B04B6: Keyboard.write('9');    break;         // 9
  }
  delay(20);          
}


Das liegt ja sicher daran das der loop aus ist und "void translateIR()" anfängt. Was ja irgendwas eigenes zu sein scheint.
So viel kenn ich mich leider noch nicht aus.
Kann man das irgendwie richtig reinschreiben oder hab ich so generell ein Problem?
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2854
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab den eigentlichen Programmcode zum testen nur in einen Loop geschrieben (in den andern loops was anderes) und da hat es funktioniert, wenn ich ihn auch in die anderen schreibe funktioniert es nicht.

Vermeide "es", das nicht funktioniert (was immer das auch sein mag) und Du bist auf gutem Wege!
Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Habs hinbekommen, schön langsam kapier ich das ganze.

Gibts eigentlich keinen Befehl um eine LED nur kurz aufblinken zu lassen? Anscheinend nicht, sonnst hätt ich was gefunden.
Mit Einschalten, Pause und Ausschalten ist ja auch irgendwie blöd.

Hier der fertige Code mit Sendebeispielen, villeicht hilfs noch jemanden.

Code:
#define INPUTTYPE INPUT_PULLUP
#include "IRremote.h"

byte taster[]={4,5,6};
byte leds[]={8,9,10};
int led = 13;
int receiver = 11;                 // receiver input pin

IRrecv irrecv(receiver);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'

void setup()
{
  for (int i=0;i<3;i++)
  {
    pinMode(taster[i],INPUTTYPE);
    pinMode(leds[i],OUTPUT);
    pinMode(led, OUTPUT);
  }
  setProgram(0);                      // Erstes Programm einstellen

  irrecv.enableIRIn();           // startet den Receiver
  Keyboard.begin();              // startet Keybord


}

void setProgram(byte b)
                                                    // Schaltet die LED des zugeordneten Programms ein
                                                      // Parameter b: zu setzendes Programm
{
  for (int i=0;i<3;i++)
  {
    if (i==b)                                       // bei gesetztem Programm LED ein
      digitalWrite(leds[i],HIGH);
    else                                                  // sonst LED aus
      digitalWrite(leds[i],LOW);
  }
}

void handleButton()
                                                   // Funktion setzt die LED, die der zuletzt gedrückten Taste zugeordnet ist
{
  for (int i=0;i<3;i++)
  {
    byte pressed=digitalRead(taster[i]);
    if (INPUTTYPE==INPUT_PULLUP) pressed=!pressed;                      // vertauschte Logik
    if (pressed) setProgram(i);
  } 
}

void loop0()
{
  if (irrecv.decode(&results))    // Wenn ein Signal empfangen wird
  {
    translateIR();                // führt Funktion translateIR aus
    irrecv.resume();              // warte auf nächstes Signal
    digitalWrite(led, HIGH);      // Statusled leuchtet kurz auf
    delay(20);
    digitalWrite(led, LOW);
  }
}


void loop1()
{
  if (irrecv.decode(&results))    // Wenn ein Signal empfangen wird
  {
    translateIR1();               // führt Funktion translateIR1 aus
    irrecv.resume();              // warte auf nächstes Signal
    digitalWrite(led, HIGH);      // Statusled leuchtet kurz auf
    delay(20);
    digitalWrite(led, LOW);
  }             
}


void loop2()
{
  if (irrecv.decode(&results))    // Wenn ein Signal empfangen wird
  {
    translateIR2();               // führt Funktion translateIR2 aus
    irrecv.resume();              // warte auf nächstes Signal
    digitalWrite(led, HIGH);      // Statusled leuchtet kurz auf
    delay(20);
    digitalWrite(led, LOW);
  }   
}


void loop()
{
  handleButton();
  byte program=0;
  for (int i=0;i<3;i++)
  {                                                    // das gerade gesetzte Programm aus der gerade leuchtenden LED abfragen
    if (digitalRead(leds[i])) program=i;
  } 
  switch(program)                                     // Loopauswahl
  {
    case 0: loop0();break;
    case 1: loop1();break;
    case 2: loop2();break;
  }

 
}


void translateIR()                                          // Tastenauswahl für erstes Programm
{
  switch(results.value)
  {
  case 0x9B83842D: Keyboard.write('1');    break;         // 1
  case 0x30CD5BE2: Keyboard.write('2');    break;         // 2
  case 0xD051C300: Keyboard.write('3');    break;         // 3
  case 0x613F0C2D: Keyboard.write('4');    break;         // 4
  case 0xC17C1F16: Keyboard.write('5');    break;         // 5
  case 0x91799AD5: Keyboard.write('6');    break;         // 6
  case 0x30137BB8: Keyboard.write('7');    break;         // 7
  case 0x22C5F96C: Keyboard.write('8');    break;         // 8
  case 0x722B04B6: Keyboard.write('9');    break;         // 9
  }
  delay(20);
}


void translateIR1()                                         // Tastenauswahl für zweites Programm
{
  switch(results.value)
  {
  case 0x9B83842D: Keyboard.write('a');    break;         // 1
  case 0x30CD5BE2: Keyboard.write('b');    break;         // 2
  case 0xD051C300: Keyboard.write('c');    break;         // 3
  case 0x613F0C2D: Keyboard.write('d');    break;         // 4
  case 0xC17C1F16: Keyboard.write('e');    break;         // 5
  case 0x91799AD5: Keyboard.write('f');    break;         // 6
  case 0x30137BB8: Keyboard.write('g');    break;         // 7
  case 0x22C5F96C: Keyboard.write('h');    break;         // 8
  case 0x722B04B6: Keyboard.write('i');    break;         // 9
  }
  delay(20);
}


void translateIR2()                                         // Tastenauswahl für drittes Programm
{
  switch(results.value)
  {
  case 0x9B83842D: Keyboard.write('j');    break;         // 1
  case 0x30CD5BE2: Keyboard.write('k');    break;         // 2
  case 0xD051C300: Keyboard.write('l');    break;         // 3
  case 0x613F0C2D: Keyboard.write('m');    break;         // 4
  case 0xC17C1F16: Keyboard.write('n');    break;         // 5
  case 0x91799AD5: Keyboard.write('o');    break;         // 6
  case 0x30137BB8: Keyboard.write('p');    break;         // 7
  case 0x22C5F96C: Keyboard.write('q');    break;         // 8
  case 0x722B04B6: Keyboard.write('r');    break;         // 9
  }
  delay(20);
}
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Gibts eigentlich keinen Befehl um eine LED nur kurz aufblinken zu lassen?
Mit Einschalten, Pause und Ausschalten ist ja auch irgendwie blöd.
smiley-wink Du bräuchtest 3 verschiedene Befehle  (kurz, mittelkurz, ganzkurz)  , das wäre noch viel blöder smiley-wink

So kannst du dir die gewünschte Funktion nach Geschmack selber bauen:
Kann loop() warten bis du fertig geblinkt hast ?  Dann schreib und nimm sowas:
Code:
     blink(pin,dauer); // wartet <Dauer> msec
Willst du regelmäßig blinken und nur beim Start Frequenz und Dauer ( oder an/aus -Zeiten ) ändern ?  Dann such mal nach den diversen Leuchtturm - Diskussionen hier ...


« Last Edit: November 01, 2013, 04:39:01 am by michael_x » Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Du bräuchtest 3 verschiedene Befehle  (kurz, mittelkurz, ganzkurz)  , das wäre noch viel blöder

das stimmt allerdings...  smiley
Logged

Pages: 1 [2]   Go Up
Jump to: