comunicacion I2C a larga distancia

Mi nuevo proyecto:

Quiero medir la temperatura de dos tuberias de agua de un colector solar. Debido a que tengo que tomar las temperaturas a mucha distancia del controlador (arduino / unos 20 metros), he pensado que es mejor mandar una señal digital, asi que mirando he visto que hay algunos sensores baratos que son capaces de mandar el valor por I2C.

Queria saber que opinais de esto, se que es posible, lo que no se es cual puede ser el sensor mas adecuado. Tengo que tomar la temperatura (de 20 a 80 ºC) sobre la superficie de una tuberia de cobre de unos 18 mm de diametro que se encuentra a unos 20 metros del controlador. La idea es parar un motor y una electrovalvula (por ahora esto no es problema), cuando el diferencial de temperatura se encuentre en un rango determinado.

Off-Topic: No se si os pasa a vosotros tambien pero desde que estoy metido en esto del arduino, cables y placas, todos mis amigos hermanos etc... se piensan que puedes solucionarle cualquier problema que suele ser totalmente trivial, e incluso todos tienen "una idea que nos vamos a forrar". No se dan cuenta de que, con quien yo unicamente quiero compartir este hoby, es solo con los que tienen otra placa igual que la mia!!!

y si, mi nuevo proyecto no es para mi, es para que mi hermano se ahorre 100 euros en un regulador de temperatura para su placa solar.

con 20 metros... creo que le pides demasiado al I2C, yo a la que pasa de 5/10 m ya me iría a por un RS485 (con un par de estos. Puede que funcione el I2C, tampoco me voy a mojar porque depende muchísimo del cable que uses. El RS232 es otra opción, pero al fin y al cabo desde tu punto de vista es lo mismo que el RS485 (cambias el MAX485 por el MAX323 y listo), y el 485 llega más lejos y con mucha menos susceptibilidad al ruido.

Tienes que usar algún integrado para aumentar el rango del i2c, i2c está pensado para comunicaciones en un mismo pcb, no para tanto metro de cable, la velocidad está limitada por la capacitancia del bus, por lo que con 20 m de cable yo diría que imposible.

Busca drivers para el bus i2c que hay unos cuantos y lo mismo te puede valer, otra opción es montar una comunicación wireless, estilo zigbee o usar otros protocolos.

ics.nxp.com/support/documents/interface/pdf/an444.pdf

EL I2C lo puedes llevar hasta los 30m con facilidad usando varios CI i2c extender como el p82b715

AN10710.pdf (254 KB)

Y si pones una sonda Danfoss España: Soluciones innovadoras y ahorro de energía | Danfoss
Que es la que se viene usando para las estas intalaciones solares
Esmb-12 metida en una vaina, la puedes pegar con una pasta especial al tubo, y cableandola con cable 2*1mm apantallado asta la arduino seguro que te hace buena lectura, tiene bastante rango para medir ese tipo de temperaturas, de colectores solares, ya me cuentas como ha ido,

Saludos

Hola,
Buscando información sobre un sensor de temperatura y humedad, el SHT11, encontré esto en el foro
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1229870415/0
Dice que cambiando la pulsación se puede alargar hasta 40 metros. Yo necesito alargar 1.5 metros, todavía no he conseguido que me funcione.

I found another problem of the library and the answer.

When you connect the SHT-xx to arduino via a short cable(about 10cm), the library works fine.
But if you hook up the sensor with very long cable, you will get corrupted data.
The reason is that, the default clock pulse width is too short for the long cable.

You can easily fix the problem by only modifying two lines in the library file.

at hardware/libraries/Sensirion/Sensirion.cpp file,

before:
Code:
#define PULSE_LONG delayMicroseconds(3)
#define PULSE_SHORT delayMicroseconds(1)

after:
Code:
#define PULSE_LONG delayMicroseconds(300)
#define PULSE_SHORT delayMicroseconds(100)

With this fix, I can get correct data with using a 40 meter cable! Probably I can use more long cables.
Though I have not found the best width of the pulse, 300 and 100 usec delay doesn't cause any problems.

Menos mal que me ha dado por preguntar porque pensaba que presisamente la distancia no era problema, ahora he cambiado el titulo del post porque parece la distancia es el primer problema a solucionar.
Por ahora creo que la solucion optima es el p82b715, aunque voy a ver como me las apaño para hacer pruebas con lo que cuenta curro92. Voy a ver si puedo comunicar mi arduino uno con otro arduino que tengo montado en una protoboard.

Saludos y gracias

Off-Topic: No se si os pasa a vosotros tambien pero desde que estoy metido en esto del arduino, cables y placas, todos mis amigos hermanos etc... se piensan que puedes solucionarle cualquier problema que suele ser totalmente trivial, e incluso todos tienen "una idea que nos vamos a forrar". No se dan cuenta de que, con quien yo unicamente quiero compartir este hoby, es solo con los que tienen otra placa igual que la mia!!!

A mi en casa pasa igual, nadie entiende que mi hobby son los "chismes" y "cucarachas con patas". Hay gente que le gusta la pesca, la caza, el bingo, ... tan raro soy? :smiley: :smiley: :smiley: :smiley:

Hola,

Aquí I2C FAQ - EmSA comentan que bajando la frecuencia se puede alargar la distancia del cable.

I2C FAQ

What is the maximum distance of the I2C bus?

This depends on the load of the bus and the speed you run at. In typical applications, the length is a few meters (9-12ft). The maximum capacitive load has been specified (see also the electrical Spec's in the I2C FAQ). Another thing to be taken into account is the amount of noise picked up by long cabling. This noise can disturb the signal transmitted over the bus so badly that it becomes unreadable.

The length can be increased significantly by running at a lower clock frequency. One particular application - clocked at about 500Hz - had a bus length of about 100m (300ft). If you are careful in routing your PCB's and use proper cabling (twisted pair and/or shielded cable), you can also gain some length.

Por lo que he entendido en otras páginas (que los expertos me corrijan) para bajar la frecuencia, en el fichero libraries/Wire/utilitiy/twi.h donde pone

  #ifndef TWI_FREQ
  #define TWI_FREQ 100000L
  #endif

prueba poniendo una más baja, por ejemplo

  #ifndef TWI_FREQ
  #define TWI_FREQ 1000L
  #endif

Para que surtan efecto estos cambios, hay que volver a compilar el sketch

ojo que todo esto depende muchísimo del cable que uses. No es lo mismo un par de cables tiraos de cualquier forma que un coaxial o un par apantallado. Las comunicaciones con I2C no suelen llegar lejos porque le ocurre lo mismo que a cualquier protocolo por nivel, la tensión continua se transporta mal a lo largo de un cable (tiene perdidas) y es muy susceptible a las interferencias. Por eso recomendaba un rs485, porque usa una comunicación diferencial.

Ve con ojo con el cable que usas, los hay que tienen impedancias bajísimas, los hay que son un desastre... Todo depende en lo que te gastes en cable