Pages: [1]   Go Down
Author Topic: Tacho mit 4x 7-Segment Anzeigen  (Read 2493 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

Ich bin gerade dabei einen Tacho zu basteln. Das Selfmade-Shield dazu habe ich schon fast fertig. Man kann schon eine 2-stellige 7-Segment-anzeige ansteuern. Pin-Belegung sieht so aus:

Digital 0: Segmente A (TX und RX brauche ich sowieso nicht, deswegen kann ich die Pins ruhig belegen)
Digital 1: Segmente B
Digital 2: Segmente C
Digital 3: Segmente D
Digital 4: Segmente E
Digital 5: Segmente F
Digital 6: Segmente G

PWM 9: Reed-Kontakt

Digital 10: Anzeige 4 gemeinsame Anode
Digital 11: Anzeige 3 gemeinsame Anode
Digital 12: Anzeige 2 gemeinsame Anode
Digital 13: Anzeige 1 gemeinsame Anode

Bei einer Anzeige funktioniert natürlich alles wunderbar. Wenn ich jetzt jedoch auch eine andere Zahl auf der anderen 7-Segment-Anzeige anzeigen will, klappt es nicht. Will ich auf Anzeige 1 eine 9 anzeigen, und auf Anzeige 2 eine 2, wird auf beiden Anzeigen eine 8 angezeigt. Obwohl ich meiner meinung nach alles richtig gemacht habe. Will ich was auf anzeige 1 anzeigen, Pin 13 auf HIGH, Pin 12 auf LOW, und dann mit pinMode die Segmente auf INPUT. Das selbe dann umgekehrt mit der 2. anzeige, und das ganze dann ganz schnell hintereinnander.

Hier mein Code:

Code:
int za[] = {1,2,3,4,5,6,7};
int z0[] = {1,2,3,4,5,6};
int z1[] = {2,3};
int z2[] = {1,2,4,5,7};
int z3[] = {1,2,3,4,7};
int z4[] = {2,3,6,7};
int z5[] = {1,3,4,6,7};
int z6[] = {1,3,4,5,6,7};
int z7[] = {1,2,3};
int z8[] = {1,2,3,4,5,6,7};
int z9[] = {1,2,3,4,6,7};

int anzeige[] = {13,12,11,10};


void setup()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
}


void loop()
{
  ZeigeAn(9, 0);
  ZeigeAn(2, 1);
}


void ZeigeAn(int w, int a)
{
  digitalWrite(anzeige[a], HIGH);
 
  for(int i=0;i<7;i++)
  {                     
    pinMode(za[i]-1, INPUT);
  }
 
  switch(w)
  {
  case 0:
    for(int i = 0; i < 6; i++)
    {
      pinMode(z0[i]-1, OUTPUT);
    }
    break;
  case 1:
    for(int i = 0; i < 2; i++)
    {
      pinMode(z1[i]-1, OUTPUT);
    }
    break;
  case 2:
    for(int i = 0; i < 5; i++)
    {
      pinMode(z2[i]-1, OUTPUT);
    }
    break;
  case 3:
    for(int i = 0; i < 5; i++)
    {
      pinMode(z3[i]-1, OUTPUT);
    }
    break;
  case 4:
    for(int i = 0; i < 4; i++)
    {
      pinMode(z4[i]-1, OUTPUT);
    }
    break;
  case 5:
    for(int i = 0; i < 5; i++)
    {
      pinMode(z5[i]-1, OUTPUT);
    }
    break;
  case 6:
    for(int i = 0; i < 6; i++)
    {
      pinMode(z6[i]-1, OUTPUT);
    }
    break;
  case 7:
    for(int i = 0; i < 3; i++)
    {
      pinMode(z7[i]-1, OUTPUT);
    }
    break;
  case 8:
    for(int i = 0; i < 7; i++)
    {
      pinMode(z8[i]-1, OUTPUT);
    }
    break;
  case 9:
    for(int i = 0; i < 6; i++)
    {
      pinMode(z9[i]-1, OUTPUT);
    }
    break;
  }
  digitalWrite(anzeige[a],LOW);
}

Könnte mir pls einer sagen was ich falsch mache?
Schonmal danke im Vorraus

