Forum: Mikrocontroller und Digitale Elektronik Temperaturanzeige /7 Segment LED mit KYT 81-110, Atmega 8


von Sven M. (hackbartho)


Lesenswert?

Hallo zusammen,

ich bin ganz neu hier und mit dem Thema Microcontroller (Arduino) 
beschäftige ich mich auch erst seit kurzem. :)

Bei meinem ersten Projekt hatte ich vor mir eine 4- Stellige 7 Segment 
Anzeige
(gemeinsame Anode, Multiplexing) Temperaturanzeige zu bauen.

Grundsätzlich funktioniert die Schaltung, aber ich bekomme es einfach 
nicht hin, die Temperatur vierstellig darzustellen, bzw an der letzten 
Stelle ein "C" anzuzeigen zu lassen.

Den Sketch für die Ansteuerung der 7-Segment Anzeige habe ich aus dem 
Arduino Kochbuch entnommen.

Der KTY 81-110 ist wie hier beschrieben Angeschlossen:
http://playground.arduino.cc/Main/Kty81-110

Vielleicht kann mir ja jemand einen Tipp geben, was ich tun muss!? Würde 
mich jedenfalls sehr freuen.

Ich denke als Anfänger habe ich mit diesem Projekt etwas zu hoch 
gegriffen, aber jetzt kann ich einfach nicht mehr zurück. :)


Vielen Dank schon mal für dir Hilfe!

von Sven M. (hackbartho)


Lesenswert?

Und hier noch der Sketch.


/*Begining of Auto generated code by Atmel studio */
#include <Arduino.h>

/*End of auto generated code by Atmel studio */

/*Begining of Auto generated code by Atmel studio */
#include <Arduino.h>
//Beginning of Auto generated function prototypes by Atmel Studio
//End of Auto generated function prototypes by Atmel Studio



/*End of auto generated code by Atmel studio */


//Beginning of Auto generated function prototypes by Atmel Studio
void showNumber(int number);
void showDigit(int number, int digit);
//End of Auto generated function prototypes by Atmel Studio


/*
 * Seven Segment Anzeige
 */

const int numeral[10] = {
  //ABCDEFG /dp
  B11111100, //0
  B01100000, //1
  B11011010, //2
  B11110010, //3
  B01100110, //4
  B10110110, //5
  B00111110, //6
  B11100000, //7
  B11111110, //8
  B11100110, //9
};

//PINs für Dezimalpunkt und alle Segmente
    //dp,G,F,E,D,C,B,A

const int segmentPins[] = {7,6,5,4,3,2,1,0};

const int nbrDigits=4; //Anzahl der Ziffern der Digitalanzeige
              //dig 1 2 3 4
const int digitPins[nbrDigits] = {8,9,10,11};



void setup()
{

   //for(int i=0; i <  8; i++)
   for (int i=0;i<=64;i++)
   pinMode(segmentPins[i], OUTPUT);

  for(int i=0; i < nbrDigits; i++)
  pinMode(digitPins[i], OUTPUT);
}

// Funktion zum auslesen der Temperatur
float kty(unsigned int port) {
float temp = 82;
  // ADCSRA Register zurücksetzen
  ADCSRA = 0x00;
  // ADC aktivieren und Teiler auf 128 setzen
 ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  // MDMUX Register zurücksetzen
 ADMUX = 0x00;
  // AVCC mit externen Kondensator am AREF Pin
 ADMUX = (1<<REFS0);
  // Zuweisen des Kanals des Multiplexers
 ADMUX |= port;

  // schleife zum Auslesen der Spannung
  for (int i=0;i<=64;i++)
 {
  ADCSRA|=(1<<ADSC);
    while (ADCSRA & (1<<ADSC));
    temp += (ADCL + ADCH*256);
 }

  // Umrechnen in Temperatur
  temp /= 101;
  temp -= 156; // not 256
  return (temp);
}



