INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Switch Case, LEDs bleiben an, Bedingung aber falsch
15.11.2014, 17:59
Beitrag #1
Switch Case, LEDs bleiben an, Bedingung aber falsch
Hey Leute Smile

ich hab leider beim Programmieren irgendwie einen Fehler begangen... Ziel meines Programms ist es, mit einem Mega 2560 und LED's über verschiedene Outputs, einen Prototypen für ein späteres Automatik Getriebe im Modellbau zu erstellen. Die LED's sollen quasi eine sichtbare HIGH/LOW Stellung der späteren Hubmagnete darstellen (Wenn die eine LED angeht, dann weiß ich, dass später dort das Hubmagnet auch spielen wird)

Soviel zur Intro, ich hoffe ihr kommt nach, ansonsten könnt ihr gerne fragen Smile

Von der Schaltung her ist es denke ich in Ordnung, ein Output, die LED, ein Widerstand und das Ganze geht zum GND.

Der Code ist von der Syntax her denke ich auch okay, der Compiler von Arduino hat jedenfalls keine Fehlermeldung gebracht.

Nun aber zum Problem (Code folgt):
Eigentlich sollte, je nachdem wie lange der eine Schalter betätigt wird (Zeit wird über "PulseIn" gemessen), die eine oder andere LED angehen.

Die Zeit wo PulseIn auf HIGH ist, wird mal 4 multipliziert und ergibt einen bestimmten Wert (Das ist dann in der Praxis die benötigte Zeit für eine Umdrehung von der Abtriebswelle, diese Zahl soll dann eben einem bestimmten Gang bzw. bestimmtem Hubmagnet entsprechen).
Der Wert ("4*zeitproviertelumdrehung") wird gemappt, damit ich eine gemütliche Switch Case Anweisung benutzen kann, sprich:
-Liegt die benötigte Zeit für eine Umdrehung bei einem bestimmten Wert, dann soll auch die entsprechende LED (später Hubmagnet) angehen.

Wider Erwartungen gehen die LEDs nicht wieder aus sondern bleiben auf HIGH...

betätige ich den Schalter mit der Zeit a, geht meine LED a an. Da aber mein PulseIn wieder auf LOW ist, sollte ja die LED wieder ausgehen.
Betätige ich den Schalter mit der Zeit b, geht die LED b an, die LED a ist aber auch noch an.

Ich vermute, dass meine Variable irgendwie nicht zurückgesetzt wird, ich weiß aber nicht wie man im konkreten sowas angibt. Ich bitte um Hilfe Smile

Code:

