Reading 16 ports of mux for thermocouples and thermistors; just add 1 more address for 32 ports.
Yes, the thermocouples (commercial for engine monitoring) all worked without issue. Accuracy tracked from 0C to 100C ... did not test up to 200C as engine fluids generally under 300F.
The MAX31855 is solely for Exhaust Gas Temp, EGT.
#include "./MAX31855.h" // Local (embedded) library
int thermoDO = 51; // SPI Data Out
int thermoCS_1 = 52; // first EGT thermocouple amp Chip Select
int thermoCLK = 53; // common SPI clock to both 31855s
int thermoCS_2 = 50; // second EGT thermocouple amp Chip Select used in Europa design
int8_t addr_0 = 36; // 2^0 Addressline 0 going to analog mux
int8_t addr_1 = 34; // 2^1 Addressline 1 going to analog mux
int8_t addr_2 = 32; // 2^2 Addressline 2 going to analog mux
int8_t addr_3 = 30; // 2^3 Addressline 3 going to analog mux
/* CONCEPT
* A single MAX31855 chip will be used in conjunction (front-ended) by a 16 channel analog switch. channel_address_ 0-3 will be set HIGH/LOW
* to represent 0 through 15 address. Then, after settling delay(?) the thermocouple object will be called similarily to below. Address will
* be incremented, allowed to settle, and the thermocouple object called again. These calls must take place from within tab JSON and a small
* function created so it can be called from the main program loop on tab: Engine_Monitor_1. Each JSON function must print a unique identifier
* so that the downstream CodeRed program can select the tag, convert to a numeric and assign a label.
*/
MAX31855 thermocouple_(thermoCLK, thermoCS_2, thermoDO);
// ________________________________________________________________________SPI bus #1
float thermocouple_channel( int mux_address) {
switch(mux_address) {
case 0:
digitalWrite(addr_0, LOW); digitalWrite(addr_1, LOW); digitalWrite(addr_2, LOW); digitalWrite(addr_3, LOW);
break;
case 1:
digitalWrite(addr_0, HIGH); digitalWrite(addr_1, LOW); digitalWrite(addr_2, LOW); digitalWrite(addr_3, LOW);
break;
case 2:
digitalWrite(addr_0, LOW); digitalWrite(addr_1, HIGH); digitalWrite(addr_2, LOW); digitalWrite(addr_3, LOW);
break;
case 3:
digitalWrite(addr_0, HIGH); digitalWrite(addr_1, HIGH); digitalWrite(addr_2, LOW); digitalWrite(addr_3, LOW);
break;
case 4:
digitalWrite(addr_0, LOW); digitalWrite(addr_1, LOW); digitalWrite(addr_2, HIGH); digitalWrite(addr_3, LOW);
break;
case 5:
digitalWrite(addr_0, HIGH); digitalWrite(addr_1, LOW); digitalWrite(addr_2, HIGH); digitalWrite(addr_3, LOW);
break;
case 6:
digitalWrite(addr_0, LOW); digitalWrite(addr_1, HIGH); digitalWrite(addr_2, HIGH); digitalWrite(addr_3, LOW);
break;
case 7:
digitalWrite(addr_0, HIGH); digitalWrite(addr_1, HIGH); digitalWrite(addr_2, HIGH); digitalWrite(addr_3, LOW);
break;
case 8:
digitalWrite(addr_0, LOW); digitalWrite(addr_1, LOW); digitalWrite(addr_2, LOW); digitalWrite(addr_3, HIGH);
break;
case 9:
digitalWrite(addr_0, HIGH); digitalWrite(addr_1, LOW); digitalWrite(addr_2, LOW); digitalWrite(addr_3, HIGH);
break;
case 10:
digitalWrite(addr_0, LOW); digitalWrite(addr_1, HIGH); digitalWrite(addr_2, LOW); digitalWrite(addr_3, HIGH);
break;
case 11:
digitalWrite(addr_0, HIGH); digitalWrite(addr_1, HIGH); digitalWrite(addr_2, LOW); digitalWrite(addr_3, HIGH);
break;
case 12:
digitalWrite(addr_0, LOW); digitalWrite(addr_1, LOW); digitalWrite(addr_2, HIGH); digitalWrite(addr_3, HIGH);
break;
case 13:
digitalWrite(addr_0, HIGH); digitalWrite(addr_1, LOW); digitalWrite(addr_2, HIGH); digitalWrite(addr_3, HIGH);
break;
case 14:
digitalWrite(addr_0, LOW); digitalWrite(addr_1, HIGH); digitalWrite(addr_2, HIGH); digitalWrite(addr_3, HIGH);
break;
case 15:
digitalWrite(addr_0, HIGH); digitalWrite(addr_1, HIGH); digitalWrite(addr_2, HIGH); digitalWrite(addr_3, HIGH);
break;
}
delay(75);
float temp = 0.00;
double c = thermocouple_.readCelsius();
if (isnan(c)) {
// error code here
} else {
temp = thermocouple_.readInternal() ;
temp = thermocouple_.readFarenheit() ;
}
return (temp) ;
}