void loop()
{

  float value = kty(0);
  //int value = analogRead(0);
  showNumber(value);
 }

  void showNumber( int number)
{
  if(number ==0)
  showDigit(0,nbrDigits-1);
  else
  {
    for( int digit = nbrDigits-1;digit >=0;digit--)
    {
      if(number > 0)
      {
        showDigit( number % 10, digit) ;
        number = number / 10;
      }
    }
  }
}

void showDigit (int number, int digit)
{
  digitalWrite( digitPins[digit],HIGH);
  for(int segment =1; segment < 8; segment++)
  {
    boolean isBitSet = bitRead(numeral[number], segment);
    isBitSet = ! isBitSet;
    digitalWrite( segmentPins[segment],isBitSet);
  }
  delay(5);
  digitalWrite(digitPins[digit],LOW);
}

von MaWin (Gast)


Lesenswert?

Nun ja, wenn man nicht 4 Ziffern, sondern 3 Ziffern und C ausgeben will, 
dann ist die nbrDigits wohl 3 und nicht 4. Da aber an anderer Stelle im 
Programm nbrDigits für die Anzahl der Stellen der 7-Segment Anzeige 
verwendet wird, bleibt sie da 4.
1
uint8_t i,seg,dig;
2
int temp;
3
void setup()
4
{
5
  for(i=0;i<sizeof(segmentPins)/sizeof(segmentPins[0]);i++) pinMode(segmentPin[i],OUTPUT);
6
  for(i=0;i<sizeof(digitPins)/sizeof(digitPins[0]);i++) pinMode(digitPins[i],OUTPUT);
7
  dig=0;
8
}
9
void loop()
10
{
11
   digitalWrite(digitPin[dig],0);
12
   dig=(dig+1)&3;
13
   if(dig==3) // C
14
   {   seg=0x0F; temp=kty()/10; }
15
   else
16
      seg=numeral[(temp/(10^dig))%10];
17
   for(i=0;i<8;i++) digitalWrite(segmentPin[i],seg&1);
18
   digitalWrite(digitPin[dig],1);
19
   delay(5);
20
}
^ mal mathematisch verwendet. kty ist deine Funktion, besser aber die 
aus dem playground verwenden.

von MaWin (Gast)


Lesenswert?

Drittletzte Zeile i++,seg>>=1)

von Sven M. (hackbartho)


Lesenswert?

Hallo MaWin,

vielen Dank schon mal für deine schnelle Antwort!

Da ich ja absoluter Anfänger bin nun meine Frage,

an welche Stelle muss ich deinen Code in meinen Sketch einfügen?

von MaWin (Gast)


Lesenswert?

Er ersetzt deinen ganzen Sketch, bis auf das, auf das er Bezug nimmt 
(Definitionen segmentPins, digitPins, kty, numeral).
Inzwischen würde ich in loop sogar vereinfachen
1
  if(--dig<0)
2
  {
3
     dig=3;
4
     temp=kty()*10;
5
     seg=0x0F;
6
  }
7
  else
8
  {
9
    seg=numeral[temp%10];
10
    temp/=10;
11
  }
Negative Temperaturen gehen noch nicht.

von MaWin (Gast)


Lesenswert?

Ja, da müsste dig als signed definiert werden.

von Sven M. (hackbartho)


Lesenswert?

Ich habe den Code jetzt umgeschrieben. Beim Kompilieren werden jetzt 
allerdings zwei Fehler angezeigt :(
Er sagt "too few arguments to function 'float kty(unsigned int)'



//7 Segment Temperaturanzeige KTY 81-110



void showNumber(int number);
void showDigit(int number, int digit);

uint8_t i,seg,dig;
int temp;


const int numeral[10] = {
  //ABCDEFG /dp
  B11111100, //0
  B01100000, //1
  B11011010, //2
  B11110010, //3
  B01100110, //4
  B10110110, //5
  B00111110, //6
  B11100000, //7
  B11111110, //8
  B11100110, //9
};

//PINs für Dezimalpunkt und alle Segmente
    //dp,G,F,E,D,C,B,A

const int segmentPins[] = {7,6,5,4,3,2,1,0};

const int nbrDigits=4; //Anzahl der Ziffern der Digitalanzeige
                //dig 1 2 3 4
const int digitPins[nbrDigits] = {8,9,10,11};



void setup()
{

for(i=0;i<sizeof(segmentPins)/sizeof(segmentPins[0]);i++) 
pinMode(segmentPins[i],OUTPUT);
for(i=0;i<sizeof(digitPins)/sizeof(digitPins[0]);i++) 
pinMode(digitPins[i],OUTPUT);
dig=0;

}


// Funktion zum auslesen der Temperatur
float kty(unsigned int port) {
float temp = 82;
  // ADCSRA Register zurücksetzen
  ADCSRA = 0x00;
  // ADC aktivieren und Teiler auf 128 setzen
 ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  // MDMUX Register zurücksetzen
 ADMUX = 0x00;
  // AVCC mit externen Kondensator am AREF Pin
 ADMUX = (1<<REFS0);
  // Zuweisen des Kanals des Multiplexers
 ADMUX |= port;

  // schleife zum Auslesen der Spannung
  for (int i=0;i<=64;i++)
 {
  ADCSRA|=(1<<ADSC);
    while (ADCSRA & (1<<ADSC));
    temp += (ADCL + ADCH*256);
 }

  // Umrechnen in Temperatur
  temp /= 101;
  temp -= 156; // not 256
  return (temp);
}



void loop()
{


  digitalWrite(digitPins[dig],0);
  dig=(dig+1)&3;
  if(dig==3) // C
  {   seg=0x0F; temp=kty()/10; }
  else
  seg=numeral[(temp/(10^dig))%10];
  for(i=0;i<8;i++,seg>>=1) digitalWrite(segmentPins[i],seg&1);
  digitalWrite(digitPins[dig],1);
  delay(5);

}

von MaWin (Gast)


Lesenswert?

Nun ja, das ist doch deine Funktion. Du hast erfunden, dass man ihr 
sagen muss, welchen Port sie abfragen soll.
Das mathematische ^ muss noch durch den passenden Funktionsaufruf 
ersetzt werden - oder man nimmt gleich den vereinfachten code von mir.

von Sven M. (hackbartho)


Lesenswert?

Hi,

wenn ich es jetzt richtig verstanden habe, lasse ich die Berechnung weg 
und definiere einen Port für den Sensor.

Direkt meine Funktion ist es ja nicht. :)
Ich versuche es einfach nur zu verstehen.

Der Sketch würde dann so aussehen.



uint8_t i,seg;
signed dig;
int temp;
int ktysensorPin=0;

const int numeral[10] = {
  //ABCDEFG /dp
  B11111100, //0
  B01100000, //1
  B11011010, //2
  B11110010, //3
  B01100110, //4
  B10110110, //5
  B00111110, //6
  B11100000, //7
  B11111110, //8
  B11100110, //9
};

//PINs für Dezimalpunkt und alle Segmente
    //dp,G,F,E,D,C,B,A

const int segmentPins[] = {7,6,5,4,3,2,1,0};

const int nbrDigits=4; //Anzahl der Ziffern der Digitalanzeige
                               //dig 1 2 3 4
const int digitPins[nbrDigits] = {8,9,10,11};



void setup()
{
  for(i=0;i<sizeof(segmentPins)/sizeof(segmentPins[0]);i++) 
pinMode(segmentPins[i],OUTPUT);
  for(i=0;i<sizeof(digitPins)/sizeof(digitPins[0]);i++) 
pinMode(digitPins[i],OUTPUT);
  dig=0;
}
void loop()
{
   digitalWrite(digitPins[dig],0);
   dig=(dig+1)&3;
   if(dig==3) // C
   {   seg=0x0F; temp=ktysensorPin/10; }
   else
      seg=numeral[(temp/(10^dig))%10];
   for(i=0;i<8;i++,seg>>=1) digitalWrite(segmentPins[i],seg&1);
   digitalWrite(digitPins[dig],1);
   delay(5);
}

von MaWin (Gast)


Lesenswert?

Sven M. schrieb:
> Der Sketch würde dann so aussehen.

Nee, da musst du noch mehr verstehen und auf jeden Hinweis eingehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.