int pin11 = 11;
void setup()
{
pinMode(pin11, INPUT);
pinMode(pin12, INPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}
void loop()
{
unsigned long zeitproviertelumdrehung; //Zeit pro Viertelumdrehung
unsigned long tproRot; //Zeit pro Umdrehung
unsigned long Gangart; //Drehzahlbereich für welchen Gang
zeitproviertelumdrehung = pulseIn(pin11, HIGH, 200000);
tproRot = 4 * zeitproviertelumdrehung;
Gangart = map(tproRot, 0, 800000, 1, 12);
switch(Gangart)
{
case 1 : digitalWrite(2, HIGH);
break;
case 2 : digitalWrite(2, HIGH);
break;
case 3 : digitalWrite(3, HIGH);
break;
case 4 : digitalWrite(3, HIGH);
break;
case 5 : digitalWrite(4, HIGH);
break;
case 6 : digitalWrite(4, HIGH);
break;
case 7 : digitalWrite(5, HIGH);
break;
case 8 : digitalWrite(5, HIGH);
break;
case 9 : digitalWrite(6, HIGH);
break;
case 10 : digitalWrite(6, HIGH);
break;
case 11 : digitalWrite(7, HIGH);
break;
case 12 : digitalWrite(7, HIGH);
break;
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.11.2014, 19:16 (Dieser Beitrag wurde zuletzt bearbeitet: 15.11.2014 20:50 von Bitklopfer.)
Beitrag #2
RE: Switch Case, LEDs bleiben an, Bedingung aber falsch
öhm ganz einfach, wo hast du z.B.:
case 14 : digitalWrite(3, LOW);
stehen ? Nur einschalten schaltet eben nie ab...
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.11.2014, 19:46
Beitrag #3
RE: Switch Case, LEDs bleiben an, Bedingung aber falsch
(15.11.2014 17:59)luto92 schrieb:  
Code:
switch(Gangart)
  {
    case 1 : digitalWrite(2, HIGH);
    break;
    case 2 : digitalWrite(2, LOW);
    break;
    case 3 : digitalWrite(3, HIGH);
    break;
    case 4 : digitalWrite(3, LOW);
    break;
    case 5 : digitalWrite(4, HIGH);
    break;
    case 6 : digitalWrite(4, LOW);
    break;
    case 7 : digitalWrite(5, HIGH);
    break;
    case 8 : digitalWrite(5, LOW);
    break;
    case 9 : digitalWrite(6, HIGH);
    break;
    case 10 : digitalWrite(6, LOW);
    break;
    case 11 : digitalWrite(7, HIGH);
    break;
    case 12 : digitalWrite(7, LOW);
    break;
  }

Das ist glaube ich das was du meinst. Passierst du alle zustände im Sitch case also kann es passieren das du ein Case überspringst das er einen nicht ausschaltet.
ansonsten eine zusätzlich funktion dazu das erst mal alle LED ausmacht und deine die du brauchst an
Wenn ich so nachdenke muss ja dann immer ein Gang einglegt sein.
dann braüchtest du weniger "Gangaarten"
Code:
{
    case 1 : digitalWrite(2, HIGH);
    break;
    case 2 : digitalWrite(2, LOW);
                 digitalWrite(3, HIGH);
    break;
    case 3 : digitalWrite(3, LOW);
                 digitalWrite(4, HIGH);
    break;
    case 4 : digitalWrite(4, LOW);
                 digitalWrite(5, HIGH);
    break;
    case 5 : digitalWrite(5, LOW);
                digitalWrite(6, HIGH);
    break;
    case 6 : digitalWrite(6, LOW);
                digitalWrite(7, HIGH);
    break;
    case 7  : digitalWrite(7, LOW);
    break;

So was in der Art. Beschreibe mal genauer was du willst. (Drehzahlabhänige Gangvorwahl?)
Gruß
DerDani
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.11.2014, 20:34
Beitrag #4
RE: Switch Case, LEDs bleiben an, Bedingung aber falsch
Hallo,
ich meine, im Setup() solte man die Ausgänge auf LOW setzen, also ordentlich initialisieren.
Der Rest hängt davon ab, was passieren soll.
Bitte mal genauer beschreiben.
Gruß Joe

Unser Projekt Rolleyes http://global-science-circle.net http://global-science-circle.org http://global-science-circle.info UND http://radio-gsc1.info
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.11.2014, 16:52 (Dieser Beitrag wurde zuletzt bearbeitet: 16.11.2014 16:54 von luto92.)
Beitrag #5
RE: Switch Case, LEDs bleiben an, Bedingung aber falsch
Erst mal danke für die rasche Antworten.

Dass man die wieder auf LOW setzen muss, wusste ich gar nicht :/ ich dachte, sobald der Loop beendet wird geht alles aus und fängt von vorne wieder an.

Jedenfalls weiß ich wo jetzt das Problem liegt und werde es beseitigen.

In meinem Hobby (Modellbau) fokussiere ich mich in letzter Zeit auf den Antriebsstrang.
Mein 6-Gang Getriebe ist im Maßstab 1:6 und soll während dem RC Steuern selbstständig schalten. Ich werde aber nicht mit Hydraulik arbeiten sondern mit Magneten und Schubstangen-Schaltung wie man es vom klassischen manuellen PKW Getriebe kennt, das ist sauber und erfordert weniger Arbeit.
Nun aber zum Konkreten:

Je höher die Drehzahl der Abtriebswelle am Getriebe, desto höher der eingelegte Gang. Die Schaltstrategie soll im Prinzip sich ähnlich verhalten wie eine Vollgas-Beschleunigung mit voller Drehzahl-Ausnutzung. Es wird also Gang für Gang geschaltet, sprich wenn die Abtriebswelle die Drehzahl erreicht, bei dessen der Elektromotor an seiner Höchstdrehzahl ist (oder kurz davor), wird der nächste Gang eingelegt.
(Ein Verbrenner hat für mich zuviel Power, außerdem möchte ich später eventuell ein Sound-Modul entwickeln, da ist der E-Motor wesentlich diskreter)
Auf der elektronischen Seite sieht das so aus:

Auf der Abtriebswelle ist eine Art Nocke, die 25% bzw. 90° einer Umdrehung einen Schalter betätigt (Ähnlich einer Nockenwelle beim Verbrenner mit Ventilen).
Die Zeit, die der Schalter im ON-Modus ist, wird über PulseIn(pinnummer, HIGH, 200000) gemessen. Der delay ist dabei für das Verständnis erstmal irrelevant.
Die Zeit wird mit 4 multipliziert und man erhält somit die benötigte Zeit für eine volle Umdrehung.
Mit diesem Wert arbeitet das Programm. Der ist nämlich im Zusammenhang mit der Drehzahl. Ob ich nun die Drehzahl oder eben die benötigte Zeit für eine Umdrehung als entscheidender Faktor für meine Schaltstrategie benutze ist im Prinzip egal, Hauptsache die Berechnungen sind richtig...

Im Drehzahlbereich 1 (z.B. U/min = 0 bis U/min = 200) soll digitalWrite im Pin 2 auf HIGH schalten und somit ein Hubmagnet tätigen, welches den ersten Gang einlegt. Der Pin 1 wird für diesen Zweck nicht benutzt.
Sobald die Drehzahl die 200 U/min überschreiten sollte und sich im Drehzahlbereich 2 befindet (angenommen 201 bis 800 U/min) muss Pin 2 auf LOW sein und dann Pin 3 auf HIGH geschaltet werden. An Pin 3 ist dann ein weiteres Hubmagnet getätigt und legt den zweiten Gang ein. Insgesamt sind also 6 Hubmagnete nötig.
Für die anderen Gänge geht es logischerweise so weiter. Sollte ich meine Fahrzeuggeschwindigkeit reduzieren und somit die Drehzahl runtergehen lasse, soll das Programm selbstverständlich runterschalten. (Immerhin will ich keinen Dragster bauen indem immer von 0 auf Vmax beschleunigt wird sonder eher ein Sportwagen oder Cruiser).

Ich hoffe meine Erklärung war verständlich Smile

Meine Überlegung war auch, bei Teillast oder für die Fahrzeugtechnik-Laien, wenn man halt nicht gerade viel Gas gibt, ein Gang runterzuschalten und somit ein authentischeres Schaltverhalten darstellen. Man stelle sich vor, in der Stadt mit 50 km/h nicht mehr im ersten Gang zu fahren sondern eben den Dritten oder Vierten (ich weiß beim 9 Gang von Mercedes wäre evtl. der 6te Gang drin aber sei es drum Wink ).
Für diese Funktion habe ich gedacht, ich zapfe die PWM-Signale vom Empfänger zum Fahrtregler ab und weiß dann quasi wie viel Gas ich gerade an der Fernbedienung gebe. Sollte die Periodendauer einer Belastung von < 50 % entsprechen, geht der Programmablauf über einen anderen Zweig der analog wie der oben erklärte Algorithmus arbeitet aber halt mit anderen Drehzahlbereichen.

Salopp gesagt: Bin ich mit Vollgas im ersten Gang bei 50 km/h so könnte ich auch vom Gas runtergehen und den vierten reinlegen.

Mfg Lucas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Pulsierende LEDs KBLc 4 190 20.10.2016 22:35
Letzter Beitrag: hotsystems
  Unterschiedliche Programme durch Switch/ Case SpeedShifter 26 626 04.10.2016 15:29
Letzter Beitrag: SpeedShifter
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 227 16.09.2016 20:36
Letzter Beitrag: Datatom
  Can-Bus Shield ok, aber keine Daten Clubsport 38 1.546 01.09.2016 14:17
Letzter Beitrag: Clubsport
  Switch/Case mit chars phischmi 8 341 24.07.2016 21:00
Letzter Beitrag: phischmi
  if Bedingung einfügen gronph 5 458 20.03.2016 13:56
Letzter Beitrag: gronph
  WS2812 Helligkeit einzelner LEDs steuern mavericklp 3 666 11.03.2016 09:32
Letzter Beitrag: torsten_156
  DMX Signal mit Arduino empfangen, aber wie? mat21his 4 671 28.01.2016 16:20
Letzter Beitrag: ardu_arne
  OLED Display anzeige von Logo falsch ! b3ta 0 339 23.01.2016 15:12
Letzter Beitrag: b3ta
  erledigt: atan2 rechnet falsch? HaWe 0 346 30.11.2015 17:29
Letzter Beitrag: HaWe

Gehe zu:


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