Hallo,
so stimmt das ja erstmal. Zum Test ob alles richtig rechnet, habe ich die letzten drei Serial Ausgaben mit 4 Kommastellen anzeigen lassen. Und plötzlich kommt Müll raus. Normal müßten doch x.0000 immer angezeigt werden, weil es Ganzzahlen sind. Was macht dabei Serial.print(x,4) anders?
Änderung mit unsinnigen Werten
Serial.print("Vorkommastellen ");
Serial.println(Vorkommastellen,4);
Restwert = Mittelwert * 100; // 2 Kommastellen als Ganzzahl (Bsp. 2537)
Serial.print("Restwert ");
Serial.println(Restwert,4);
Kommastellen = Restwert - Vorkommastellen; // Kommastellen für sich als Ganzzahl
Serial.print("Kommastellen ");
Serial.println(Kommastellen,4);
kompletter Code
// Arduino Mega 2560
// Deklaration der Funktionen, übernimmt die Arduino IDE selbst
// unsigned int read_MAX6675();
// Arduino Mega 2560
// Port-Pins definieren
int MAX_CS = 24; // Arduino Pin, SPI ChipSelect, 1. MAX6675
int MAX_SO = 26; // Arduino Pin, SPI Datenleitung
int MAX_CLK = 28; // Arduino Pin, SPI Clockleitung
// Deklaration Datentypen und Variablen
int Poti = 0; // Eingang A0
int Filterfaktor = 1;
float Teiler = 2.0;
unsigned int Vorkommastellen; // Sicherung der Vorkommastellen
unsigned int Restwert; // 2 Kommastellen als Ganzzahl
unsigned int Kommastellen; // Kommastellen für sich als Ganzzahl
unsigned int value = 0;
unsigned int Temp = 0;
float Mittelwert = 0;
float actual = 0;
void setup() {
Serial.begin(9600);
pinMode(MAX_CS, OUTPUT);
pinMode(MAX_SO, INPUT);
pinMode(MAX_CLK, OUTPUT);
digitalWrite(MAX_CS, HIGH); // Ruhezustand
digitalWrite(MAX_CLK, LOW); // Ruhezustand
}
void loop() {
delay(1000);
Filterfaktor = analogRead(Poti)/8; // lese analog Pin A0 ein und Begrenzung auf 128
if(Filterfaktor == 0) Filterfaktor = 1; // wenn A0 = 0, dann setze es auf 1 (Mindestwert)
Teiler = Filterfaktor + 1; // Teiler immer eins größer wie Filterfaktor
Temp = read_MAX6675();
actual = Temp / 4.0;
Serial.print(Filterfaktor);
Serial.print(" ");
Serial.print(actual,2); // aktueller Meßwert von A0
Serial.print(" ");
Mittelwert = (Temp/4.0 + Mittelwert * Filterfaktor) / Teiler;
Serial.println(Mittelwert,4); // gleitender Mittelwert (Bsp. 25,37)
Vorkommastellen = (unsigned int) Mittelwert*100; // Sicherung der Vorkommastellen (Bsp. 2500)
Serial.print("Vorkommastellen ");
Serial.println(Vorkommastellen);
Restwert = Mittelwert * 100; // 2 Kommastellen als Ganzzahl (Bsp. 2537)
Serial.print("Restwert ");
Serial.println(Restwert);
Kommastellen = Restwert - Vorkommastellen; // Kommastellen für sich als Ganzzahl
Serial.print("Kommastellen ");
Serial.println(Kommastellen);
}
// -----------------------------------------------------------------------------------------------------
// Der MAX6675 wird ausgelesen und der 12-Bit-Wert zurückgegeben ********
unsigned int read_MAX6675 ()
{
int i;
unsigned int data;
data = 0;
digitalWrite(MAX_CS, LOW); // CS=Low
for(i=0;i<16;i++)
{
delayMicroseconds(1); // warte 100us
digitalWrite(MAX_CLK,HIGH); // SCK=High
delayMicroseconds(1); // warte 100us
// data = ((data<<1) | MAX_SO); // schiebe nach links und lies SO
data = ((data<<1) | digitalRead(MAX_SO)); // schiebe nach links und lies SO
digitalWrite(MAX_CLK, LOW); // SCK=Low
}
delayMicroseconds(1);
digitalWrite(MAX_CS, HIGH); // CS=High
delayMicroseconds(1); // warte 100us
return (data>>3); // gib 12-Bit Wert zurück
}