Temperaturanzeige /7 Segment LED mit KYT 81-110, Atmega 8

OP #4525518
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!
OP #4525522
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);
}
Gast #4525579
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.
Gast #4525637
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.
OP #4525654
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);

}
Gast #4525874
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.
OP #4525936
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);
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.