MFG, Robdeflop®
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ein Arduino-Augang kann kaum den gemeinsamen Pin des Displays treiben (der Strom ist wahrscheinlch zu groß).
Nimm einen MAX7219 mit dazugehöriger Bibliothek.
Der macht alles alleine (Decodierung, multiplex, Strombegrenzung) bis zu 8 Digit, brucht aber ein Display mit gemeinsamer Katode.
Grüße Uwe
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

Habs auch so geschafft^^
Es wird problemlos eine 4-Stellige Zahl angezeigt. Habe
Code:
  for(int i=0;i<7;i++)
  {                     
    pinMode(za[i]-1, INPUT);
  }

ans ende der "ZeigeAn" funktion gesetzt, dann ging es.

Jetzt habe ich aber nen neues Problem. Mit der Funktion muss ich ja sozusagen vordefinieren, an welcher 7-Segment-Anzeige welche Zahl angezeigt werden soll. Deswegen hab ich ne neue "Funktion" geschrieben, die eine Zahl sozusagen Splittet und dann von alleine an der richtigen Stelle ausgibt:

Code:
void Anzeigen(int wert)
{
  char buffer[3];
  itoa(wert, buffer, 10);
  ZeigeAn(buffer[0], 0);
  ZeigeAn(buffer[1], 1);
  ZeigeAn(buffer[2], 2);
}

Wenn ich die funktion "ZeigeAn" normal verwende, z.B. einfach in Loop ZeigeAn(8, 1) mache, geht es wunderbar. Hab auch schon 3 Verschiedene Timer laufen lassen, die hochgezählt haben (seperat für jede 7-Segment Anzeige), auch da ging alles. Nur jetzt beim Zerlegen wird nix angezeigt, das was rauskommt fällt also nicht ins raster der switch-case. Wenn ich die zerlegten werte aber printe, stimmen diese, so wie es sich gehört oO

MFG, Robdeflop®
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

Habs geschafft xD Ich idiot hab malwieder nen Denkfehler gehabt^^ Musste bei Switch natürlich dann chars abfragen anstatt variablen (is doch richtig ausgedrückt?) Also "case '1':" usw. Ich mach iwie sogut wie immer Flüchtigkeitsfehler :/
So, jez noch die Umrechnung auf km/h dann sollte der Tacho gehen smiley

MFG, Robdeflop®
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

So, mit dem Anzeigen habe ich nun keine probleme mehr. Vielmehr hab ich jetzt eins bei der Berechnung der Geschwindigkeit^^
Ich bekomme immer 0 angezeigt. Die abfrage funzt glaube ich. Signal ist geglättet, mit Kondensator parallel zum Reed-kontakt:

Code:
void loop()
{
  if(digitalRead(PINsensor))
  {
    if(zustand == 0)
    {
      zeit = millis() - millisalt;
      kmh = 0.0005 / (zeit / 1000) * 3.6;
      zustand = 1;
      millisalt = millis();
    }
    else
    {
    }
  }
  else
  {
    zustand = 0;
  }
 
  Anzeigen(floatround(kmh));
}

Die Formel zum berechnen der Km/h ist richtig oder?
Ich messe die Zeit, wie lange für eine Umdrehung gebraucht wird. Das wird dann halt mit der Formel "km/zeit (sec) * 3,6" in Km/h umgerechnet.
Pro umdrehung legt mein RC-Monstertruck 50 cm zurück, deswegen 0,0005 km.

Kann das Ardu den kram überhaupt so schnell verarbeiten?

MFG, Robdeflop®
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Signal ist geglättet, mit Kondensator parallel zum Reed-kontakt:
Wieso geglättet? Hast Du pullup- oder pulldown- Widerstand? Laß den Kondensator weg.
Grüße Uwe
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

Ich meinte entprellt^^ Man kann doch mit nem Kondi entprellen? Weil oft ist es ja so (bei tastern usw), dass wenn man drückt oder loslässt das Signal pulsiert. Kann es nicht richtig ausdrücken, finde im mom keine worte dafür smiley-grin also die schalten beim drücken oder loslassen schnell aus und ein. Oder ist dies bei einem Reed-kontakt nicht so? Zudem sollte ich ja eigendlich trotzdem etwas angezeigt bekommen, tut es aber nicht. Immer nur 0. Ohne Kondensator das selbe.

