Temperaturmessung mit mehreren PT100 und Max31865 Breakout Boards über SPI

Hallo, Ich bin nach einigen Jahren Pause wieder dabei mich mit dem Arduino zu befassen. Und wie es so oft ist, komme ich nicht weiter, und möchte hier um Hilfe bitten.

Ich habe einen Versuchsaufbau mit einem PT1000 und einem Max31865 Breakout Board aufgebaut. Das Auslesen der Temperatur funktioniert mit Hilfe des Arduino Library (link nachstehend)einfach und gut.Arduino Code | Adafruit MAX31865 RTD PT100 or PT1000 Amplifier | Adafruit Learning System

Jedoch klemmt es im nächsten Schritt. Ich möchte gern mehrere Module nacheinander auslesen.
In der Zeile "Adafruit_MAX31865 max = Adafruit_MAX31865(10);" wähle ich den CS_Pin für mein Hardware SPI aus in dem Fall Pin 10. Für das 2. Modul Sollte zb. CS_Pin 11 gewählt werden. Doch leider bekomme ich nicht den dreh raus wie ich diese im Loop nacheinander auslese.Ist die Library nur für einen Controller geschrieben? Hier ist der Code zum auslesen eines PT1000. Könnte mir jemand helfen wie ich weitere auslesen kann?

#include <Adafruit_MAX31865.h>
Adafruit_MAX31865 max = Adafruit_MAX31865(10);
#define RREF 4300.0
void setup() {
Serial.begin(115200);
Serial.println("Adafruit MAX31865 PT1000 Sensor Test!");
max.begin(MAX31865_2WIRE); // set to 2WIRE or 4WIRE as necessary
}
void loop() {
uint16_t rtd = max.readRTD();
Serial.print("Temperature = ");
Serial.println(max.temperature(1000, RREF));
}

Objekt-orientierte Programmierung ist dir fremd?

Du brauchst einfach mehrere Adafruit_MAX31865 Objekte

Sollte zb. CS_Pin 11 gewählt werden.

Uuf dem UNO vieleicht besser nicht; da liegt der SPI Bus.
Grüße Uwe

Ok, Objektorientiert klingt für mich gut. Ich gebe zu, meine Programmierkenntnisse sind eher schlecht, vermutlich ist die Lösung auch recht einfach. Trotzdem, es löst sich für mich nicht auf. Wenn ich mehrere "Adafruit_MAX31865 max = Adafruit_MAX31865(XX); anlege geht es nicht, umbenennen geht nicht,..
Wie mache ich es mit der vorhandenen Library,das ich mehrere Objekte erzeugen kann?

Biele01:
Ok, Objektorientiert klingt für mich gut. Ich gebe zu, meine Programmierkenntnisse sind eher schlecht, vermutlich ist die Lösung auch recht einfach. Trotzdem, es löst sich für mich nicht auf. Wenn ich mehrere "Adafruit_MAX31865 max = Adafruit_MAX31865(XX); anlege geht es nicht, umbenennen geht nicht,..
Wie mache ich es mit der vorhandenen Library,das ich mehrere Objekte erzeugen kann?

Hast du dir das Beispiel in der Library angesehen ?
Der Aufruf des Objektes verlangt alle Pins des SPI, nicht nur CS.

Wenn ich mehrere "Adafruit_MAX31865 max = Adafruit_MAX31865(XX); anlege geht es nicht, umbenennen geht nicht,..

Du musst denen natürlich verschiedene Namen geben. z.B. max1 und max2 Auch ein Array aus Objekten wäre möglich

HotSystems:
Hast du dir das Beispiel in der Library angesehen ?
Der Aufruf des Objektes verlangt alle Pins des SPI, nicht nur CS.

Anstatt dich blind auf die Beispiele zu verlassen schaue dir lieber die Library selbst an:

Adafruit_MAX31865(int8_t spi_cs, int8_t spi_mosi, int8_t spi_miso, int8_t spi_clk);
Adafruit_MAX31865(int8_t spi_cs);

In der .cpp Datei wird es noch deutlicher:

// Software (bitbang) SPI
Adafruit_MAX31865::Adafruit_MAX31865(int8_t spi_cs, int8_t spi_mosi, int8_t spi_miso, int8_t spi_clk)

...

// Hardware SPI init
Adafruit_MAX31865::Adafruit_MAX31865(int8_t spi_cs) {

Passt also so. Wenn du Pins angibst wird SPI nur in Software emuliert

Hat geklappt!! Vielen Dank. Jetzt hab ichs auch verstanden.

Serenifly:
Anstatt dich blind auf die Beispiele zu verlassen schaue dir lieber die Library selbst an:

Adafruit_MAX31865(int8_t spi_cs, int8_t spi_mosi, int8_t spi_miso, int8_t spi_clk);

Adafruit_MAX31865(int8_t spi_cs);




In der .cpp Datei wird es noch deutlicher:


// Software (bitbang) SPI
Adafruit_MAX31865::Adafruit_MAX31865(int8_t spi_cs, int8_t spi_mosi, int8_t spi_miso, int8_t spi_clk)

...

// Hardware SPI init
Adafruit_MAX31865::Adafruit_MAX31865(int8_t spi_cs) {




Passt also so. Wenn du Pins angibst wird SPI nur in Software emuliert

Ahhh ok, das hatte ich übersehen.
Danke für die Ergänzung.

Hey Guys.
I also had the problem using more than one MAX31865. I solved the problem with take over chip select to the MAX31865.cpp library.

I use one library because of the delay inside (10ms and 65ms).
due to problems with other functions they are time related, i had to make sure that pass through when time is not gone.

For reading 12 of MAX31865 breakeout from adafruit, with normal library, i solved like this.

  1. Step is variable name in the header MAX31865.h under puplic:
[code]
  float temperature(float RTDnominal, float refResistor);
  int  read_cs(int main_cs);//------------------------------------------------->

[/code]

  1. declare function somewhere in MAX31865.cpp
[code]
static SPISettings max31865_spisettings = SPISettings(500000, MSBFIRST, SPI_MODE1);
int Adafruit_MAX31865::read_cs(int main_cs){_cs=main_cs;} //------------------------------------------------->
// Software (bitbang) SPI

[/code]

  1. make the loop in main code to get the values (from the main loop you start it with --> Loop_Temp();
[code]
void Loop_Temp(){for (int cs=42;cs<=67;i++){max.read_cs(cs);max.begin(MAX31865_4WIRE);NameTemp(cs);if(cs==45){cs=59;}}}

[/code]

  1. save the values in correct names
[code]
int NameTemp(int NameCounter){
  switch (NameCounter) {
      case 42:T_FW_VL=max.temperature(100, RREF);break;
      case 43:T_FBH_VL=max.temperature(100, RREF);
      case 44:T_Boiler=max.temperature(100, RREF);
      case 45: T.....
      case 59: T....
      case 60: T....

[/code]

  1. use the values however you want. --> in my case in the display (and logic for controll devices)
    For example
    Serial.print("Temperature is: ");
    Serial.println(T_FW_VL);

You can also do other way to read out and save the values.

if you have the delay problem like me, then you have to do little bit more in the library and the main code.
i am not sure if this solution is important for other people, but if yes i can also share the code changes of the library and the code how i read the values. :wink: