Anzeigefehler bei Temperaturmessung

Guten Tag,

Ich habe ein Problem die Einerstelle von einem Temperatursensor richtig auf den 7-Segment-Display anzeigen zu lassen, es erscheint immer um 3 bis 2 Zahlen falsch und die 9 erscheint überhaupt nicht. Die Zehner stelle funktioniert einwandfrei aber die Einerstelle nicht, obwohl ich genau das gleiche habe. PS Ich benutze 2 7-Segment-Displays eins für die Einer Stelle das andere für die Zehnerstelle außerdem sind beide Displays mit einer 7-Segment-Decoder verbunden.

Mein code sieht wie folgt aus :

int a1= 8;
int a2= 9;
int a3= 10;
int a4= 11;

int b1= 0;
int b2= 1;
int b3= 2;
int b4= 3;

int sequence[10][4]={
  {0,0,0,0}, //0
  {0,0,0,1}, //1
  {0,0,1,0}, //2
  {0,0,1,1}, //3
  {0,1,0,0}, //4
  {0,1,0,1}, //5
  {0,1,1,0}, //6
  {0,1,1,1}, //7
  {1,0,0,0}, //8
  {1,0,0,1}  //9
};

int reverseSequence[10][4]={
  {0,0,0,0}, //0 
  {1,0,0,0}, //1
  {0,1,0,0}, //2
  {1,1,0,0}, //3
  {0,0,1,0}, //4
  {1,0,1,0}, //5
  {0,1,1,0}, //6
  {1,1,1,0}, //7
  {0,0,0,1}, //8
  {1,0,0,1}  //9
};

void setup() {
  pinMode(a1, OUTPUT);
  pinMode(a2, OUTPUT);
  pinMode(a3, OUTPUT);
  pinMode(a4, OUTPUT);

  pinMode(b1, OUTPUT);
  pinMode(b2, OUTPUT);
  pinMode(b3, OUTPUT);
  pinMode(b4, OUTPUT);
  
  pinMode(A5, INPUT);

  Serial.begin(9600);
}

void loop() {
  int temOutput=analogRead( A5 ); 
  int temperatur= map(temOutput, (1023.0/5000)*100,(1023.0/5000)*1750,-40,125);

  Serial.println(temperatur); 

  int absTemberatur= abs(temperatur); 

  int einer = absTemberatur%10; 
    Serial.println(einer);
  
    digitalWrite(b1, sequence[einer][3] == 1 ? HIGH : LOW);
    digitalWrite(b2, sequence[einer][2] == 1 ? HIGH : LOW);
    digitalWrite(b3, sequence[einer][1] == 1 ? HIGH : LOW);
    digitalWrite(b4, sequence[einer][0] == 1 ? HIGH : LOW);

  int zehner = (absTemberatur / 10) % 10;
    Serial.println(zehner);

    digitalWrite(a1, sequence[zehner][3] == 1 ? HIGH : LOW);
    digitalWrite(a2, sequence[zehner][2] == 1 ? HIGH : LOW);
    digitalWrite(a3, sequence[zehner][1] == 1 ? HIGH : LOW);
    digitalWrite(a4, sequence[zehner][0] == 1 ? HIGH : LOW);

  delay(2000);
}

Ich hoffe jemand kann mir hier helfen.

Warum wird keine Lib genutzt?

Zeige mall link zu den Dinger.

dein Sketch muss mit Hardware überein stimmen. zeige mal was da erscheint.
und die Schematik auch nicht vergessen, für einen wer weiß was ein 7-Seg.-Decoder ist, ist es ein Klacks

Meistens wird ein 74HC164 Shift Register genutzt

für die Tasten, denn hc164 Shift-In Register ist

@ruben-ga sag mal, ist dein Board etwa Micro(Pro) ?


Sieht so aus alles richtig geschaltet misst alles richtig aber zeigt falsch an

Wie das den?

const byte Pins[8] = { 2, 3, 4, 5, 8, 9, 10, 11};

void setup() {
  for (int i = 0; i < 8; i++)pinMode(Pins[i], OUTPUT);
  Serial.begin(9600);
}

void loop() {
  //int temOutput = analogRead( A5 );
  byte temperatur = 89;

  byte einer = temperatur % 10;
  Serial.println(einer);
  einer = (einer << 2) | (PORTD & B00111100); // die erste Methode
  PORTD = einer;

  byte zehner = (temperatur / 10) % 10;
  Serial.println(zehner);

  for (int i = 0; i < 4; i++)digitalWrite(Pins[4 + i], zehner & (1 << i)); //zweite Methode

  delay(2000);
}
1 Like

die Pins 0 und 1 an Uno sollten lieber frei sein, da du aktiv Serial nutzest

Es funktioniert leider immer noch nicht der Einerstelle Display zeigt gar nichts an ab einer gewissen Temperatur und bei Minustemperaturen wie -18 erscheint im Serial Monitor 255

digitalWrite(b1, sequence[einer][3] );
macht das gleiche.

Zum Schaltplan in #7.
Da hast Du einen groben Fehler. Ich nehme mal an daß das Display ein Comon Cathode 7 Segment LED Display ist, Da kannst Du nicht auf die Kathode den Vorwiderstand anschließen sondern jede Anode braucht ihren Vorwiderstand.

Funktioniert das Display richtig, wenn Du die 4 Eingänge des CD4511 mittels Kabel auf GND oder 5V schaltest?

Grüße Uwe

in meinem Sketch gibt es keine 255,
und, hast du "einer"-Pins so angeschlossen wie bei mir in Sketch steht?

Ja funktioniert und mit den Widerstände hatte ich auch noch nie Probleme

ja die Pins sind richtig angeschlossen
es sieht momentan so aus


Normaler Weise sollte an jeder LED ein Widerstand und nicht einer gemeinsamer, hat jedoch nichts mit der fehlerhafter Anzeige zu tun.

const byte Pins[8] = { 2, 3, 4, 5, 8, 9, 10, 11};

void setup() {
  for (int i = 0; i < 8; i++)pinMode(Pins[i], OUTPUT);
  Serial.begin(9600);
}

void loop() {
  //int temOutput = analogRead( A5 );
  byte temperatur = 89;

  byte einer = temperatur % 10;
  Serial.println(einer);
  for (int i = 0; i < 4; i++)digitalWrite(Pins[ i], einer & (1 << i));

  byte zehner = (temperatur / 10) % 10;
  Serial.println(zehner);

  for (int i = 0; i < 4; i++)digitalWrite(Pins[4 + i], zehner & (1 << i)); //zweite Methode

  delay(2000);
}
1 Like

Die Widerstände haben ja keine Probleme,
Die Probleme bekommen die LED.
Sind das wirklich 1kOhm Widerstände?
Der Strom der LED und damit die Helligkeit hängt von der Anzahl der angesteuerten LED ab.

Grüße Uwe

1 Like

Wusste ich nicht danke ändere das gleich sofort :slight_smile:

Das Problem mit der 9 ist gelöst aber die Minuszahle funktionieren immer noch nicht richtig