Der Reed-kontakt hängt an einem Digitalen pin, der zudem noch mit einem 10k Ohm widerstand auf masse hängt, damit bei geöffnetem Reedkontakt keine Fehlmessungen gibt. Ist also Pulldown, oder? smiley-grin

Kann das auch an der Rechnung liegen? Meines erachtens nach ist die richtig.
Ich lass gleich einfach mal nur die Millis anzeigen anstatt die km/h, ob das wenigstens richtig gemessen wird.

MFG, Robdeflop®
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Robdeflop
Soviel ich weiß, prellen Reedkontakte nicht.
Quote
Der Reed-kontakt hängt an einem Digitalen pin, der zudem noch mit einem 10k Ohm widerstand auf masse hängt, damit bei geöffnetem Reedkontakt keine Fehlmessungen gibt. Ist also Pulldown, oder?
Ja Pulldown, der Reedkontakt hängt zwischen digitalen Pin und 5V???
 
Ja versuch mal die Zeit ( millis() - millialt) anzuzeigen.

Quote
kmh = 0.0005 / (zeit / 1000) * 3.6;
Mann sollte so wenig wie möglich rechnungsoperatione machen; alle konstanten kann man vorher ausrechnen:
0,0005*1000*3,6 brauchst Du nicht jedesmal berechnen. Setze einfach  1,8 ein.
also kmh =1,8*zeit;
Grüße Uwe
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

Die Zeit in millis werden nicht angezeigt^^ Benutze erstmal nur 3 Segment-anzeigen, das reicht ja. Alles was über 999 ist, wird als "Err" für Error angezeigt smiley-grin Also das Display und deren ansteuerung ist vollkommen i.o.
Ich glaub das Problem ist nur die Rechnung. Habe jetzt schon zisch verschiedene Rechnungen bekommen, aber keine stimmt so richtig. bei 1,8 * Zeit wäre die Geschwindigkeit ja höher, je länger eine Umdrehung dauert xD Stimmt also nicht^^
Die Einzigste rechnung bei der ich was ordentliches rausbekomme, ist 180 / zeit (in ms).

Weiß einer den Korrekten Rechenweg, aus den Millisekunden (oder sekunden/minuten) und den umfang die km/h rauszubekommen? Sozusagen msu (millisekunden pro umdrehung) in km/h.

MFG, Robdeflop®
Logged

NRW
Offline Offline
Sr. Member
****
Karma: 2
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du sagst er legt 50cm pro Umdrehung zurück.
Und Du hast die Zeit die er dafür gebraucht hat in millisekunden.
Meiner Meinung nach musst Du ausrechnen wieviel er in einer 1ms geschafft hätte und das dann auf die Stunde hoch rechnen.

Also
0,0005
-------- * 3600000
X ms

0,0005 / ms * 360000

oder in kurz:

1800 / x ms

Würde ich mal sagen.




Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

Danke schonmal^^ Werde ich gegen abend mal testen smiley

MFG, Robdeflop®
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich glaub das Problem ist nur die Rechnung. Habe jetzt schon zisch verschiedene Rechnungen bekommen, aber keine stimmt so richtig. bei 1,8 * Zeit wäre die Geschwindigkeit ja höher, je länger eine Umdrehung dauert xD Stimmt also nicht^^
MFG, Robdeflop®
Du hast Recht; Hab einen Fehler gemacht.
Die Gleichung
kmh = 0.0005 / (zeit / 1000) * 3.6;
entspricht:
kmh =1,8/zeit;

Du hast aber den Fehler gemacht die 1000 für den km 2 mal zu rechnen.
kmh = (umfang/zeit) *1000 * 3,6
kmh = (1000*3,6*0,5)/zeit
kmh = 1800/zeit wobei Zeit in mSek eingesetzt wird.

Das ist das was MueThoS auch berechnet hat.

Grüße Uwe
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

Hmm, muss es morgen mal testen, und ebn n Sketch schreiben, um die Km/h, gemessen von GPS, auf nem Display auszugeben, dann hab ich nen Vergleich^^
Morgen bekomm ich auch meinen Savage (mein Monstertruck^^) wieder, hatte den bei nem Freund vergessen.
Achja, wenn Reed-Kontakte schon entprellt sind, ist ja prima smiley

MFG, Robdeflop®
Logged

Pages: [1]   Go Up
Jump to: