I2C uit Arduino

Hallo,
Voor mijn 1e Arduino project heb ik een sketch (aangepast) met een BH1750. Dit is een Luxmeting.
Ik wil de sensor op mijn dak plaatsen en de Arduino binnenshuis.
Er wordt echter gebruik gemaakt van I2C en nu begreep ik dat dit niet geschikt is voor een kabellengte van 8mtr. Een test wees ook uit dat de waarden gemeten via 8mtr kabel vele malen lager zijn dan als de sensor met 5cm draad aan de arduino hangt.
Heeft iemand een idee hoe ik dit kan oplossen?
Ruud

blackdog

Golden Member

Hi rudyman, :-)

i2c kan best met redelijk lange draden werken, het gaat vooral wat beter als je de Pull Up weerstanden wat verlaagt in waarden.
Soms is ook een afgeschermde kabel nodig als het stoorniveau in jouw omgeving b.v. hoog is.

Er is nog een mogelijkheid en dat is de clock van de i2c bus wat verlagen.
Twist in iedere geval de SDA en SCL paartje, mag met de voedingsdraden van het i2c moduul samen gedraaid worden.
Plaats een kleine elco over de voedings pinnen direct bij je sensor.
Laat de kabel naar je sensor zo mijn mogelijk parallel lopen met andere bekabeling.

Ik hoop dat dit je een beetje helpt.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

I2C staat voor Inter-Integrated Circuit. Ofwel, tussen IC's op een PCB. Dat het ook best lukt over een stukje kabel zal best, maar gaat al wel een beetje buiten de normale toepassing. En 8m is heeeeeeeeeeel veel buiten aan te raden afstanden. Dan gebruik je gewoon de verkeerde standaard. Dan pak je liever RS485 of CAN.
Nou heb je een I2C sensor, dan zul je een manier moeten vinden waar de micro dicht bij die sensor zit. In dit geval dus ook op het dak. Of de sensor naar binnen, voor het raam.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Thanx Bram,
Ik neem aan dat ik die pullUp weerstanden (4k7?) dan op de UNO van +5V naar de SDA en SCL dien aan te sluiten.
Groet, Ruud

I2C over 8 meter is heeel ver. Het is in elk geval de moeite waard om de tips van Blackdog uit te proberen maar reken niet al te veel op succes.
Ik zou doen wat flipflop aanbeveelt: RS485

Eens met de eerdere opmerkingen, maar dat een communicatieprobleem (zonder middeling etc. etc.) veel lagere waardes zou geven lijkt onwaarschijnlijk.
Het doet eerder vermoeden dat het toegepaste window niet mee-gekalibreerd is oid.

Mannen,
Mijn kennis is niet toereikend, maar ik wil graag bij-leren.
Hoe kan ik de sensor met 4 draden (+/ - 5V en SDA/SCL) naar RS485 ombouwen?
En leest de Arduino Uno dit dan ook?

@Aart: I2c werkt zonder enige serieuze databescherming. Ik heb echt wel eens vreemde waarden over de lijntjes zien komen..

Ik heb net de datasheet opgehaald en zie nu pas dat die sensor uitgelegd is voor I2c. Om dat om te katten naar RS485 gaat een heel lastig verhaal worden.
Je kunt beter kant en klare hardfware hiervoor kopen
https://coptonix.com/en/products/rs485-i2c-adapter-master/
Ik heb er geen ervaring mee maar wie weet ...
Wel aan de prijs. € 85 wordt ze voor aangeboden.
Bij de chinees worden Luxmeters met RS485 aangeboden. Misschien handiger

Op 10 maart 2023 15:42:02 schreef rudyman:
..Hoe kan ik de sensor met 4 draden (+/ - 5V en SDA/SCL) naar RS485 ombouwen?

Dat kan niet. De sensor heeft een i2c interface, en geen 485. Dat hebben sensoren nooit (althans, ik ken er geen). Je moet dus een micro dicht bij de sensor hebben (of andersom mag ook, hi). Stel je moet toch over grote afstanden uitlezen, dan kun je een klein micro'tje bij de sensor hebben, en dat setje via een geschikte interface verbinden met een 2e micro (de host, RPi bv).
In jouw geval lijkt mij het simpelst om de sensor naar binnen te halen, samen met de ESP in een kastje voor het raam.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
blackdog

Golden Member

Hi,

Ik ben nog bij een introductie van onder meer i2c geweest, men had toen diverse apparatuur met getwiste paartjes aangesloten, de paartjes hingen gewoon los tussen de apparaten..
8 meter is wel veel ja, maar als je mijn tips volgt heb je kans dat je het toch nog goed werkend krijgt.
Oja het is natuurlijk wel en, en, en, dus paartjes twisten, ontkoppel condensator plaatsen, i2c snelheid verlagen en de pullup weerstanden naar zeg 2k2 brengen.
Probeerse!

Oja je hebt een licht sensor, hou er rekening mee dat de lichtsterkte heel variabel is, bedenk een manier die stabiel is, b.v. een lampje of led in een doosje.
En ga dan kijken hoeveel de kabellengte meespeeld in de aangegeven waarde, als het goed gaat, maakt de kabellengte niets uit.

En ja RS485 als bus kan dus ook, maar ik denk dat de TS daar geen sensor voor heeft.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Met een I2C-bus extender zoals de P82B715 aan weerszijden van de lange kabel kunnen volgens de datasheet 10-tallen meters overbrugd worden:

- Drive I2C-bus signals over long cables to approximately 50 meters or 3000 pF

Het kan natuurlijk ook een voeding issue zijn omdat de spanning te ver inzakt. Dan kun je ook vreemde waarden terugkrijgen. Heb je de spanning bij de sensor al gemeten?

A little knowledge is a dangerous thing.

Mannen,

€85 :? is geen optie en een kastje voor het raam lukt ook niet.
Het is een hobby project waarmee ik via relais een screen en 's avonds mijn buitenverlichting wil aansturen

@Bram: goede tips. Ik ga dat proberen en kom er nog op terug :O)
Als dat niet lukt moet ik maar naar een LDR overstappen...

buckfast_beekeeper

Golden Member

ATtiny lokaal met de sensor laten communiceren. Communicatie tussen ATtiny en Arduino/ESP via RS485. 2 draden voor power en 2 getwiste draden voor RS485. Met een stuk ethernet kabel heb je al draden over.

Andere mogelijkheid, maar wat meer kennis vereist, 2 ESP en communicatie via MQTT. Vraagt dan wel weer een MQTT server. Heb je een NAS, dan kan dit met Mosquitto worden opgelost.

Van Lambiek wordt goede geuze gemaakt.

Ja, voeding.... Het is raar dat je "te lage waardes" krijgt: I2C is een digitaal protocol, dus als je kabel te lang is verwacht je communicatie problelemn zoals: Ding reageert niet op z'n adres. Maar niet dat ie structureel te lage waardes rapporteert.

Dus: meet na 8m de voedingsspanning eens na, en kijk of je consistente meetresultaten krijgt of dat er bitfouten optreden.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Stijnos

Golden Member

ik zeg gewoon proberen. Lukt het niet kun je altijd nog andere stappen ondernemen. Ook al is het er niet voor gemaakt ik heb het vaka zat toch zien werken. Je kan een utp kabel nemen die zijn al getwist. kun je dubbele adres pakken voor power en gnd en 1 paar voor scl en sda.
Ik weet niet in wat voor behuizing de sensor zit of komt. Ik neme aan dat je die zelf in een kastje frot. Gezien ik niet verwacht dat een voor buiten geschikte sensor een i2c interface zou hebben.
Indien dat zo is, dan kan daar met gemak een micro arduino printje bij en een rs485 line drivertje zou ik zeggen. dan laatje de arduino die je bij de sensor monteerd gewoon via i2c de sensor uitlzen en dat spuigt hij via uart uit. Gooi dat in een max485 en klaar (aan de buiten unit kant dan)
aan de binnen unit kant doe je ook ene max485 en die sluit je dan weer op uart RX van je arduino aan.
easy as that

