Woher kommt der Wert?

Hallo Experten, ich habe einen kleinen Sketch, der auch läuft:

#include <LedControl.h>

// MAX7219 Pins: DIN, CLK, CS
LedControl lc = LedControl(12, 11, 10, 1);

const int ptPin = A1;
const float Rref = 1000.0; // Referenzwiderstand 1kΩ
const float R0 = 1000.0; // PT1000 bei 0°C
const float alpha = 0.00385; // Temperaturkoeffizient

void setup() {
lc.shutdown(0, false);
lc.setIntensity(0, 5);
lc.clearDisplay(0);
}

void loop() {
int adcValue = analogRead(ptPin);
float voltage = adcValue * (5.0 / 1023.0);
float Rpt = (voltage * Rref) / (5.0 - voltage);
float tempC = (Rpt - R0) / (R0 * alpha);

displayNumber((int)tempC );
delay(500);
}

void displayNumber(int num) {
lc.clearDisplay(0);

lc.setDigit(0, 6, abs(num) % 10 , false); //true = Dezimalpunkt
lc.setDigit(0, 7, (abs(num) / 10) % 10 , false); // 7 = ganz links

if (num < 0) lc.setChar(0, 2, '-', false);
}

Dazu ist mir nicht klar, woher der Wert für die Variable num kommt. Gemessen habe ich den Wert adcValue. Wie entsteht daraus num?
Danke. Joachim

Der Parameter wird beim Funktionaufruf übergeben.

Tipp:
Du möchtest ein C++ Grundlagenbuch lesen.

Mir ist schon klar, dass der Parameter beim Funktionsaufruf "void displayNumber(int num)" übergeben wird. Aber wo wird der Wert für num ermittelt? Ich sehe diverse Variablen wie z.B. voltage, aber keine Wertübergabe am num.
Joachim

Warum ignorierst die Bitte den Code lesbar darstellen. In der IDE ist ein Menü Für Forum kopieren

Da in loop() kastrierst Du den mühsam errechneten float-Wert der Temperatur auf int und übergibst ihn zur Anzeige auf dem Display.
Die Berechnung in der Funktion habe ich noch nicht verinnerlicht.
Es sieht so aus, als wolltest Du eine Nachkommastelle haben. Dann wäre Übergabe von (int)(tempC*10) möglicherweise sinnvoller.

Kann Dein Display kein print()?
Eigentlich müsste lc.print(tempC,1) einfacher sein.

das passiert beim Aufruf von displayNumber((int)tempC );. tempC oder jeder andere Wert, den man in die Klammer setzt, wird in das num von void displayNumber(int num) {} übergeben und reingepackt.
Ich würde bei gewünschter Darstellung der Nachkommastelle auch auf float verzichten und wie @wno158 vorschlug, den Wert um eine Dezimalstelle erhöht übergeben und ihn in der Funktion mit einem fixen Punkt/Komma versehen.

Solange @achim1152 sich nicht an die Regeln hält würde nicht antworten, ist ja nicht ersten Tag dabei.

Ich ignoriere nix, aber ich finde in der IDE das Menü für Forum kopieren. Wo ist das?

Schonmal die rechte Maustaste benutzt ?

Ja, aber da kommt nur u.a. Format Document. Aber damit passiert nichts. Bin ich zu doof?

Du musst natürlich dazu den zu formatierenden bzw. kopierenden Text auch markieren. Das weiß deine Maus ja vorher nicht.
Aber mit dem PC umgehen kannst du schon ?

Habe ich kommentiert:

#include <LedControl.h>

// MAX7219 Pins: DIN, CLK, CS
LedControl lc = LedControl(12, 11, 10, 1);

const int ptPin = A1;
const float Rref = 1000.0; // Referenzwiderstand 1kΩ
const float R0 = 1000.0; // PT1000 bei 0°C
const float alpha = 0.00385; // Temperaturkoeffizient

void setup()
{
  lc.shutdown(0, false);
  lc.setIntensity(0, 5);
  lc.clearDisplay(0);
}

void loop()
{
  int adcValue = analogRead(ptPin);                  // Hier holst Du den Wert aus dem ADC
  float voltage = adcValue * (5.0 / 1023.0);         // den Du hier zu Voltage umrechnest
  float Rpt = (voltage * Rref) / (5.0 - voltage);    // Hier baust Du daraus einen Teiler
  float tempC = (Rpt - R0) / (R0 * alpha);           // und hier ergibt sich die Temperatur in Grad Celsius mit Nachkommastelle
  displayNumber((int)tempC );                        // hier löscht Du die Nachkommastelle(n) und übergibst die ganzzahlige Temperatur
  delay(500);
}

void displayNumber(int num)                          // Hier übernimmst Du den ganzzahligen Temperaturwert -> num == tempC
{
  lc.clearDisplay(0);
  // In den beiden Zeilen zerlegst du den Wert und stellst ihn dar
  lc.setDigit(0, 6, abs(num) % 10, false);         //true = Dezimalpunkt    
  lc.setDigit(0, 7, (abs(num) / 10) % 10, false);  // 7 = ganz links

  if (num < 0)
  {
    lc.setChar(0, 2, '-', false);
  }
}

Das findet sich entweder unter:
BEARBEITEN - FÜR FORUM KOPIEREN
oder du drückst
STRG-SHIFT-C

Nein genau das nicht!

Das hast Du genau erkannt. Ich will ein Nachkommastelle haben und arbeite mit einem 7-Segment Display über ISP. Deshalb kann ich kein Display nutzen.

Wenn ich nicht alles kopieren will, muss ich das schon.

IDE Deutsch oder Englisch ?


Danach STRG + V oder mit der Maus "Einfügen "

Dein Eingang Post kannst noch Ändern

Dan darfst nicht "Für Forum kopieren" nutzen

Und wer will mir das verbieten ? :sweat_smile:

Im übrigen habe ich das bisher immer so gemacht. Code Fragmente oder auch komplett.
Einziges Hindernis, das mit der rechten Maustaste geht wohl nicht mehr in der IDE 2.x.x.

Wozu....macht doch Arbeit.

Bitte stell dein Eingangspost richtig, sodass der Code in Code Tags steht.

Statt der alten LedControl Library, könntest du meine neuere verwenden:

Arduino Noiasca LED Control with print method (MAX7219/MAX7221)

da geht dann ein "normales"

lc.print(voltage, 1);

um ein float mit einer Nachkommastelle auf das display zu bekommen.

Abgesehen davon wäre die Verwendung von Hardware SPI möglich.

Wie auch....

num existert nur in der Funktion!