P100 Temperatur über Arduino auswerten.

Ein Hallo an alle Arduino Begeisterten vom Neuling.

Ich habe mich schon darüber auf diversen Seiten informiert und folgende Schaltung aufgebaut:

http://openenergymonitor.org/emon/sites/default/files/rtdmodule.png

Dazu der Rest der Anleitung hier:

http://openenergymonitor.org/emon/node/75

Mein Frage ist was alles unnötig in dem Programm ist wenn ich den Multiplexer weglasse, da nur 1 PT100 ausgewertet werden soll und direkt ohne über ein Multiplexer auf die OP-Schaltung geht.

Ich bedanke mich im voraus schon mal für hilfreiche & nützliche Tips.

Gern kann man mir auch hier Nachrichten als Antwort persönlich zuschicken.

Danke Arduino Fans vom neuen Arduino Fan.

Könntest du vielleicht deinen Code posten? Find grad meine Kristallkugel nicht! :grin:

Jago: Könntest du vielleicht deinen Code posten? Find grad meine Kristallkugel nicht! :grin:

Der Code von dort lautet:

include "RTDModule.h"

RTDModule rtd;

//---------------------------------------------------------------------------- // Temperature variables //---------------------------------------------------------------------------- double CYLB,CYLT,COL;

//---------------------------------------------------------------------------- // Setup //---------------------------------------------------------------------------- void setup() { rtd.setPins(4,5,2); //RTD PT1000 pins 4,5 are digital pins for multiplexer, 2 is analog input

//rtd.calibration( input number, scaler, offset ) rtd.calibration(0, 0.120270927, -15.066198679); //INPUT 0 pin 12 rtd.calibration(1, 0.120821076, -13.824162893); //INPUT 1 pin 14 rtd.calibration(2, 0.120400012, -14.91327759); //INPUT 2 pin 15

analogReference(INTERNAL); //Set reference to 1.1V ready for RTD measurements

Serial.begin(9600); }

//---------------------------------------------------------------------------- // Main loop //---------------------------------------------------------------------------- void loop() { //Get temperatures and pass through digital low pass filter COL = digitalLowPass(COL, rtd.getTemperature(0) ,0.90); CYLB = digitalLowPass(CYLB, rtd.getTemperature(1) ,0.90); CYLT = digitalLowPass(CYLT, rtd.getTemperature(2) ,0.90);

//Print temperatures out to serial Serial.print(COL); Serial.print(' '); Serial.print(CYLB); Serial.print(' '); Serial.println(CYLT);

} //----------------------------------------------------------------------------

//Digital low pass filter double digitalLowPass(double last_smoothed, double new_value, double filterVal) { double smoothed = (new_value * (1 - filterVal)) + (last_smoothed * filterVal); return smoothed; }

Die Include-Datei

ifndef RTDModule_h

define RTDModule_h

include "WProgram.h"

class RTDModule { public:

void setPins(int _dpinA, int _dpinB, int _analogInPin); void calibration(int channel, double _calA,double _calB); double getTemperatureSmooth(int channel, int AVnum, int SMnum); double getTemperature(int channel); int getADC(); int dval; private:

int analogInPin; int addA; int addB; int dpinA; int dpinB; double scale[5]; double offset[5];

void setChannel(int channel);

};

endif

sarkasmus an Ein Glück das du so ein anfängerfreundliches Stück Code ausgesucht hast sarkasmus aus

Ich werd´s mal probieren auf 1x PT100 umzuschreiben. Wenn du vollständig verstehen willst was da passiert musst du dir die .cpp anschauen. Da steckt dann auch die Steuerung für den multiplexer drin.

(rot fliegt raus)

include "RTDModule.h"

RTDModule rtd;

//---------------------------------------------------------------------------- // Temperature variables //---------------------------------------------------------------------------- double CYLB;CYLT,COL;

//---------------------------------------------------------------------------- // Setup //---------------------------------------------------------------------------- void setup() { rtd.setPins(4,5,2); //RTD PT1000 pins 4,5 are digital pins for multiplexer, 2 is analog input

//rtd.calibration( input number, scaler, offset ) rtd.calibration(0, 0.120270927, -15.066198679); //INPUT 0 pin 12

rtd.calibration(1, 0.120821076, -13.824162893); //INPUT 1 pin 14 rtd.calibration(2, 0.120400012, -14.91327759); //INPUT 2 pin 15

analogReference(INTERNAL); //Set reference to 1.1V ready for RTD measurements

Serial.begin(9600); }

//---------------------------------------------------------------------------- // Main loop //---------------------------------------------------------------------------- void loop() { //Get temperatures and pass through digital low pass filter COL = digitalLowPass(COL, rtd.getTemperature(0) ,0.90);

CYLB = digitalLowPass(CYLB, rtd.getTemperature(1) ,0.90); CYLT = digitalLowPass(CYLT, rtd.getTemperature(2) ,0.90);

//Print temperatures out to serial Serial.print(COL); Serial.print(' ');

Serial.print(CYLB); Serial.print(' '); Serial.println(CYLT);

} //----------------------------------------------------------------------------

//Digital low pass filter double digitalLowPass(double last_smoothed, double new_value, double filterVal) { double smoothed = (new_value * (1 - filterVal)) + (last_smoothed * filterVal); return smoothed; }

rtd.setPins(4,5,2);

Nummer 4&5 kann doch auch mit raus.....ist doch für den Multiplexer gedacht oder hab ich das falsch interpretiert?

und die Include Datei kann doch sicherlich komplett rausgelassen werden oder? Das ist doch alles nur für den Multiplexer gedacht!?

anbeihab ich dir noch die .ccp datei hier reingehangen:

include "WProgram.h"

include "RTDModule.h"

//----------------------------------------------------------------------- // Set module pins //----------------------------------------------------------------------- void RTDModule::setPins(int _dpinA, int _dpinB, int _analogInPin) { analogInPin = _analogInPin; dpinA = _dpinA; dpinB = _dpinB;

pinMode(dpinA, OUTPUT); pinMode(dpinB, OUTPUT); dval=10; //A delay value.. }

//----------------------------------------------------------------------- // Set calibration values // // Calibration needs to be set for every RTD input on the multiplexor //----------------------------------------------------------------------- void RTDModule::calibration(int channel, double _calA,double _calB) { scale[channel] = _calA; offset[channel] = _calB; }

//----------------------------------------------------------------------- // Read temperature //----------------------------------------------------------------------- double RTDModule::getTemperature(int channel) { setChannel(channel); double temperature = scale[channel] * analogRead(analogInPin) + offset[channel]; return temperature; } //-----------------------------------------------------------------------

//----------------------------------------------------------------------- // RAW analogread //----------------------------------------------------------------------- int RTDModule::getADC() { return analogRead(analogInPin); } //-----------------------------------------------------------------------

//----------------------------------------------------------------------- // setChannel is used to select the multiplexor channel to be read from //----------------------------------------------------------------------- void RTDModule::setChannel(int channel) { //Multiplexor map if (channel==0){addA=0; addB=0;} if (channel==1){addA=1; addB=0;} if (channel==2){addA=0; addB=1;} if (channel==3){addA=1; addB=1;}

//Set the multiplexor if (addA==1) digitalWrite(dpinA,HIGH); else digitalWrite(dpinA,LOW); if (addB==1) digitalWrite(dpinB,HIGH); else digitalWrite(dpinB,LOW);

delay(dval); //Here is the delay }

Nö und Nö.

Die include Datei braucht die Angabe welche Digitalpins sie verwenden soll. Weglassen kannst sie ohne weiteres auch nicht, schließlich stellt sie ja neben den Multiplexerfunktionen noch ein paar ander Funktionen zu Verfügung. Was du probieren kannst ist alles was mit Multiplexer zu tun hat rausschmeißen und dann nur noch die Funktionen von #include "WProgram.h" nutzen. Aber hier hört meine Kompetenz auf, ich will mich erst demnächst mit den schreiben von Libraries auseinandersetzen. Irgendwo gibt´s auf der HP noch nen Tutorial wie man das macht, gefunden hab ich´s leider grad nicht. Theoretisch kannst du aber auch #include "WProgram.h" in dein Programm einbinden und nachstellen was in RTDModule.h passiert. Sollte eigentlich nicht so schwer sein, allerdings würd ich das wie gesagt nicht als Anfängergeeignet bezeichnen.

Hab das Tutorial gefunden.

http://arduino.cc/en/Hacking/LibraryTutorial