TMP36 Temperatursensor auf Arduino Uno Multifunction Shield

Hallo, habe heute den TMP36 Sensor einmal ausprobiert. Mit den üblichen 0 Volt bis 2 Volt von -50 Grad bis +150 Grad. Und Ausgabe ganzzahlig im seriellen Monitor.
Einige Fragen dazu:

  1. Wieso zeigt der serielle Monitor die Zeitstempel nur bei den ersten 8 Messungen an, obwohl der Zeitstempel im Fenster aktiviert ist?

  2. Ich möchte nun diesen Sensor mit dem Uno Multifunktion Shield verknüpfen. Wo und wie wird er darauf angeschlossen? Auf der 7-Segmentanzeoge möchte ich die Temperaturanzeige zweistellig mit einer Nachkommastellen haben. Gibt es dafür einen fertigen Sketch für mich als Newbie? Macht es überhaupt Sinn 1/10 auszugeben, da dieser Sensor doch nur +/- 2 Grad genau ist.

Gerd50:
Hallo, habe heute den TMP36 Sensor einmal ausprobiert. Mit den üblichen 0 Volt bis 2 Volt von -50 Grad bis +150 Grad. Und Ausgabe ganzzahlig im seriellen Monitor.
Einige Fragen dazu:

  1. Wieso zeigt der serielle Monitor die Zeitstempel nur bei den ersten 8 Messungen an, obwohl der Zeitstempel im Fenster aktiviert ist?

Das wissen wir nicht, da wir deinen Sketch nicht kennen.
Poste den bitte in Code-Tags, Schaltfläche </> oben links im Editorfenster.

  1. Ich möchte nun diesen Sensor mit dem Uno Multifunktion Shield verknüpfen. Wo und wie wird er darauf angeschlossen? Auf der 7-Segmentanzeoge möchte ich die Temperaturanzeige zweistellig mit einer Nachkommastellen haben. Gibt es dafür einen fertigen Sketch für mich als Newbie? Macht es überhaupt Sinn 1/10 auszugeben, da dieser Sensor doch nur +/- 2 Grad genau ist.

Dann poste mal einen Link von deinem Shield. Bitte Hyperlink.

Ich meine das Standard-Multifunction Shield:

s-l400.jpg

Unsere Hilfsmöglichkeiten sind nur so gut, wie die Infos, die wir von Dir bekommen.
Den Sketch hälst Du noch immer geheim, wie sollen wir Dir dann helfen?

Gruß Tommy

Gerd50:
Ich meine das Standard-Multifunction Shield:

Ich sehe nur ein Foto, keinen Hyperlink.

Das Multi-Function-Shield war ja bereits vor kurzem Thema.

Whandall hat dazu einen Schaltplan gepostet.

Das Make-Magazin hat diesem Shield in der Ausgabe 2/2018 einen Artikel gewidmet (mit Beispielen) und es gibt zahlreiche Tutorials und Beispiele für dieses preisgünstige Shield im Netz. Zum Beispiel:

Gerd50:
Einige Fragen dazu:

  1. Wieso zeigt der serielle Monitor die Zeitstempel nur bei den ersten 8 Messungen an, obwohl der Zeitstempel im Fenster aktiviert ist?

  2. Ich möchte nun diesen Sensor mit dem Uno Multifunktion Shield verknüpfen. Wo und wie wird er darauf angeschlossen? Auf der 7-Segmentanzeoge möchte ich die Temperaturanzeige zweistellig mit einer Nachkommastellen haben. Gibt es dafür einen fertigen Sketch für mich als Newbie? Macht es überhaupt Sinn 1/10 auszugeben, da dieser Sensor doch nur +/- 2 Grad genau ist.

Zu Frage 2 (erster Teil):
Einen TMP36 kannst du direkt auf das Multi-Function-Shield stecken, so:
TMP36_am_mfs_s.jpg
Er hängt dann an A4.
Wie du Daten des Sensors verarbeiten kannst ist zum Beispiel hier erklärt: Overview | TMP36 Temperature Sensor | Adafruit Learning System
Du musst den Sketch entsprechend anpassen (weil der Sensor auf A4 und nicht wie im Beispiel auf A0 hängt).

Wie du die Werte auf die Siebensegmentanzeige bekommst, kannst du in den vielen Beispielen im Netz nachlesen.
Zum Beispiel (als Anregung):

// Read analog pin and display value on display
/* Define shift register pins used for seven segment display */
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
#define Pot1 4

/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};

/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};

void setup () {
  /* Set DIO pins to outputs */
  pinMode(LATCH_DIO,OUTPUT);
  pinMode(CLK_DIO,OUTPUT);
  pinMode(DATA_DIO,OUTPUT);
}

void loop() {
  int PotValue;
  PotValue = analogRead(Pot1);
  /* Update the display with the current counter value */
  WriteNumberToSegment(0 , PotValue / 1000);
  WriteNumberToSegment(1 , (PotValue / 100) % 10);
  WriteNumberToSegment(2 , (PotValue / 10) % 10);
  WriteNumberToSegment(3 , PotValue % 10);
}

/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
void WriteNumberToSegment(byte Segment, byte Value) {
  digitalWrite(LATCH_DIO,LOW);
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
  digitalWrite(LATCH_DIO,HIGH);
}

Wenn du "vernünftig" Temperaturen messen willst, würde ich einen anderen Sensor empfehlen, zum Beispiel DS18B20. Dieser gibt die Temperatur in digitalem Format aus. Aber für erste Versuche ist natürlich auch der TMP36 durchaus brauchbar.

Zur Frage 1 kann man (wie bereits von anderen erwähnt) nichts sagen, ohne den Code zu sehen.

Danke erstmal für alle Anregungen. Ich werde demnächst darauf achten, dass ich die Anhänge etc. besser kontrollieren, sorry nochmal. Bin am Lernen und Anfänger.
Ja, es ist das zuletzt von euch korrekt abgebildete Multifunction Board.

Auch ganz vielen Dank an das Sketch Bsp. von uxomm.
Dies habe ich schon in einer anderen Anwendung - Anzeige der 2 hoch 10 = 1024 Quantisierungsschritte des Potis ausprobiert. Was ich dabei aber ueberhaupt nicht verstehe ist, warum nur auf der 7-Segmentanzeige die ganz rechte Stelle normal hell und die 3 linken Stellen sehr dunkel angezeigt bekomme. Auch wenn ich die %10 jeweils rausnehme werden diese Stellen nicht heller!?

Zu dem anderen Problem mit dem Zeitstempel habe ich kein Code im Sketch, da ich ja nur im seriellen Monitor die Checkboxen 'Zeitstempel' aktiviert habe, aber dies beim Neustart des Programms nur 8x die Te!peratur mit Zeitstempel anzeigt, dann aber nicht mehr. Dies hat nix mit dem Quellcode zu tun, sondern muss doch mit einem evtl. Bug im Seriellen Monitor zu tun haben!?

Sehe nun den vorgesehenen Druck auf dem Function Shield für den LM35 mit A4. Gibt der LM35 auch 0 bis 2 Volt aus wie der TMP36? Kenne den LM35 noch nicht, ist der besser wie der TMP36?

Hier sind die Datenblätter:

https://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf

Grob sind die in etwa gleich. Der TMP3x läuft auch mit niedrigeren Betriebsspannungen, während der LM35 mindestens 4V braucht

Gerd50:
Was ich dabei aber ueberhaupt nicht verstehe ist, warum nur auf der 7-Segmentanzeige die ganz rechte Stelle normal hell und die 3 linken Stellen sehr dunkel angezeigt bekomme.

Bitte zeige einen Code, bei dem das Problem auftritt.

Möglicherweise gibt es aber auch ein Hardware-Problem.
Mit welchem Arduino verwendest du das Multi-Function-Shield?

Ich glaube zwar nicht, dass das ein Teil deines Problems ist, ich erwähne es aber trotzdem:
In Verbindung mit einem Arduino UNO gibt es Probleme, weil mehrere Pins des Multi-Function-Shields mit der USB-Buchse des UNO in Kontakt kommen können (allerdings führt das meist nur dazu, dass die B-Segmente ständig leuchten):
mfs_problem_pins_s.png

Abhilfe: Die Pins kürzen und die Oberseite der USB-Buchse mit Isolierband bekleben.

Nein, an der USB Buchse liegt das bei mir nicht, da schon insoliert und Abstand dazwischen.

Ich meine diesen Code:

WriteNumberToSegment(0 , PotValue / 1000);
WriteNumberToSegment(1 , (PotValue / 100) % 10);
WriteNumberToSegment(2 , (PotValue / 10) % 10);
WriteNumberToSegment(3 , PotValue % 10);

Selbst wenn ich die % 10 jeweils weglasse, werden die 3 linken 7-Segmentanzeigen nicht heller, nur die ganz rechte ist ganz hell.

