Komplettprojekt - Quellcode & Aufbau

Im Komplettprojekt wird ein Arduino Due mit Ethernet- & DS-Karten-Shield in Kombination mit 9 MAX31855 Typ-K Messverstärkern verwendet um Temperaturen am Abgaskrümmer und Ansaugdrücke vor / nach Turbolader am Ansaugkrümmer zu messen und auf einer SD-Karte als .csv für Excel abzuspeichern.

  Quellcode

Der Quellcode verwendet viele globale Variablen. Zu Beginn werden die PINs für die Messverstärker, Analogeingänge und die beiden Status LEDs defeiniert.

void setup

Zu Beginn des Programmes wird die SD-Karte initialisiert und durch die Funktion CountFiles ermittelt welcher Dateiname LOG_X.csv mit X = Laufvariable für die Anzahl der Logs noch nicht vergeben ist und verwendet werden kann.  Da sich gezeigt hat, dass die Initialisierung der SD-Karte teils nicht zuverlässig funktioniert, wird nach Auffinden eines verwendbaren Dateinamens (und damit funktionsfähiger SD-Karte) eine Status LED auf PIN status_pin = 12 aktiviert, die ein erfolgreiches Loggen signalisiert.

void loop

Das Auslesen der MAX31855 benötigt im Vergleich zum Auslesen der analogen Messwerte sehr viel Zeit. Daher wird im Hauptteil des Programmes einer der neun MAX31855 ausgelesen und sämtliche fünf analogen Werte über die Funktion read_analog_values ausgelesen. Die ermittelten Werte werden über die Funktion generate_log_file_content in einen String der einer Zeile der .csv Log-Datei entspricht umgewandelt und anschließend auf die SD-Karte geschrieben.

Im nächsten Durchlauf erfolgt das Auslesen und Wegschreiben des nächsten MAX31855 und der fünf Analogwerte.

Zusätzlich überwacht die Funktion checkTemperature ob einer der Temperatursensoren auf einen Wert größer 600°C ansteigt. Bei Überschreiten wird eine LED auf PIN temp_max_warn_pin = 13 aktiviert.

Quellcode

Der Hochtemperaturlogger verwendet folgenden Quellcode :


#include <SPI.h>
#include "Adafruit_MAX31855.h"
#include <SD.h>

#define analog_pin_1 0
#define analog_pin_2 1
#define analog_pin_3 2
#define analog_pin_4 3
#define analog_pin_5 4
#define temp_max_warn_pin 13
#define status_pin 12

//SPI Datenverbindung zu den T-Messverstärkern : 22
#define MAXDO   22
//SPI CLOCK-Signal : 24
#define MAXCLK  24
//Aktivierung Messverstärker : 36 / 38 / .... / 52
#define MAXCS_1 36
#define MAXCS_2 38
#define MAXCS_3 40
#define MAXCS_4 42
#define MAXCS_5 44
#define MAXCS_6 46
#define MAXCS_7 48
#define MAXCS_8 50
#define MAXCS_9 52

//----Define-thermocouples-------------------------
  Adafruit_MAX31855 thermomodul_1(MAXCLK, MAXCS_1, MAXDO);
  Adafruit_MAX31855 thermomodul_2(MAXCLK, MAXCS_2, MAXDO);
  Adafruit_MAX31855 thermomodul_3(MAXCLK, MAXCS_3, MAXDO);
  Adafruit_MAX31855 thermomodul_4(MAXCLK, MAXCS_4, MAXDO);
  Adafruit_MAX31855 thermomodul_5(MAXCLK, MAXCS_5, MAXDO);
  Adafruit_MAX31855 thermomodul_6(MAXCLK, MAXCS_6, MAXDO);
  Adafruit_MAX31855 thermomodul_7(MAXCLK, MAXCS_7, MAXDO);
  Adafruit_MAX31855 thermomodul_8(MAXCLK, MAXCS_8, MAXDO);
  Adafruit_MAX31855 thermomodul_9(MAXCLK, MAXCS_9, MAXDO);
//----File-System-&-content------------------------
#define sd_chipSelect 4
File root;
File log_data_file;
int file_count = 0;
int serial_output = 1;
String log_file_name = "Log_0.txt";
String log_file_content;
//----Measurements-&-time-------------------------
double temperature_1, temperature_2, temperature_3, temperature_4, temperature_5, temperature_6, temperature_7, temperature_8, temperature_9;
double temp_max_warn = 600;
int analog_1, analog_2, analog_3, analog_4, analog_5;
int logtime;

