thehardwareman:
What kind of cable are you using? Shield? CAT5 or 6?
So, my answer was so good you quoted me twice
I use 2 pair telephone cable, that's actual copper telephone cable to specification CW1308, not the copper coated steel or copper coated aluminium rubbish available on your favourite retail web site and some electrical wholesalers. By all means try cat 5, but I have not done so.
I used one pair for clock and data and the other pair for power. I now think this was a mistake as it encourages crosstalk between clock and data. I think I should have used one pair for ground and (say) clock and the other pair for +5V and (say) data. However, it works as it is so I am not changing it.
Pull up resistors are 1k at the controller. Some will say this is too low according to the I2C specification. Maybe it is, maybe not, I don't know. What I do know is that it works, and has never been a problem. This hobby is about experimenting with things, so experiment.
There is a case for distributing the resistors over the network, so put a pair of resistors at the controller and at each end point* if it is star wired, or at the controller and end of the line if it is daisy chained. Bear in mind that all the resistors will be in parallel so the the total parallel resistance should not be lower than 1k. Putting the resistors at the end points* will absorb any reflections. However, the times when I was having a problem I put an oscilloscope on clock and data I didn't see any evidence of significant reflections.
I put capacitors across the power at every end point* to clean it up from any crap picked up in the cables.
I once had one of my sensors not working reliably, mostly it gave correct results but there were a lot of errors as well. I found that the +5V wire had come loose at the sensor, so the it was being powered parasitically from clock and data. This didn't have any effect on the other sensors.
I checked the speed I have it running at and it is 10kHz at the moment, I'm pretty sure I've had it at 60kHz at some point.
Processor is a PIC in my case, but I have no reason to think any of the processors used by Arduino would be a problem. I originally did this with a Z80 and a software implementation of I2C, which ran very, very slowly.
When I first joined this forum there were people saying I2C is only good for 1m or so. Well, maybe it was designed for 1m or so, but my experience says it is capable of a lot further than that. I have not found the limit.
*By end point I mean the devices on the bus, in my case they are DS1624 temperature sensors.