Multiple Dallas Temperatuur sensors at one sensor node
Dear MySensors friends,
I made a ethernet gateway sensor node with which I used 4 soil moisture sensors, four relays and 8 Dallas temp sensors (4x soil (1m, 50cm, 20cm 10cm), 1x waterhole temperature, temperature of the node, 10 cm high and 1.5 mtr high) temp can read / operate.
I control the ground moisture sensors with a transistor circuit.
After some trying and especially reading a lot on this forum I finally have the node working.
There is only one thing that does not work, if I connect up to 4 dallas sensors, I just see them in the controller (I use domoticz).
However, if I connect a 5th dallas sensor, I do not see an update for any sensor.
My first thought was a food problem, so the dallas gave a seperate 5 volts (common 5 volts for the arduino uno and the 4 relays), the GND still connected to the arduino, but unfortunately this did not offer a solution.
Is this a known problem, or am I doing something wrong?
I read that there should be no problems when connecting multiple dallas sensors to other platforms.
I hope someone can help me.
And yes, I have the "#define MAX_ATTACHED_DS18B20 " at ten, I also used the standard sketch for the temperature, with a small adjustment to get a other the child id than the relays .
Below the output of the debug:
0 MCO:BGN:INIT GW,CP=R-NGA---,VER=2.3.0 3 MCO:BGN:BFR 859 GWT:TIN:IP=192.168.0.145 1861 MCO:BGN:STP 1863 MCO:REG:NOT NEEDED 1865 MCO:BGN:INIT OK,TSP=NA 34658 GWT:TSA:ETH OK 34750 GWT:RFC:MSG=0;0;3;0;2; 34755 GWT:RFC:MSG=0;0;3;0;2;Get Version 34806 GWT:RFC:MSG=0;1;1;0;2;0 35142 GWT:RFC:MSG=0;1;1;0;2;1 35406 GWT:RFC:MSG=0;1;1;0;2;0 41319 GWT:RFC:MSG=0;0;3;0;18;PING 44960 GWT:RFC:MSG=0;4;1;0;2;1 47435 GWT:RFC:MSG=0;3;1;0;2;1 48705 GWT:RFC:MSG=0;2;1;0;2;1 51245 GWT:RFC:MSG=0;0;3;0;18;PING 61170 GWT:RFC:MSG=0;0;3;0;18;PING
@dzjr the log from the node would probably give useful information.
My guess is that sending (or presenting) too many messages strains the radio which causes transmission failures. Try adding wait(100); after each present/send.
Thanks for the fast response,
The node And the gateway is the same sketch, And this is all what the debug give, only more ping's And the relay .
I Will try the wait in the present And the loop.
- wallyllama last edited by
Is it any 5th temp sensor? In other words could it be a bad temp sensor? Also 1-wire doesnt like 'star' wiring, are all the sensors wired with short connections to the main cable? More like ,, and less |_| and for sure not |/
@dzjr Assuming it is not a wiring problem, I suggest running a temporary test sketch on the Node to ensure you are communicating with all the OneWire sensors.
Once local communication with all 5 is confirmed, then check your original sketch to see how all 5 devices are presented and identified to the Controller, or whether the Controller assigns Child IDs (not ideal for multiple sensors), and reload your original sketch.
Next check that all 5 show up on presentation to Domoticz, they should list under hardware even if only become active once temperatures are first reported.
If you have not done it this way, the table/array method is highly recommended for multiple sensors -
My 3v Node sketch lists 12 DS18B20s with their unique digital addresses, presenting preset Child IDs to the Gateway, and reporting temperatures against those fixed Child IDs. They cannot be re-sequenced by the Controller, and I know precisely which device has failed when and if it does, none have.
Should a chip fail, the digital address can be rewritten in the sketch and the reporting will continue against that fixed Child ID.
The same array sequence is used to request temperatures and all report to Domoticz every 5 minutes unless the previous reading is unchanged.
@zboblamont would you please direct me to the table/array method. I can imagine a few approaches, but am very interested how you have it set up. Thanks!
- zboblamont last edited by zboblamont
@oneyb Sure, you can Google it but will post my own node's sketch as it is to hand, have omitted the Node device specific lib from the top Enhanced Version to keep ChildIDs fix based on petewill's. - Present Dallas-Hardware-ID as comment */ // Enable debug prints to serial monitor //#define MY_DEBUG // Enable to print out an array of the attached DallasSensors to Serial // comment this after initial setup and adopt MAX_ATTACHED_DS18B20 accordingly ////#define PRINT_ARRAY // Enable and select radio type attached ////#define MY_RADIO_NRF24 #define MY_RADIO_RFM69 // Define for using RFM69 radio #define MY_RFM69_FREQUENCY RF69_433MHZ // Define for frequency setting. Needed if you're radio module isn't 868Mhz (868Mhz is default in lib) #define LedPin 6 #define MY_RFM69_NETWORKID 101 // Default is 100 in lib. Uncomment it and set your preferred network id if needed #define MY_NODE_ID 5 //Manually set the node ID here. Comment out to auto assign #include <SPI.h> #include <MySensors.h> #include <DallasTemperature.h> #include <OneWire.h> #define COMPARE_TEMP 1 // Send temperature only if changed? #define ERASE_HASH // Clear EEPROM, if no 1w-device is present? #define ONE_WIRE_BUS 16 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 12 uint8_t DS_First_Child_ID = 7; //First Child-ID to be used by Dallas Bus; set this to be higher than other Child-ID's who need EEPROM storage to avoid conflicts]; unsigned long SLEEP_TIME = 300000; // Sleep time between reads (in milliseconds)WAS 30000 boolean metric = true; // Initialize temperature message MyMessage DallasMsg(0, V_TEMP); //MyMessage msgId(0, V_ID); #ifdef PRINT_ARRAY DeviceAddress dallasAddresses[8]; #else DeviceAddress dallasAddresses[] = { {0x28, 0xFF, 0xB0, 0xA8, 0x74, 0x16, 0x03, 0x67}, {0x28, 0xFF, 0x78, 0xED, 0x74, 0x16, 0x04, 0x99}, {0x28, 0xFF, 0x86, 0xC7, 0x73, 0x16, 0x05, 0xD2}, {0x28, 0xFF, 0xE6, 0xD4, 0x73, 0x16, 0x05, 0x73}, {0x28, 0xFF, 0xD6, 0xDB, 0x74, 0x16, 0x03, 0xCA}, {0x28, 0xFF, 0x6E, 0x29, 0x80, 0x16, 0x05, 0x03}, {0x28, 0xFF, 0xB9, 0xE1, 0x73, 0x16, 0x05, 0x40}, {0x28, 0xFF, 0x9B, 0x5E, 0x80, 0x16, 0x05, 0x59}, {0x28, 0xFF, 0x5F, 0xFC, 0x74, 0x16, 0x03, 0x04}, {0x28, 0xFF, 0x18, 0xD0, 0x73, 0x16, 0x05, 0x79}, {0x28, 0x23, 0xAE, 0x10, 0x0A, 0x00, 0x00, 0x32}, {0x28, 0xAF, 0xA7, 0x10, 0x0A, 0x00, 0x00, 0x56}, }; #endif int resolution = 10; int conversionTime = 750; void before() { conversionTime = 750 / (1 << (12 - resolution)); // Startup up the OneWire library sensors.begin(); // requestTemperatures() will not block current thread sensors.setWaitForConversion(false); // Fetch the number of attached temperature sensors //numSensors = sensors.getDeviceCount(); #ifdef PRINT_ARRAY printAddressArray(); #endif } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Dallas Temp, fix Array", "1.0"); // Register all sensors to gw (they will be created as child devices) // Fetch the number of attached temperature sensors // Present all sensors to controller for (int i = 0; i < MAX_ATTACHED_DS18B20; i++) { present(DS_First_Child_ID + i, S_TEMP); } } void setup() { // for (int i = 0; i < MAX_ATTACHED_DS18B20; i++) { // send(msgId.setSensor(DS_First_Child_ID + i).set(dallasAddresses[i], 8)); // } //metric = getControllerConfig().isMetric; pinMode(LedPin, OUTPUT); } void loop() { // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater) wait(conversionTime); // Read temperatures and send them to controller for (int i = 0; i < MAX_ATTACHED_DS18B20; i++) { // Fetch and round temperature to one decimal; original method uses "sensors.getTempCByIndex(i)" float temperature = static_cast<float>(static_cast<int>((metric ? sensors.getTempC(dallasAddresses[i]) : sensors.getTempF(dallasAddresses[i])) * 10.)) / 10.; // Only send data if temperature has changed and no error @@@@@@@@@@ The compare is not working properly here #if COMPARE_TEMP == 1 if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) { #else if (temperature != -127.00 && temperature != 85.00) { #endif // Send in the new temperature send(DallasMsg.setSensor(i + DS_First_Child_ID).set(temperature, 1)); // Save new temperatures for next compare lastTemperature[i] = temperature; } } wait(25); digitalWrite(LedPin,HIGH); wait(25); digitalWrite(LedPin,LOW); wait(25); sleep(SLEEP_TIME); } //Helper funktion for setting things up ////void printAddressArray() { // start serial port //// Serial.begin(115200); // show the addresses we found on the bus //// Serial.println("Copy the following to the DallasAddresses array,"); //// Serial.print("set MAX_ATTACHED_DS18B20 to "); //// Serial.println(sensors.getDeviceCount()); //// Serial.println("and comment line #define PRINT_ARRAY for regular operation"); //// for (uint8_t i = 0; i < sensors.getDeviceCount(); i++) { //// if (!sensors.getAddress(dallasAddresses[i], i)) //// { //// Serial.print("Unable to find address for Device "); //// Serial.println(i); //// Serial.println(); //// } //// Serial.print("{"); //// for (uint8_t j = 0; j < 8; j++) //// { //// Serial.print("0x"); //// // zero pad the address if necessary //// if (dallasAddresses[i][j] < 16) Serial.print("0"); //// Serial.print(dallasAddresses[i][j], HEX); //// if (j < 7) Serial.print(", "); //// else Serial.println("},"); //// } //// } //// wait(SLEEP_TIME * 20); ////}
This is the work of others more clever but it works a treat, hopefully it helps.
The REM'd part at the bottom if I recall correctly test runs the individual devices... It's been a while....
@wallyllama said in Multiple Dallas Temperatuur sensors at one sensor node:
|_|
@wallyllama i use the "waterproof" sensors, and i made a connection for three sensors, the fourth sensor (no waterproof) i solderd on the shield on top of the uno, and the fifth sensor in connected thru the cable (is also a waterproof sensor) also directly on the shield.
So, technical i made a star network of dalles sensors.
and i have the problem with several "5th" sensors.
Thank you for your reply,
Good tip, I had already done something with the standard dallas tester sketch, but I only came to a maximum of 3 sensors ....
I will create a separate node with only the temp sketch from the BUILD section of Mysensors.
Incidentally, believe it or not, I had your example to give each sensor address a unique CHILD-ID already applied in my sketch, but since I did not see all the sensors I first went back a step.
When I get results I post it immediately!
@dzjr Check that you can address all the sensors and retrieve the temperatures, from your previous post you may have a problem with your topology not conforming to the One-Wire architecture.
Also see my reply to @oneyb, locking the chip unique addresses to child IDs saves on analgesics...
Tomorrow I'm going to make a decent connection strip for the sensors, I had done it with some wires, but that does not work ideal of course.
- zboblamont last edited by zboblamont
@dzjr.
Thank you for your tips, at least I now have more knowledge about onewire.
Last night there was something else in between, but now I have put the sensors in a daisy chain (see photo).
First I tested it with the "standard" Arduino dallas temperature sketch "oneWireSearch", I got up to 7 sensors in this one.
I connected the cable of the waterproof sensors to the three wires (GND, 5V and the onewire pin (pin7)), threaded and twisted together.
When I connect an 8th sensor, the search sketch says that no sensors can be found, it does not matter which sensor is the 8th.
If I connect the 7 sensors to the gateway node, I see the 7 sensors in domoticz, so that's where it is.
it is then 6 wired sensors and a sensor on the PCB.
does anyone know if the onewire bus might be a twisted pair?
or is the distance between the branches too short?
If the problem remains, I just make extra oneWire bus for the 4 ground temperature sensors as you already suggested ...
@dzjr Now you have to figure out why only #8 did not work, so progress
even if a digital device on One-Wire has not yet sunk in...
There is no physical loop 8 I can see, so how is#8 connected in the chain?
No, the 8th sensor is not connected because the search sketch does not find any sensor.
Even with a 9th sensor, the sketch unfortunately does not find anything.
and indeed there is no loop, on the other side of the wires I connected a multimeter to measure the 5V / GND voltage.
The yellow bus wire has an open end.
I also tried to connect a sensor at the end of the line as the 8th sensor.
and I have used several sensors as "8th", so it is very likely that the sensors are okay
@dzjr Sorry for any misunderstanding, the loops I was referring to are the sensor cable loops in your photo.
I did read somewhere that different pullup resistors were recommended by different suppliers of the waterproof versions, values from 10k to 2k2, rather than the usual 4k7, some said the pullup should be on the Arduino end, others on the last sensor on the line, so worth experimenting, perhaps even a sacrificial length of additional cable to alter or extend spacing ?
What is crucial to these devices is digital signal timing, hence constraints on layout architecture and cable capacitance, the pullup resistor only alters the circuit's speed of High/Low transitions.
Here bare DS18B20s on Cat5 cable (low capacitance) works fine on a 3v Arduino for 12 sensors, so it can be done.
If you have access to an oscilloscope, see what the signal looks like at the end. I had a problem a while ago with too long cable for i2c. See for pictures.
Stronger pullup at the end of the cable might help.
- wallyllama last edited by
Here is maxim's guide on wiring for 1-wire. There are a few things to note, one is the "weight" of each sensor's cable. Read that section closely. Another is hubs. Hubs are basically a 1 wire switch that connects each segement of the network 1 at a time, so you can essentially walk though each ray of your star. The third is the suggestion above to use multiple pins on the arduino and just make several simpler networks.
I have had good luck with 1 wire but only after careful attention to the wiring itself. Star topology can work fine for several sensors, but daisy chain is important for less trouble, as mentioned.
Wiring comments: wiring is the most important thing.
Use a twisted pair cable (or twist your single conductor wires). Cat5 or telephone wire or similar works well. Solder all connections in the daisy chains or use wire nuts or terminal blocks, or other connectors. Do not just hand twist.
Your ground and + wires to the sensors should be connected directly to the board terminal closest to the power supply. Don't use skinny jumper wires or connect to a different convenient spot on the board, or to some other ground or +5 device connected to the board. (Yes, all +5 and ground terminals are not 'the same' when it comes to analog circuits.)
Don't run the wires in a bundle or nearby other wiring.
A lower value pull-up resistor is easy to try and may help. Another trick is adding a 100 ohm resistor in series where the 1-wire signal line connects to the board. (Disconnect wire from board, connect resistor to board, connect wire to resistor.)
Tim
I replaced the resistor an 2K2 resistor, and now see all nine sensors, 2K2 resistor also works with a single sensor.
In the sketch I have now given all 9 sensors their own child ID, I only see no data from the 5th sensor, so I have to look at it next week, in the "test sketch" I see a temperature, so just have a look what is wrong.
The sensor network of 6 sensors I made in a daisy chain, and two sensors I made separately to the sensor node, and the 9th is fixed on the node's PCB.
Next week still good testing and make a small adjustment for sending the (temporary) rain sensor and then I hope to finally install everything.
Thank you very much for all the help and tips, I finally solved my "problem"!
dzjr
@mfalkvidd I have a oscilloscope but it is a old analog scope so i can't use it to analyse the 1wire singal.
But i have orderd a very simple logic analyzer for the next time i need one!.
The problem is now solved by using a 2K2 resistor istead of te regulear 4K7 resistor.
Thank you for the link, i allready find that on a coffe break, but on the smartphone it is nog easy to read, so i read it this weekend on the laptop.
All the nine sensors are now working, i rearrenged the sensor network en used a 2K2 resistor in stead of a 4K7 resistor and that turned out to be the problem.
Thank you for helping
@grubstake I now have used a 4 wire YCY (screened signal cable), and that also is working ( 9 sensors on one pin).
Ultimately, the use of a 2K2 resistor was a good solution
Do you recommend to use the 5 volt of the arduino, or is it better to use the 5 volts which I use as power supply of the arduino?
And can I or should I put the ground of the sensors on the arduino?
@dzjr I believe the point @Grubstake was making is to ensure solid and stable connection for voltage and ground to the board itself, not elsewhere, the issue is to ensure stability.
Glad the stronger pullup solved your problem but would caution on choice of cable. Telephone wire or Cat5 as also stated is known to work well and reliably for One-Wire, is cheap and readily available. Screening or grounding unused cores does affect capacitance, which may lead to problems in final layout.
Thanks again for your help, last weekend I installed everything outside, and everything remains stable!
The only "problem" I still have is that the resolution of the sensors is 9 Bit, while I prefer to have an 11 or 12 bit resolution.
now I have made a second setup with two sensors and the same sketch (only name and IP address are different) and that gives a 12 bit resolution.
Is this because I have connected 9 sensors, or is there possibly something wrong with the reading time in the sketch?
Or is it just a programming error?
the whole sketch is a bit big to post, so I cut it into pieces.
before:
// Dallas temp stukje #define COMPARE_TEMP 1 // 1= zenden alleen bij verandering 0= direct zenden #define ONE_WIRE_BUS 6 #define TEMPERATURE_PRECISION 12 #define MAX_ATTACHED_DS18B20 13 unsigned long SLEEP_TIME = 300; //slaaptijd tussen twee metingen in ms OneWire oneWire(ONE_WIRE_BUS); //Een oneWire-exemplaar instellen om te communiceren met alle OneWire-apparaten DallasTemperature sensors(&oneWire); //OneWire naar Dallas float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; bool receivedConfig = false; bool metric = true; DeviceAddress Probe01 = { 0x28, 0xFF, 0x64, 0x1D, 0xF8, 0x4F, 0x3A, 0x08 }; // op print DeviceAddress Probe02 = { 0x28, 0xFF, 0x64, 0x1D, 0xF9, 0x9D, 0xDC, 0x5E }; // temp op -100 cm DeviceAddress Probe03 = { 0x28, 0xED, 0x25, 0x77, 0x91, 0x13, 0x02, 0xFF }; // temp op -50 mtr DeviceAddress Probe04 = { 0x28, 0xC5, 0x51, 0x77, 0x91, 0x0B, 0x02, 0x00 }; // temp op -20 cm DeviceAddress Probe05 = { 0x28, 0xDC, 0x25, 0x77, 0x91, 0x13, 0x02, 0x25 }; // temp op -10 cm DeviceAddress Probe06 = { 0x28, 0x54, 0x96, 0x77, 0x91, 0x08, 0x02, 0xA0 }; // temp op 10 cm DeviceAddress Probe07 = { 0x28, 0x1F, 0x11, 0x43, 0x98, 0x25, 0x00, 0x8B }; // temp op 150 cm DeviceAddress Probe08 = { 0x28, 0xFF, 0x0A, 0x63, 0x73, 0x16, 0x05, 0x9F }; // temp van water in put DeviceAddress Probe09 = { 0x28, 0x98, 0x9C, 0x77, 0x91, 0x19, 0x02, 0xD7 }; // temp in border // Initialiseer temperatuurbericht MyMessage msg(0, V_TEMP);
Void Loop:
void loop() { { // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // query conversion time and sleep until conversion completed int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());.; float temperature; // voor geadreseerde sensoren switch (i) { case 0: temperature = sensors.getTempC(Probe01); break; case 1: temperature = sensors.getTempC(Probe02); break; case 2: temperature = sensors.getTempC(Probe03); break; case 3: temperature = sensors.getTempC(Probe04); break; case 4: temperature = sensors.getTempC(Probe05); break; case 5: temperature = sensors.getTempC(Probe06); break; case 6: temperature = sensors.getTempC(Probe07); break; case 7: temperature = sensors.getTempC(Probe08); break; case 8: temperature = sensors.getTempC(Probe09); break; default: temperature = sensors.getTempCByIndex(Probe09); break; } // Only send data if temperature has changed and no error #if COMPARE_TEMP == 1 if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) { #else if (temperature != -127.00 && temperature != 85.00) { #endif // Send in the new temperature send(msg.setSensor(i+21).set(temperature,1)); // Save new temperatures for next compare lastTemperature[i]=temperature; } } }
The complete code you can find here; sorry the comments are in dutch...
This was my first real MySensor and second Arduino sketch / project, so if you have some comments or tips, I am open to that!
Thank you for the help!
dzjr
@dzjr Check out the read times on the Dallas specs, from memory it increases markedly with higher resolutions....
- hard-shovel last edited by
@dzjr you have the define
#define TEMPERATURE_PRECISION 12
In the github code this is not utilized, so the sensors are operating in 9 bit resolution.
You need to add the following in the before or setup
sensors.setResolution(TEMPERATURE_PRECISION);
Thanks for the reply, i have tryed to load the new sketch into the Arduino, only i cant make USB connection, do i have look at that first
.
You will hear from me.
Dzjr
after replacing the arduino (I could not connect the board) I was able to load the sketch again.
I now have a better resolution, I do not think I have 12 bits but maybe that's because of the link with domoticz.
As I wrote the node is installed, but still think that I must adapt to the sketch.
I now only have a dallas sensor that does not work anymore, but that will be okay.
@mfalkvidd Yes i know that, i allready read it in the spec sheet.
- hard-shovel last edited by
@dzjr To get the extra resolution sent to the controller try using
send(msg.setSensor(i+21).set(temperature,2));
@hard-shovel I will keep that in mind,
for now it is working (only one dallas is broken).
@zboblamont said in Multiple Dallas Temperatuur sensors at one sensor node:.
in case you can not daisy chain them because there is no sequential direction among locations, use a separate pin for each data line (powered thru resistor) and talk with each line in flip.
the road here is using three cores in 20-30m of Cat5e cable to make certain each chip is physically sequential on the road.
after I delivered a similarly sensor vicinity, a loop needed to be spliced in to preserve the road a daisy chain. it is a small residence, the period is purely down to the route, and cable is cheap.