als je nu gewoon een arduino nano aan die sensor hangt op de zolder, en beneden een andere arduino, laat die 2 arduinos dan maar een eigen protocol praten.
een extra nano kost je dan 1,5€ ofzo

aan lage snelheid kan je ze eventueel nog met een transistor een 5V of 12V lijn schakelen. daar kan je dan een paar 100meter ver mee

[Bericht gewijzigd door fcapri op vrijdag 10 maart 2023 16:45:30 (26%)

ik hou van werken ..., ik kan er uren naar kijken
Lambiek

Special Member

Als je haar maar goed zit, GROETEN LAMBIEK.

Ik zou die sensor met een wat hogere spanning gaan voeden, en dan een 5V regelaar bij de sensor zetten; de lage meetwaardes suggereren wellicht dat de voedingsspanning inzakt. Bij I2C mag de totale pull-up weerstand 1k2 zijn per lijn, en dan zou ik die verdelen, dus 2k4 aan beide einden van de kabel.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Arco

Special Member

Met een I2C-bus extender zoals de P82B715 aan weerszijden van de lange kabel kunnen volgens de datasheet 10-tallen meters overbrugd worden:

Goed aangepast hebben ze er zelfs een mijl mee gehaald... https://www.abcelectronique.com/forum/attachment.php?attachmentid=2984…
De samenhang tussen pull-up waardes, kabelcapaciteiten en transmissiesnelheid staat in i2c specs...

De lagere waardes die je krijgt hebben niets met i2c te doen: da's digitaal.
Kan hooguit komen doordat de chip gevoelig is voor spanningsverloop en daardoor een andere waarde meet.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 10 maart 2023 16:02:15 schreef rudyman:
..Het is een hobby project waarmee ik via relais een screen en 's avonds mijn buitenverlichting wil aansturen...

Dat klinkt mij als minimaal 3 micro's. ESP12 zou kunnen. Eentje bij de buitenverlichting, eentje bij het screen en eentje bij de lichtsensor. Communicatie tussen allen met MQTT.
Een enkele met 10-tallen meters draad naar de verschillende punten... onbetrouwbaar.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Arco

Special Member

Een vaste draadverbinding met 1 micro is een stuk betrouwbaarder als 3 losse micro's die met elkaar moeten babbelen. Kans op problemen is vele malen groter.
(en het is duidelijk 'overkill'...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
buckfast_beekeeper

Golden Member

En toch kunnen die 3 µC handiger zijn als draad voorzien. Een sensor op het dak, een display in de woonkamer en een lamp in de tuin. Begin maar draad te trekken. Koper is ook niet goedkoop.

Via MQTT moeten ze niet eens met elkaar babbelen. De sensor zet om de x tijd een waarde op de server.

Het display haalt de waarde op als het hem past. Op zijn beurt zet die een waarde op de MQTT server dat het licht aan of uit moet. De lichtcontroller haalt de waarde op zodra de server laat weten dat er 'nieuws' is. Die controller doet dan het licht aan of uit.

Van Lambiek wordt goede geuze gemaakt.
blackdog

Golden Member

Hi,

Ik heb het vermoede, omdat de TS aangeeft dat het zijn eerste Arduino project is, dat hij misschien niet weet wat MQTT is.

Voor het leren waarom het niet werkt met de 8-Meter draad zijn mijn tips dit op te lossen een goed begin zonder extra kosten een aardig leertraject.

De tweede oplossing zou de i2c extender zijn.

Nog mooier zou zijn, als de TS ook een redelijke scoop zou hebben,
dan zou hij naar de golfvorm van de twee data lijnen van de i2c bus kijken.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Als dat niet lukt moet ik maar naar een LDR overstappen...

Een LDR over 8 meter uitlezen is ook nog niet eens zo eenvoudig, de weerstand van de kabel zelf telt dan ook. Maar je zou vals kunnen spelen door eerst gewoon de weerstand van de aders in je kabel goed te meten en dan die weerstand als een vast gegeven mee te nemen in de berekening die de arduino moet doen.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.