Arduino 2560 ADC für einen TMP36

Hallo!

Ich versuche mich schon seit einer Weile an dem ADC vom Mega 2560.
Und zwar möchte ich mittels einen TMP36 die Temperatur am LCD-Display anzeigen lassen.
Ich habe es mit müh und not geschafft den Analogwert am Display anzeigen zu lassen.
Möchte ich jedoch durch die Berechnungen die Temperatur anzeigen lassen, erscheinen am Display lediglich irgendwelche Zufallszahlen.

Ich habe schon nach einer Lösung gesucht, jedoch bisher ohne Erfolg.
Ich habe ein paar Sachen probiert, und konnte feststellen, dass das Problem daran liegt das ich den Int-Wert auf einen Float-Wert umwandle. Verbessert mich wenn diese Vermutung falsch ist.

Nun denn, bin ich schon stark verzweifelt. Anbei befindet sich der Sketch, könnte mir bitte jemand helfen?

Schonmal Vielen Dank!

#include <stdint.h>
#include <stdio.h>
#include "LiquidCrystal.h"

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

int ADCValue;
char buffer[16];

void setup()
{
MyInit();
lcd.begin(16, 2);
}

void MyInit()
{

ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = 0x00;

}

void loop()
{

while (1)
{
    
    ADCSRA |= (1 << ADSC);
    while (!(ADCSRA & (1 << ADIF)));
    ADCValue = ADC;
   
 
 
    float MesswertVolt = ADCValue * 5.0;
    MesswertVolt = MesswertVolt / 1024.0 ;
    float Temperatur = (MesswertVolt - 0.5) / 0.01;

    lcd.setCursor(0, 0);
    sprintf(buffer, "%d", ADC);
    lcd.print(buffer);

    delay(500);

    ADCSRA |= (1 << ADIF);





}

}

bitte lies im Forum How to nach wie man Code in Code-Tags postest, so ist dein Post fast nicht lesbar.

Zur Sache:
Der Arduino-Weg zum Auslesen eines Analog Eingangs ginge eher so:

//#include <stdint.h>
//#include <stdio.h>
#include "LiquidCrystal.h"

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

int ADCValue;              // könnte man auch static im loop anlegen

const byte  tempPin = A0;  // Pin musst du richtig einsetzen

void setup()
{
  Serial.begin(115200); // hilft beim Debuggen
  lcd.begin(16, 2);
}

void loop()
{
  // einlesen

  ADCValue = analogRead(tempPin);

  // auswerten
  float MesswertVolt = ADCValue * 5.0;
  MesswertVolt = MesswertVolt / 1024.0 ;
  float Temperatur = (MesswertVolt - 0.5) / 0.01;

  // ausgeben (wenn es wirklich einen neuen Wert gibt)
  static int previousADCValue = 0;
  if (ADCValue != previousADCValue)
  {
    lcd.setCursor(0, 0);
    lcd.print (F("ADC  "));
    lcd.print (ADCValue);
    lcd.print (F("     "));
    lcd.setCursor (0, 1);
    lcd.print (F("Temp "));
    lcd.print (Temperatur);
    lcd.print (F("     "));

    Serial.print(F("ADC="));
    Serial.print (ADCValue);
    Serial.print (F("\tTemp="));
    Serial.println(Temperatur);
    previousADCValue = ADCValue;
  }
}

Hallo, danke für die Antwort!
Ich hätte vielleicht noch erwähnen sollen, dass dies für einer Übung in der Schule ist und ich dem Befehl "AnalogRead()" nicht verwenden darf, sondern mit dem Registern arbeiten muss.

Ist dein ADCValue denn nun (immer) richtig? Oder ist dein Problem die manuelle "eigene" Lösung für analogRead() ?

Auf jeden Fall ist dein
#include <stdint.h> und dein while (1) aus der falschen Vorlage abgeschrieben, wenn du eine Funktion void loop() definierst..

Hallo,

Also die ADCValue ist richtig, schwankt zwischen 151-154 was mit dem Taschenrechner umgerechnet ungefähr 26-26,5° ist.

Mein Problem liegt daran, dass wenn ich mit dieser ADCValue im Programm die Temperatur berechnen will, dieser nur eine Zufallszahl ausgibt (-18022, 75086....).

sprintf(buffer, "%f", floatVal); geht auf AVR 8bit Controllern normalerweise nicht.

lcd.print(floatVal); ist aber sowieso einfacher, weil du dir dann den buffer sparst.
Oder ist die Arduino Print Klasse auch tabu?

Diesen Befehl hat mir mein Lehrer im letzten Unterricht angesagt, bzw. er hat uns diesen eingetrichtert, daher dachte ich nicht, dass der Fehler daran liegen würde.

Ich habe die Ausgabe jetzt so gemacht wie du es mir gesagt hast, und schwupp, es funktioniert.

Vielen lieben Dank!!!!!

printf() ist schön. Aber für einfache Ausgaben braucht man das in der Arduino Software nicht. Das verwendet man u.a. wenn man Zahlen auf eine konstante Breite formatieren muss. Bei LCDs z.B. kann das sehr hilfreich sein

Es gibt nur eine Sorte Mensch, welche Fehlerfrei (oder frei von Irrtümern) ist, der Unmensch. Und eigentlich hat er ja auch recht. Denn die float Ausgabe ist in C und C++ für ALLE Systeme vorgesehen. Nur die AVR Implementierung tut das per default nicht, da es doch reichlich Ressourcen benötigt. Und die sind halt knapp.

Das Float in sprintf() kannst du in der platform.local.txt der zugehörigen Boarddefinition aktivieren.

Als Lehrer hat er den Vorteil, dass er nicht so sehr gezwungen wird, sein Wissen zu aktualisieren, sobald er eine Festanstellung (als Beamter) hat.
Es wäre sicher schön für Schüler, würde der Lehrer die vermittelten Grundlagen auch an der (vermutlich auch vorgegebenen) Hardware und Programmierumgebung selbst ausprobieren.
Aber so lernt ihr das Wesentliche ("Verzeihe deinen Lehrern, vielleicht wirst du selber mal eine")

Auch (@combie) sollte man gut zwischen der Sprachdefinition selbst, dem ziemlich umfangreichen library - System, und diversen Compilern und Ziel-Plattformen unterscheiden.

Wenn du diesen Thread nun noch als gelöst/erledigt markieren könntest, @danielh98 ...