void setup() {
  delay(500);
  pinMode(temp_max_warn_pin,OUTPUT);
  pinMode(status_pin,OUTPUT);
  Serial.begin(115200);
 
  if (!SD.begin(sd_chipSelect, SPI_HALF_SPEED)) {
    Serial.println("initialization failed!");
    delay(500);
    return;
  }
  Serial.println("initialization done.");
  delay(500);
  root = SD.open("/");
  CountFiles(root,0);
  log_data_file = SD.open(log_file_name, FILE_WRITE);
  Serial.print("\n Files on SD-CARD : ");
  Serial.println(file_count);
  Serial.print("sep=|\n TIME [s]|Temp 1[C]|Temp 2[C]|T3|T4|T5|T6|T7|T8|T9|Analog 1|A2|A3|A4|A5|\n");
  log_data_file.print("sep=|\n TIME [s]|Temp 1[C]|Temp 2[C]|T3|T4|T5|T6|T7|T8|T9|Analog 1|A2|A3|A4|A5|\n");
  log_data_file.close();

  temperature_1 = thermomodul_1.readCelsius();
  temperature_2 = thermomodul_2.readCelsius();
  temperature_3 = thermomodul_3.readCelsius();
  temperature_4 = thermomodul_4.readCelsius();
  temperature_5 = thermomodul_5.readCelsius();
  temperature_6 = thermomodul_6.readCelsius();
  temperature_7 = thermomodul_7.readCelsius();
  temperature_8 = thermomodul_8.readCelsius();
  temperature_9 = thermomodul_9.readCelsius();


  delay (1000);
}

void loop() {
  log_data_file = SD.open(log_file_name, FILE_WRITE);
  
  temperature_1 = thermomodul_1.readCelsius();
  read_analog_values();
  generate_log_file_content();
  log_data_file.print(log_file_content);

  temperature_2 = thermomodul_2.readCelsius();
  read_analog_values();
  generate_log_file_content();
  log_data_file.print(log_file_content);

  temperature_3 = thermomodul_3.readCelsius();
  read_analog_values();
  generate_log_file_content();
  log_data_file.print(log_file_content);

  temperature_4 = thermomodul_4.readCelsius();
  read_analog_values();
  generate_log_file_content();
  log_data_file.print(log_file_content);

  temperature_5 = thermomodul_5.readCelsius();
  read_analog_values();
  generate_log_file_content();
  log_data_file.print(log_file_content);

  temperature_6 = thermomodul_6.readCelsius();
  read_analog_values();
  generate_log_file_content();
  log_data_file.print(log_file_content);

  temperature_7 = thermomodul_7.readCelsius();
  read_analog_values();
  generate_log_file_content();
  log_data_file.print(log_file_content);

  temperature_8 = thermomodul_8.readCelsius();
  read_analog_values();
  generate_log_file_content();
  log_data_file.print(log_file_content);

  temperature_9 = thermomodul_9.readCelsius();
  read_analog_values();
  generate_log_file_content();
  log_data_file.print(log_file_content);

  log_data_file.close();

  checkTemperature();
}

void read_analog_values(){
    analog_1 = analogRead(analog_pin_1);
    analog_2 = analogRead(analog_pin_2);
    analog_3 = analogRead(analog_pin_3);
    analog_4 = analogRead(analog_pin_4);
    analog_5 = analogRead(analog_pin_5);
}

void generate_log_file_content(){
    logtime = millis();
    log_file_content = (String(logtime) + "|" + String(temperature_1) + "|" + String(temperature_2) + "|" + String(temperature_3) + "|" + String(temperature_4) + "|" + String(temperature_5) + "|" + String(temperature_6) + "|" + String(temperature_7) + "|" + String(temperature_8) + "|" + String(temperature_9) +"|" + String(analog_1) + "|" + String(analog_2) + "|" + String(analog_3) + "|" + String(analog_4) + "|" + String(analog_5) + "|\n");
    if (serial_output == 1)
    {
        Serial.print(log_file_content);
    }
}

void CountFiles(File dir, int numTabs) {
  int datei_vorhanden = 1;
  int i = 0;
  while (datei_vorhanden == 1) 
  {
    log_file_name = ("Log_" + String(i) + ".csv");
    if(SD.exists(log_file_name)){
      //SD.remove(log_file_name);
      i = i + 1;
    }
    else
    {
      datei_vorhanden = 0; 
      analogWrite (status_pin,90);
    }
  }
}

void checkTemperature()
{
  if ((temperature_1 >= temp_max_warn) || (temperature_2 >= temp_max_warn) || (temperature_3 >= temp_max_warn) || (temperature_4 >= temp_max_warn) || (temperature_5 >= temp_max_warn) || (temperature_6 >= temp_max_warn) || (temperature_7 >= temp_max_warn) || (temperature_8 >= temp_max_warn) || (temperature_9 >= temp_max_warn))
  {
    if (serial_output == 1)
    {
        Serial.print("ZU heiss ! \n");
    }
    analogWrite (temp_max_warn_pin,90);
  }
  else
  {
    analogWrite (temp_max_warn_pin,0);
  }
}

 ...

Aufbau

Verwendet wird ein Arduino Due mit Ethernet & SD-Karten-Shield. Die Ethernetfunktionalität wird hier jedoch nicht verwendet. Am Arduino angeschlossen sind 9 digitale Messverstärker MAX31855 für Typ-K Sensoren. Die Messverstärker kommunizieren über Software-SPI mit dem Arduino. Sie teilen sich PIN 22 als Datenausgang DO und PIN 24 als Clock bzw. Taktgeber. An den analogen Eingängen werden 5 analoge Signale eingelesen.

Die Galerie zeigt den schematischen Aufbau des Komplettprojektes






Wir benutzen Cookies

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.