Een 8 kanaals schakelaar via I2C

Met dit IC kan je een van de 8 aangesloten kanalen, via I2C, schakelen naar een kanaal dat je afleest op je processor. Je schakelt niet echt een verbinding maar de electronica laat signalen door.
Het hardware adres is 0x70 en door A1 en/of A2 en/of A3 door te verbinden kan je het adres nog aanpassen t/m 0x77.
Hierdoor kan je 8 bordjes (adressen) x 8 kanalen bidirectioneel (lezen of schrijven) beschikbaar krijgen om 64 x te schakelen.
Het IC is voor een voedingspanning van zowel 3V als 5V te gebruiken.
0-kHz t/m 400-kHz Clock Freq.
SDA SCL = I2C aansluiting
RESET = reset door laag te maken het IC
SDx - SCx kanaal x (0 t/m 7)
VCC = voedingspanning
GND = Gnd (min)
Volgens Hackster is het aan te raden om 10K pullup weerstanden te gebruiken bij alle kanalen. De Nmos schakelaars van het IC kan slecht tegen hoge spanningen maar goed tegen lage. Ook al zijn de werkspanning en voedinspanning gelijk.
Verder moet het mogelijk zijn om 5V te schakelen naar je 3V processor. Dat wordt door extra pull-up door het IC geregeld.

De laatste bit van het slave adres bepaald het lezen (1) of schrijven (0).
Eerst worden dus de gebruikte library's benoemd om in te lezen in de IDE. En het adres als er geen A1 A2 A3 zijn dicht gesoldeerd.
Let er op dat de TCA zonder extra adres solderingen, adres 0x70 gebruikt. Heb je nog een I2C adres wat adres 0x70 heeft dan moet je dus een een van beide adressen aanpassen.
Op Adafruit vond ik de beste uitleg:
Om problemen te voorkomen met TCA9548 IC's op de I2C met hetzelfde I2C adres kan je alle kanalen op de TCA uitschakelen met:

Wire.beginTransmission(TCAADDR1);
Wire.write(0); // no channel selected
Wire.endTransmission();
Het script:
De eerste regel verteld het script dat 70 Hexadecimaal (0x70) het adres is van de TCAaddr.
Daarna vanaf regel 3 wordt een extra void gemaakt om TCAselect 0 t/m 7 aan te kunnen roepen. Dat zijn dan de kanalen SD0/SC0 t/m SD7/SC7.

#define TCAADDR 0x70

void tcaselect(uint8_t i) {
if (i > 7) return;

Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}

< < geeft aan dat i bitje voor bitje geschreven wordt, dus als het ware ingeschoven wordt.

Daarna het script schrijven wat je via de TCA wil doen. In mijn geval aanbieden 12 analoge signalen aanbieden aan de analoge poort A0.
#include <Wire.h> float analogewaarde;
void setup(void) {
Serial.begin(9600);
Wire.beginTransmission(0x70);
Wire.write(0); // no channel selected
Wire.endTransmission();
}

void loop() { int kanaal; kanaal=0; if (kanaal < 8;kanaal++;) { tcaselect(kanaal); analogewaarde=analogRead(0); Serial.print (kanaal); Serial.print ( "=" ); Serial.print (analogewaarde); Serial.print (" / "; } Serial.println ("."; }


bronnen:
hackster
Github
adafruit