Gerd50:
Selbst wenn ich die % 10 jeweils weglasse, werden die 3 linken 7-Segmentanzeigen nicht heller, nur die ganz rechte ist ganz hell.

Das % 10 hat nichts mit der Helligkeit zu tun. Das % steht für Modulo, also den Rest einer Division.
In vielen Programmiersprachen wird Modulo durch ein Prozentzeichen dargestellt.

Beispiel
24 % 20 = 4
Es wird 24 durch 20 dividiert. Das Ergebnis so einer Division wäre 1,2 aber darum geht es nicht, sondern um den Rest einer "Ganzzahldivision", dieser ist 4
"Zwanzig passt einmal in vierundzwanzig und es bleibt vier als Rest".

Was macht Modulo (%) in diesen Codezeilen?
Es werden die einzelnen Ziffern von "PotValue" sozusagen "extrahiert".
Beispiel: PotValue = 1234

PotValue / 1000:       1234 dividiert durch 1000                 = 1*)  die erste Ziffer der Zahl 1234 
(PotValue / 100) % 10: 1234 dividiert durch 100  = 12  Modulo 10 = 2    die zweite Ziffer
(PotValue / 10) % 10): 1234 dividiert durch 10   = 123 Modulo 10 = 3    die dritte Ziffer
PotValue % 10:         1234 Modulo 10                            = 4    die vierte Ziffer
   
*) 
Es wird mit Integern gerechnet, es gibt also keine Nachkommastellen
und 1999 dividiert durch 1000 ergibt 1

Die wenigen Codezeilen die du zeigst reichen nicht und sind auch nicht die Ursache für die unterschiedlichen Helligkeiten.
Zeige also bitte lauffähigen Code, bei dem das Problem bei dir auftritt.
Nur so besteht die Chance, dass jemand anderer es ausprobieren und eventuell den Fehler finden kann.

Natürlich kann es auch sein, dass es kein Software-Problem ist, sondern ein Problem mit der Hardware.
Zeigt denn die Siebensegment-Anzeige auch bei anderen Beispielen dieses "Helligkeitsproblem"?

Kann es sein, dass du irgendwo in deinem Code delay verwendest?

Ich nehme mal an (ohne den Sketch zu kennen) daß Du sobald die Zahl dargestellt ist das Display löscht und wieder darstellst. So verbleibt die Einerstelle viel länger leuchten als die 1000-ender Stelle.

Grüße Uwe

Danke für die lieben und aufschlussreichen Infos!
Dieses 'Helligkeitsproblem' (linken 3 Stellen sehr dunkel, rechte normal hell) habe ich nicht bei allen Experimenten, also müsste es dann nicht an der Hardware liegen, sondern an dem Sketch, der den Potiwert in 0 bis 1023 auf die 7-Segment-Anzeige ausgibt.
Wer könnte Tipps geben, wo ich nun etwas verändern müsste? LG

#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8

#define Pot1 0

/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};

void setup ()
{
Serial.begin(9600);
/* Set DIO pins to outputs */
pinMode(LATCH_DIO,OUTPUT);
pinMode(CLK_DIO,OUTPUT);
pinMode(DATA_DIO,OUTPUT);
}

/* Main program */
void loop()
{
int PotValue;
PotValue = analogRead(Pot1);
Serial.print("Potentiometer: ");
Serial.println(PotValue);
/* Update the display with the current counter value */
WriteNumberToSegment(0 , PotValue / 1000);
WriteNumberToSegment(1 , (PotValue / 100) % 10);
WriteNumberToSegment(2 , (PotValue / 10) % 10);
WriteNumberToSegment(3 , PotValue % 10);
}

/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
void WriteNumberToSegment(byte Segment, byte Value)
{
digitalWrite(LATCH_DIO,LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO,HIGH);
}

also müsste es dann nicht an der Hardware liegen, sondern an dem Sketch, der den Potiwert in 0 bis 1023 auf die 7-Segment-Anzeige ausgibt.
Wer könnte Tipps geben, wo ich nun etwas verändern müsste? LG

Dem ersten Teil stimme ich zu.

Zum 2ten Teil:
Nur ausgeben, wenn sich die Werte geändert haben.
Zur Not eine kleine Hysterese oder einen gleitenden Mittelwert einführen.

Danke für den Tipp. Das ist mir aber noch zu kompliziert um es zu verstehen, bin noch nicht so weit als Newbie. Binde aktuell meist fertigen Code ein, kann diesen grundlegend nachvollziehen aber noch nicht selbst erstellen. Aller Anfang ist schwer.

