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!
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); }
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.
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?
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.
Ja, da müsste dig als signed definiert werden.
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); }
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.
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); }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.