More then one MAX6675 in one node? ...smoking meat and fish...
-
I'm using this example to have control over the temperature in the meat in my smoker, and it is working fine.
The question:
Can I have 6 temp sensors/MAX6675 connected to one node?
How do I change the exemple?// this example is public domain. enjoy! // www.ladyada.net/learn/sensors/thermocouple // Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 //#define MY_RADIO_RFM69 #include <SPI.h> #include <MySensors.h> #include "max6675.h" #define MY_NODE_ID 10 #define CHILD_ID_TEMP 10 #define TEMP_SENSOR_DIGITAL_PIN 4 int thermoDO = 4; int thermoCS = 5; int thermoCLK = 6; MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO); int vccPin = 3; int gndPin = 2; MyMessage msg(CHILD_ID_TEMP, V_TEMP); void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Temp Sensor", "0.1"); // Register all sensors to gateway (they will be created as child devices) present(CHILD_ID_TEMP, S_TEMP); } void setup() { Serial.begin(115200); // use Arduino pins pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH); pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW); Serial.println("MAX6675 test"); // wait for MAX chip to stabilize delay(500); } void loop() { // basic readout test, just print the current temp int tempCelsius = thermocouple.readCelsius(); Serial.print("C = "); Serial.println(thermocouple.readCelsius()); Serial.print("F = "); Serial.println(thermocouple.readFahrenheit()); send(msg.set(tempCelsius)); delay(5000); }```
-
Where do you buy the sensors?
-
ebay.com
ex.http://www.ebay.com/itm/381359075336?_trksid=p2055119.m1438.l2649&ssPageName=STRK%3AMEBIDX%3AIT
-
@jonehr yes you can. You need different CS pins for each sensor, but the rest of the pins can be shared.
-
Thank you. I'll make a try.
-
@jonehr great. Please report back on the progress.
If you want to dive deeper i to how SPI works, sparkfun has a nice tutorial.
-
@mfalkvidd
Thank you.
I'll do so.
-
Now I've studied and done some copy pasting...I'm not a programmer as you can see.
This code seems to work.. a bit...
My problem now is that I don't know how to write the code to tell the controller/Domoticz that there are three sensors to the node. I only get one child in "the hardware list" in Domoticz.// Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 //#define MY_RADIO_RFM69 #include <SPI.h> #include <MySensors.h> #include "max6675.h" #define MY_NODE_ID AUTO #define CHILD_ID_TEMP AUTO #define TEMP_SENSOR_DIGITAL_PIN 4 //#define NUMBER_OF_SENSORS 3 // Change this depending on how many sensors you connect. MyMessage msg(CHILD_ID_TEMP, V_TEMP); int thermoDO = 4; int thermoCS = 5; int thermoCS2 = 7; int thermoCS3 = 8; int thermoCLK = 6; MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO); MAX6675 thermocouple2(thermoCLK, thermoCS2, thermoDO); MAX6675 thermocouple3(thermoCLK, thermoCS3, thermoDO); int vccPin = 3; int gndPin = 2; void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Temp Sensor", "0.1"); // Register all sensors to gateway (they will be created as child devices) present(CHILD_ID_TEMP, S_TEMP); } void setup() { Serial.begin(115200); // use Arduino pins pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH); pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW); Serial.println("MAX6675 test"); // wait for MAX chip to stabilize delay(500); } void loop() { // basic readout test, just print the current temp int tempCelsius = thermocouple.readCelsius(); int tempCelsius2 = thermocouple2.readCelsius(); int tempCelsius3 = thermocouple3.readCelsius(); Serial.print("prob1---C = "); Serial.println(thermocouple.readCelsius()); Serial.print("prob2---C = "); Serial.println(thermocouple2.readCelsius()); Serial.print("prob3---C = "); Serial.println(thermocouple3.readCelsius()); send(msg.set(tempCelsius)); send(msg.set(tempCelsius2)); send(msg.set(tempCelsius3)); delay(5000); }```
My Domotics log:
2017-01-03 21:23:57.057 (Mysensor server) Temp (2.1.0)
2017-01-03 21:23:57.083 (Mysensor server) Temp (2.1.0)
2017-01-03 21:23:57.105 (Mysensor server) Temp (2.1.0) ```My serial log:
prob1---C = 0 MCO:BGN:INIT NODE,CP=RNNNA--,VER=2.1.0
3 TSM:INIT
4 TSF:WUR:MS=0
11 TSM:INIT:TSP OK
13 TSF:SID:OK,ID=10
14 TSM:FPAR
51 TSF:MSG:SEND,10-10-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
521 TSF:MSG:READ,0-0-10,s=255,c=3,t=8,pt=1,l=1,sg=0:0
526 TSF:MSG:FPAR OK,ID=0,D=1
1574 TSF:MSG:READ,8-8-10,s=255,c=3,t=8,pt=1,l=1,sg=0:1
2058 TSM:FPAR:OK
2059 TSM:ID
2060 TSM:ID:OK
2062 TSM:UPL
2067 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=OK:1
2077 TSF:MSG:READ,0-0-10,s=255,c=3,t=25,pt=1,l=1,sg=0:1
2082 TSF:MSG:PONG RECV,HP=1
2085 TSM:UPL:OK
2086 TSM:READY:ID=10,PAR=0,DIS=1
2092 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=OK:0100
2101 TSF:MSG:READ,0-0-10,s=255,c=3,t=15,pt=6,l=2,sg=0:0100
2108 TSF:MSG:SEND,10-10-0-0,s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=OK:2.1.0
2116 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=6,pt=1,l=1,sg=0,ft=0,st=OK:0
2130 TSF:MSG:READ,0-0-10,s=255,c=3,t=6,pt=0,l=1,sg=0:M
2138 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=11,pt=0,l=11,sg=0,ft=0,st=OK:Temp Sensor
2147 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=OK:0.1
2155 TSF:MSG:SEND,10-10-0-0,s=255,c=0,t=6,pt=0,l=5,sg=0,ft=0,st=OK:2.1.0
2161 MCO:REG:REQ
2165 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=OK:2
2171 TSF:MSG:READ,0-0-10,s=255,c=3,t=27,pt=1,l=1,sg=0:1
2177 MCO:PIM:NODE REG=1
2179 MCO:BGN:STP
MAX6675 test
2680 MCO:BGN:INIT OK,TSP=1
prob1---C = 0.00
prob2---C = 0.00
prob3---C = 23.75
2891 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:256
2909 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:32
2917 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:23
prob1---C = 0.00
prob2---C = 16.00
prob3---C = 23.50
8130 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:0
8138 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:0
8146 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:23
-
@jonehr great that you got them workin.
All three sensors need to be presented, and the sensor number needs to be set when sending values. See the temperature example, especially this part:
// Present all sensors to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { present(i, S_TEMP); }
for presentation and this part for sending values:
// Send in the new temperature send(msg.setSensor(i).set(temperature,1));
-
Now I've tried all day...I can't get it to work.
Trying to follow your advice @mfalkvidd but only made small steps with "presentation". Very thankful for your help but unfortunately I don't get it right.
I've specified 5 sensors to the node but Domoticz sees 6 . The only working child is child 255. There I see the temperature.
The code looks like this now:// Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 //#define MY_RADIO_RFM69 #include <SPI.h> #include <MySensors.h> #include "max6675.h" #define MY_NODE_ID AUTO #define CHILD_ID_TEMP AUTO #define TEMP_SENSOR_DIGITAL_PIN 4 #define MAX_ATTACHED_SENSORS 5 #define NUMBER_OF_SENSORS 5 // Change this depending on how many sensors you connect. MyMessage msg(CHILD_ID_TEMP, V_TEMP); int gndPin = 2; int vccPin = 3; int thermoDO = 4; int thermoCLK = 6; int thermoCS1 = 5; int thermoCS2 = 7; int thermoCS3 = 8; int thermoCS4 = 8; int thermoCS5 = 8; MAX6675 thermocouple1(thermoCLK, thermoCS1, thermoDO); MAX6675 thermocouple2(thermoCLK, thermoCS2, thermoDO); MAX6675 thermocouple3(thermoCLK, thermoCS3, thermoDO); MAX6675 thermocouple4(thermoCLK, thermoCS4, thermoDO); MAX6675 thermocouple5(thermoCLK, thermoCS5, thermoDO); void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Temp Sensor", "0.1"); // Present all sensors to controller for (int i=0; i<NUMBER_OF_SENSORS && i<MAX_ATTACHED_SENSORS; i++) { present(i, S_TEMP); // Register all sensors to gateway (they will be created as child devices) present(CHILD_ID_TEMP, S_TEMP); } } void setup() { Serial.begin(115200); // use Arduino pins pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH); pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW); Serial.println("MAX6675 test"); // wait for MAX chip to stabilize delay(500); } void loop() { //basic readout test, just print the current temp int tempCelsius1 = thermocouple1.readCelsius(); int tempCelsius2 = thermocouple2.readCelsius(); int tempCelsius3 = thermocouple3.readCelsius(); int tempCelsius4 = thermocouple4.readCelsius(); int tempCelsius5 = thermocouple5.readCelsius(); Serial.print("prob1---C = "); Serial.println(thermocouple1.readCelsius()); Serial.print("prob2---C = "); Serial.println(thermocouple2.readCelsius()); Serial.print("prob3---C = "); Serial.println(thermocouple3.readCelsius()); send(msg.set(tempCelsius1)); send(msg.set(tempCelsius2)); send(msg.set(tempCelsius3)); send(msg.set(tempCelsius4)); send(msg.set(tempCelsius5)); //for (int i=0; i<NUMBER_OF_SENSORS && i<MAX_ATTACHED_SENSORS; i++) { // Send in the new temperature // send(msg.setreadCelsius(i));} delay(5000); }
And the serial log:
prob1---C = 0 MCO:BGN:INIT NODE,CP=RNNNA--,VER=2.1.0
3 TSM:INIT
4 TSF:WUR:MS=0
11 TSM:INIT:TSP OK
13 TSF:SID:OK,ID=10
14 TSM:FPAR
51 TSF:MSG:SEND,10-10-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
2058 !TSM:FPAR:NO REPLY
2060 TSM:FPAR
2096 TSF:MSG:SEND,10-10-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
3083 TSF:MSG:READ,0-0-10,s=255,c=3,t=8,pt=1,l=1,sg=0:0
3087 TSF:MSG:FPAR OK,ID=0,D=1
3228 TSF:MSG:READ,5-5-10,s=255,c=3,t=8,pt=1,l=1,sg=0:1
3686 TSF:MSG:READ,8-8-10,s=255,c=3,t=8,pt=1,l=1,sg=0:1
3775 TSF:MSG:READ,1-1-10,s=255,c=3,t=8,pt=1,l=1,sg=0:1
4104 TSM:FPAR:OK
4105 TSM:ID
4106 TSM:ID:OK
4108 TSM:UPL
4145 !TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=NACK:1
4152 TSF:MSG:READ,0-0-10,s=255,c=3,t=25,pt=1,l=1,sg=0:1
4157 TSF:MSG:PONG RECV,HP=1
4159 TSM:UPL:OK
4161 TSM:READY:ID=10,PAR=0,DIS=1
4165 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=OK:0100
4179 TSF:MSG:READ,0-0-10,s=255,c=3,t=15,pt=6,l=2,sg=0:0100
4205 TSF:MSG:SEND,10-10-0-0,s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=OK:2.1.0
4213 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=6,pt=1,l=1,sg=0,ft=0,st=OK:0
4229 TSF:MSG:READ,0-0-10,s=255,c=3,t=6,pt=0,l=1,sg=0:M
4236 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=11,pt=0,l=11,sg=0,ft=0,st=OK:Temp Sensor
4245 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=OK:0.1
4282 TSF:MSG:SEND,10-10-0-0,s=0,c=0,t=6,pt=0,l=0,sg=0,ft=0,st=OK:
4325 !TSF:MSG:SEND,10-10-0-0,s=255,c=0,t=6,pt=0,l=5,sg=0,ft=0,st=NACK:2.1.0
4334 TSF:MSG:SEND,10-10-0-0,s=1,c=0,t=6,pt=0,l=0,sg=0,ft=1,st=OK:
4354 TSF:MSG:SEND,10-10-0-0,s=255,c=0,t=6,pt=0,l=5,sg=0,ft=0,st=OK:2.1.0
4362 TSF:MSG:SEND,10-10-0-0,s=2,c=0,t=6,pt=0,l=0,sg=0,ft=0,st=OK:
4370 TSF:MSG:SEND,10-10-0-0,s=255,c=0,t=6,pt=0,l=5,sg=0,ft=0,st=OK:2.1.0
4378 TSF:MSG:SEND,10-10-0-0,s=3,c=0,t=6,pt=0,l=0,sg=0,ft=0,st=OK:
4386 TSF:MSG:SEND,10-10-0-0,s=255,c=0,t=6,pt=0,l=5,sg=0,ft=0,st=OK:2.1.0
4397 TSF:MSG:SEND,10-10-0-0,s=4,c=0,t=6,pt=0,l=0,sg=0,ft=0,st=OK:
4425 TSF:MSG:SEND,10-10-0-0,s=255,c=0,t=6,pt=0,l=5,sg=0,ft=0,st=OK:2.1.0
4432 MCO:REG:REQ
4435 TSF:MSG:SEND,10-10-0-0,s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=OK:2
4445 TSF:MSG:READ,0-0-10,s=255,c=3,t=27,pt=1,l=1,sg=0:1
4450 MCO:PIM:NODE REG=1
4452 MCO:BGN:STP
MAX6675 test
4954 MCO:BGN:INIT OK,TSP=1
prob1---C = 2.00
prob2---C = nan
prob3---C = 21.50
5227 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:0
5235 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:56
5245 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:21
5254 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:21
5273 TSF:MSG:SEND,10-10-0-0,s=255,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:21
-
Nice work. Some small adjustments:
Remove this// Register all sensors to gateway (they will be created as child devices) present(CHILD_ID_TEMP, S_TEMP);
The 5 temperature probes will get presented in the for loop above and will get numbers 0, 1, 2, 3, and 4.
Also change
send(msg.set(tempCelsius1)); send(msg.set(tempCelsius2)); send(msg.set(tempCelsius3)); send(msg.set(tempCelsius4)); send(msg.set(tempCelsius5));
to
send(msg.setSensor(0).set(tempCelsius1)); send(msg.setSensor(1).set(tempCelsius2)); send(msg.setSensor(2).set(tempCelsius3)); send(msg.setSensor(3).set(tempCelsius4)); send(msg.setSensor(4).set(tempCelsius5));
That should be it. The code could be made a bit cleaner by using arrays but if you aren't familiar with that type if coding I suggest you keep it the way it is.
-
I'm very grateful...thank you! works fine.
As you said, the code could be cleaner but I'm fully satisfied.
When I get the time I'll do some basic coding studies.