Zu meinen 2. Problem, dass ich hier anfänglich schon erwähnt habe: Im seriellen Monitor, auch wenn dort die Checkbox 'Zeitstempel' aktiviert ist, bekomme ich ja nur 8x hintereinander nach dem Neustart des Programmes die Temperaturmessung mit diesem Zeitstempel als linke Spalte im Monitor angezeigt. Danach ist der Zeitstempel weg und ich sehe nur noch die Temperaturmessung.

An was könnte das denn liegen?

Hier habe ich mal den aktuellen Code, nun habe ich endlich auch die dafür notwendigen Tags oben links verstanden.... :slight_smile:

int TMP36 = A0; 
int sensorwert;
int temperatur = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
sensorwert=analogRead(TMP36);
temperatur= map(sensorwert, 0, 410, -50, 150);
delay(t); // Nach jeder Messung ist je eine kleine Pause
Serial.print(temperatur);
Serial.println(" Grad Celsius");
}

Hat keiner mehr Tipps für mich?

Wegen:

  1. Den nur anfänglichen Zeitstempel im seriellen Monitor.
  2. Den unterschiedlichen Helligkeiten in der 7-Segmentanzeige des Multifunction-Shields.

Danke und ein schönes (Arduino-) Wochenende.

Zu unterschiedliche Helligkeiten:

Hintergrund
Diese Siebensegment-Anzeige wird ja mit Multiplex betrieben. Das bedeutet, dass die einzelnen Stellen nicht gleichzeitig leuchten sondern nacheinander aufleuchten. Das passiert allerdings so schnell, dass es für das menschliche Auge so aussieht als würden alle 4 Stellen gleichzeitig leuchten (was aber nicht der Fall ist).
Das funktioniert (nur) solange es keine wesentlichen Verzögerungen im Sketch gibt und die einzelnen Stellen des Displays immer wieder (viele Male pro Sekunde) kurz aufleuchten können.

Ich habe ja in #11 gefragt, ob es im Sketch, den du verwendest, irgendwo delays gibt.
Das ist zwar eigentlich nicht der Fall, ABER:
Im Sketch aus #13 gibt es serielle Ausgaben. Die serielle Schnittstelle ist in diesem Sketch auf 9600 eingestellt, das ist sehr sehr langsam und das sorgt für eine deutliche Verzögerung / Verlangsamung des Programmablaufs, der ausreicht, dass die letzte Stelle des Displays viel länger leuchtet, als die anderen drei. Das sieht dann so aus, als würde sie heller sein.

Abhilfe: Stelle die "Geschwindigkeit" (Baud) der seriellen Kommunikation auf einen deutlich höheren Wert. Statt 9600 nimm doch zum Beispiel 500000:

Serial.begin(500000);

Natürlich musst du auch im seriellen Monitor den gleichen Wert einstellen.
Ausserdem kannst du die serielle Ausgabe auf das Wesentlichste beschrängen und z.B. statt "Potentiometer"
nur "Pot" schreiben, das sind weniger Zeichen, die übertragen werden müssen.

Zum Zeitstempel im seriellen Monitor:
Das ist ein ziemlich neues Feature, das es noch nicht allzu lange gibt.
Die neueste Arduino-IDE-Version, die ich verwende ist 1.8.5., da gibt es diesen Zeitstempel noch nicht (die akutelle Version ist 1.8.7).
Ich kann dir bei diesem Problem also nicht weiterhelfen.
(Könnte auch sein, dass neue Funktionen noch ein wenig fehleranfällig sind).

Hi,

ich hatte kürzlich eine 4-Digit 7-Segmentanzeige auf dem Steckbrett aufgebaut, die 7 Segmente vom Schieberegister, die 4 Digits vn einem Arduino-Pin getrieben. Dabei wurde wie hier eigentlich auch der ganze Sketch zwischen der Anzeige eines einzelnen Digits durchlaufen. Die optimale Durchlaufzeit lag bei mir bei etwa 1 - 4ms, dauert es länger, fängt es mit flimmern an, oder man erkennt gar die einzeln aufleuchtenden Digits.
Da hier mit 2x Schieberegister (gepuffert) gearbeitet wird, wird bei einer Verzögerung ein Digit länger bedient ...

Gruß André

Leider bringt das Verändern der Baudrate, auch bis auf die höchste Einstellung, bei mir nichts. Schade.