Hallo , ich wollte einen Temperaturwert von einem LM 35 Temperatursensor
mit Hilfe eines Arduino Unos auf vier 7 Segmentanzeigen mit 4 Ziffern
den Temperaturwert anzeigen lassen. Leider habe ich keine Idee wie der
Programmcode aussehen soll. Ich habe nur einen Programmcode der mir den
Wert auf dem Serial Monitor anzeigt.
Hier der Code der mir das auf dem Serial Monitor anzeigt:
(der Code ist nicht von mir entwickelt worden ... ich hab ihn nur
verändert)
//LM35 output voltage has a linear relation with the Celsius
temperature, output of 0 v when 0 ℃,
//every increase 1 ℃, the output voltage increase 10 mv
#define lmPin A0 //LM35 attach to
float tem = 0;
long lmVal = 0;
void setup()
{
Serial.begin(9600); //initialize serial monitor
}
void loop()
{
lmVal = analogRead(lmPin);
tem = (lmVal * 0.002852467311 * 100);//5/1024=0.0048828125;1000/10=100
Serial.print("//////");
Serial.print(tem);
delay(250);
}
- Diesen Wert der im Serial Monitor angezeigt wird soll auf einer 4
Stelligem 7 Segmentanzeige angezeigt werden . ( im Bild ist leider
nicht der Temperatursensor zu sehen aber so soll das 4rer 7 Segment
Display angeschlossen werden.
Gast
#5389009
Jonas A. schrieb: > Leider habe ich keine Idee wie der > Programmcode aussehen soll. Ich habe nur einen Programmcode der mir den > Wert auf dem Serial Monitor anzeigt. > Damit kannst du keine Werte auf der 7-Segment Anzeige ausgeben. > Hier der Code der mir das auf dem Serial Monitor anzeigt: > (der Code ist nicht von mir entwickelt worden ... ich hab ihn nur > verändert) Dann wirst du ihn weiter verändern müssen. Wenn du ihn nicht selbst schreiben möchtest, musst du vielleicht Tante Google fragen. Außerdem muss dein Schaltplan, die Anzeigen und das Programm zusammenpassen. Ohne darüber etwas zu wissen, ist es mit konkreten Tips schlecht. Außerdem überschätzt du anscheinend die Genauigkeit deines Sensors. Jedenfalls brauchen die Konstanten in der Rechnung nicht mehr Stellen zu besitzen, als dein µC verarbeiten kann und als es der Genauigkeit des Endergebnisses nützt. Das schwächste Glied in der Verarbeitungskette dürfte der Sensor sein.
Ja ich weiß , dass der Temperatursensor eh nur auf 0,5 Grad genau ist ... und das vier Stellen da auch nichts bringen ... . Hab aber nur eine Anzeige mit vier Stellen und eine mit einer Stelle ... also muss ich die vierer nehmen und ja ich weiß dass ich mit Google suchen kann und das hab ich auch nur leider hab ich nichts gefunden dass genau zu meinem Projekt passt ... ich dachte nur das jemand da vllt mehr weiß wie ich das programmieren kann. Und ja der Code den in da hab das sollen auch nur die Rohdaten sein ... wenn ich wüsste wie ich das machen müsste würde ich nicht fragen ... und natürlich hab ich mir schon etliche Seiten dazu durchgeguckt.
Gast
#5389054
Jonas A. schrieb: > Hab aber nur eine Anzeige mit vier Stellen und eine mit einer Stelle Ok > ... ich dachte nur das jemand da vllt mehr weiß wie ich das > programmieren kann. Dafür müsste man erstmal mehr über deine Anzeigen wissen, als du bisher verraten hast. Oft ist Multiplexbetrieb eine Lösung.
Jonas A. schrieb: > - Diesen Wert der im Serial Monitor angezeigt wird soll auf einer 4 > Stelligem 7 Segmentanzeige angezeigt werden Nun, ich sehe nicht genau welche Anzeigen (common cathode oder common andode) und welche Segmentew an welche Anschlüsse gehe, aber wenn dir die 5mA Segmentstrom ausreichen die diese Schaltung maximal schafft, ist die Ansteuerung doch klar, angenommen die Segmente abcdefg liegen an PORTD, die Digits an PORTB.0...3 wären gemeinsame Anode: In loop musst je jedesmal eine Ziffer aktivieren. Stehen die ziffern in
1 | |
und die Umsetzung in 7-Segment Muster
1 | |
macht
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
die Anzeige. Dein delay(250) muss dann eben bei jedem 25. Durchlauf von loop passieren
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
Ein anderer schriebt https://www.jameco.com/Jameco/workshop/TechTip/working-with-seven-segment-displays.html
Such mal nach "Multiplexanzeige c", da wirst Du tonnenweise Code finden. Allerdings sind die Portpins nicht in der Lage ein Digit zu treiben, d.h. Du brauchst je Digit noch einen Transistor.
Jonas A. schrieb: > aber so soll das 4rer 7 Segment > Display angeschlossen werden. Wenn das schon sowieso Arduino ist (d.h. keine freie ISR von Timer verfügbar), wäre es vielleicht besser, eine Anzeige mit Max7219 zu benutzen? Bei Chinesen kostet 8-Ziffer-Anzeige unter 2 €. MOSI, CLK, ~WR, einmal 4 Ziffer geschrieben - und vergessen!
Gast
#5389372
Maxim B. schrieb: > Wenn das schon sowieso Arduino ist (d.h. keine freie ISR von Timer > verfügbar) Wieso ist beim Arduino keine Timer ISR verfügbar? Der Arduino 1ms-Interrupt nutzt nur den Timer0 und alles weitere hängt von der Anwendung ab.
Gast
#5389452
Maxim B. schrieb: > Wenn das schon sowieso Arduino ist (d.h. keine freie ISR von Timer > verfügbar), wäre es vielleicht besser, eine Anzeige mit Max7219 zu > benutzen? Quark! Das einzige Problem ist Jonas' Unfähigkleit, sein "Problem" in zwei Teile zu zerlegen und logisch abzuarbeiten - Arduino-Klischee wieder bedient, schade. Wenn man es nicht selber kann, finden sich im Internet ganz sicher fertige Libraries zur Ansteuerung einer Siebensegmenteinheit. Diese dann mit der, ebenfalls kopierten, Sensorabfrage zu verheiraten, sollte das große Problem nicht sein. Wenn das Ding nichts weiter zu tun hat, als einen LM35 auf das Display zu bringen, bekommt man das sogar noch mit delay() in der loop() hin. Wer gerne möchte und lesen kann, findet auch beim Arduino einen Timer-Interrupt.
Manfred schrieb: > finden sich im > Internet ganz sicher fertige Libraries zur Ansteuerung einer > Siebensegmenteinheit Das finde ich eigentlich schlecht. Man verwendet etwas, was man nicht gut versteht. Und Arduino-IDE hilft wenig, Quelltext zu verstehen.
Gast
#5389493
Maxim B. schrieb: > Manfred schrieb: >> finden sich im Internet ganz sicher fertige Libraries zur Ansteuerung einer >> Siebensegmenteinheit > Das finde ich eigentlich schlecht. Man verwendet etwas, was man nicht gut versteht. Da will ich Dir nicht widersprechen! Genau das ist aber das Konzept diverser Hochsprachen, sich nicht um jeden Standardkram selbst kümmern zu wollen. Man linkt vorgefertigte Methoden rein und erwartet, dass die das tun, was in deren Doku steht. Das darfst Du unabhängig von Arduino betrachten: Wer schreibt in Delphi seine eigene V.24-Routine, wer in Java eine eigene Debugausgabe und weitere. Ich sehe keinen Anlass, mich um mein LC-Display oder die Abfrage eines I2C-Sensors zu kümmern, da gibt es fertige Dinge. Ich schreibe meine Kernaufgaben selbst, die peripheren Dinge gucke ich nur an, wenn sie irgendwie nicht tun, was ich brauche. > Und Arduino-IDE hilft wenig, Quelltext zu verstehen. Die A*-IDE ist Editor und Compilersteuerung, das Verständnis der Sprache muß man sich unabhängig von dieser erarbeiten. Was ich seit Jahren immer wieder herunterbete: Grundlagen! Abfrage eines Schalters, ein Lauflicht, ein Drehpoti abfragen, Hello World aufs Display schreiben ... und erst, wenn das zuverlässig klappt, komplexere Dinge angehen. Wer dazu nicht bereit ist, sollte sich ein anderes Hobby suchen.
Manfred schrieb: > Wenn man es nicht selber kann, finden sich im > Internet ganz sicher fertige Libraries zur Ansteuerung einer > Siebensegmenteinheit. https://github.com/DeanIsMe/SevSeg
Manfred schrieb: > Wer schreibt in Delphi > seine eigene V.24-Routine, wer in Java eine eigene Debugausgabe und > weitere. Das sind verschiedene, unvergleichbare Gebiete: ein Computer, wo Grundaufbau geregelt ist, und Mikrocontroller, wo man frei bleibt.
Gast
#5389574
Bevor man eine 7-Segment Matrixanzeige programmiert, sollte man erst mit einer einstelligen Anzeige beginnen. Und dann man über deren Stromaufnahme nachdenken, bevor man es vervierfacht.
Moderne LED brauchen nicht viel. Bei mir arbeitet das in einem Timer ganz gut. (5V - 2V(LED)- 0,9V (Transistor + IC)) / 330 ~= 6,4 mA, oder in Durchschnitt 6,4/4=1,6 mA, und das ist schon genug hell. Man kann aber 3x oder 4x mehr holen. Aber ich habe auf C programmiert, deshalb paßt mein Code für TO leider nicht: er will ja Arduino benutzen. Ansonsten nichts kompliziertes: man speichert irgendwie Wert, den man zeigen will. Danach in BCD (entweder wie oft mit / und %, oder für AVR viel schneller mit Decrement und Vergleich). Z.B. so:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
Dann in ISR jede ein paar ms nimmt man Ziffer nacheinander, wandelt sie in 7-segm. Code (dabei kann man es so einrichten, wie das für die Platte bequemer ist. Für AVR ist das ja egal, welche Pin zu welchem Segment kommt). Dann noch eine (von vier) Kathode auf Null setzen... Z.B. so:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
und so:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.

