4 x ads1115 na jedné I2C
4 x ads1115 na jedné I2C
Prosím o radu. Používám 4 kusy AD převodníků ADS1115 připojené přes
I2C k Arduinu. Adresované jsou dle manuálu jako 0x48, 0x49, 0x4A,0x4B
připojením pinu ADDR postupně k GND, Ucc, SDA a SCL.
Vyzkoušel jsem 11 ks převodníku ADS1115 - na adresách 0x48, 0x49 a
0x4B pracují bezchybně, (ADDR připojen postupně na GND, Ucc, SDA a SCL),
ale na třetí adrese 0x4A (PROPOJEN s SDA) se žádný z nich nehlásí,
zato je přihlášen na 0x4B a ovlivňuje výsledky svého čtvrtého kolegy.
Zkusil jsem zapojení na nepájivém kontaktním poli i na dvou typech DPS,
abych vyloučil omyl v zapojení. Zapojení používám naprosto jednoduché jen
propojení k I2C sběrnici a vstupní napětí přivedené na vstupy je z
odporového děliče z Ucc = 3,3V. Můj závěr - chyba je v adresaci uvnitř
vlastního převodníku ADS1115.
Nevíte o někom, kdo se pokusil o připojení čtyřech ADS1115 na jednu I2C
a může mi potvrdit můj závěr, případně poradit, kde dělám chybu?
I2C k Arduinu. Adresované jsou dle manuálu jako 0x48, 0x49, 0x4A,0x4B
připojením pinu ADDR postupně k GND, Ucc, SDA a SCL.
Vyzkoušel jsem 11 ks převodníku ADS1115 - na adresách 0x48, 0x49 a
0x4B pracují bezchybně, (ADDR připojen postupně na GND, Ucc, SDA a SCL),
ale na třetí adrese 0x4A (PROPOJEN s SDA) se žádný z nich nehlásí,
zato je přihlášen na 0x4B a ovlivňuje výsledky svého čtvrtého kolegy.
Zkusil jsem zapojení na nepájivém kontaktním poli i na dvou typech DPS,
abych vyloučil omyl v zapojení. Zapojení používám naprosto jednoduché jen
propojení k I2C sběrnici a vstupní napětí přivedené na vstupy je z
odporového děliče z Ucc = 3,3V. Můj závěr - chyba je v adresaci uvnitř
vlastního převodníku ADS1115.
Nevíte o někom, kdo se pokusil o připojení čtyřech ADS1115 na jednu I2C
a může mi potvrdit můj závěr, případně poradit, kde dělám chybu?
Re: 4 x ads1115 na jedné I2C
Dovolím si citaci z datasheetu:
https://cdn-learn.adafruit.com/download ... akouts.pdf
Myslím, že pro 0x4A adresu musí být obsluha v knihovně.
Nezkoušel jsem to, ale hledal bych řešení a knihovny tady:The ADS111x have one address pin, ADDR, that configures the I
2C address of the device. This pin can be
connected to GND, VDD, SDA, or SCL, allowing for four different addresses to be selected with one pin, as
shown in Table 4. The state of address pin ADDR is sampled continuously. Use the GND, VDD and SCL
addresses first. If SDA is used as the device address, hold the SDA line low for at least 100 ns after the SCL line
goes low to make sure the device decodes the address correctly during I
2C communication.
https://cdn-learn.adafruit.com/download ... akouts.pdf
Myslím, že pro 0x4A adresu musí být obsluha v knihovně.
Re: 4 x ads1115 na jedné I2C
Co tak dát sem tvůj kód.
Asi by to mělo být tak nějak:
Asi by to mělo být tak nějak:
Kód: Vybrat vše
#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads1115_0; // Construct an ads1115 at the default address: 0x48
Adafruit_ADS1115 ads1115_1(0x49); // construct an ads1115 at address 0x49
Adafruit_ADS1115 ads1115_2(0x4A); // construct an ads1115 at address 0x4A
Adafruit_ADS1115 ads1115_3(0x4B); // construct an ads1115 at address 0x4B
void setup(void)
{
ads1115_0.begin(); // Initialize ads1115 address 0x48
ads1115_1.begin(); // Initialize ads1115 address 0x49
ads1115_2.begin(); // Initialize ads1115 address 0x4A
ads1115_3.begin(); // Initialize ads1115 address 0x4B
}
Re: 4 x ads1115 na jedné I2C
Každý převodník má na pinech SDA a SCL pullup resistory 10kohm. Při zapojení 4 ks je výsledná hodnota celkově 2.5kohm a to je už nízká hodnota. Je možné, že I2C začíná mít problém při adresaci. Odpájej na tom jednom opatrně tyto rezistory.
Re: 4 x ads1115 na jedné I2C
Děkuji za upozornění na manuál, nevzal jsem to v potaz.
tady je jedna z variant kódu:
#include <Wire.h> //prvních šestnáct teplot přes ADS1115
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 kotel(0x48);
Adafruit_ADS1115 kuchyn(0x49);
Adafruit_ADS1115 obyv(0x4A);
Adafruit_ADS1115 koup(0x4B);
Adafruit_ADS1115 ads; /* 1AU4629 Use this for the 16-bit version */
//Adafruit_ADS1015 ads; /* Use this for the 12-bit version */
byte teplota[32];
int ccc, xxx,zz;
int16_t adc0, tepOK , adc1, adc2, adc3, Uo;
//const double napeti33=3300000; //mV
float tepC;
float logRt,Rt,T; // 10k termistor na zem,10k odpor na+3.3V
const float Rezistor[32]={ // PEVNY ODPOR pripojeny na 3,3V z Arduina DUE
12032.0, 12032.0,12032.0,12032.0, 10090.0, 10120.0, 10090.0, 10100.0,
10100.0, 10100.0,10100.0,10100.0, 10100.0, 10090.0, 10090.0, 10080.0,
9000.0, 9000.0, 9000.0, 9000.0, 9000.0, 9000.0, 12110.0, 12040.0,
12060.0, 12060.0, 12080.0, 12060.0, 12060.0, 12060.0, 12080.0, 12060.0};
const int Rref[32]={ //REFERENČNÍ ODPOR TERMISTORU
11400, 9600, 11400, 10800, 10000, 10000, 11900, 12300,
10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000,
10000, 10000, 10000, 10000, 25720, 26070, 10000, 10000,
12110, 12040, 12060, 12060, 12080, 13060, 12060, 12060,}; //24-30
// pri teplote uvedene zde:
const int refTep[32]={ //cervena zelena zluta deska MAC024
22, 19, 21, 22, 20, 20, 21, 20,
22, 22, 22, 22, 21, 25, 17, 22,
21, 25, 23, 20, 21, 25, 21, 25,
22, 22, 22, 22, 22, 22, 22, 22}, beta=3977; // Beta faktor
void setup(void)
{
Serial.begin(9600);
Serial.println("\n\n NOV meri napeti Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
kotel.begin();
kuchyn.begin();
obyv.begin();
koup.begin();
}
void loop(void) {
//mereni teploty ADS1115
Uo =0.1875*koup.readADC_SingleEnded(3); Uo=3300;
Serial.print(" Uo="); Serial.print(Uo); Serial.print("mV ");
ccc=xxx+zz;
for (xxx=0; xxx<4; xxx++ ){ // ctyri ads1115
for (zz=0; zz<4; zz++ ){ // ctyri vstupy A0-A3
ccc=xxx+zz;
if (xxx==0) tepOK=0.1875*kotel.readADC_SingleEnded(zz); //Serial.print(tepOK);Serial.print("mV");
if (xxx==1) tepOK=0.1875*kuchyn.readADC_SingleEnded(zz);
if (xxx==2) tepOK=0.1875*obyv.readADC_SingleEnded(zz);
if (xxx==3) tepOK=0.1875*koup.readADC_SingleEnded(zz);
// tepOK=min(2300,tepOK);
// SpoctiTeplotu (tepOK,Rezistor[ccc] ,Rref[ccc],refTep[ccc],ccc);
//teplota[ccc]=max (2*tepC+40.59,0); //xxx=3;zz=3;Serial.print(xxx*4+zz);Serial.print("=");
Serial.print(tepOK);Serial.print(" "); //Serial.print(teplota[ccc]);Serial.print(" ");
}//zz
Serial.print(" "); }//xxx
delay(13000);Serial.println(" ");
//mereni teploty pres DUE
}//loop
// Ro=Rezistor[ccc], RrEF= Rref[ccc] ,tepRrEF=refTep[ccc],ccc)
void SpoctiTeplotu (int16_t napeti,float Ro,int RrEF,int tepRrEF, byte ggg) {
// Serial.print(" nap "); Serial.print(napeti);//Serial.print(" "); Serial.print(RrEF);
// Serial.print(" "); Serial.print(tepRrEF);Serial.print(" "); Serial.print(ggg);
tepC=float(Uo) / float(napeti); //Serial.print(" Uo/U "); Serial.print(tepC);
tepC=tepC - 1; // Serial.print(" minus1 "); Serial.print(tepC);
tepC=Ro/ tepC; //Serial.print(" tepC "); Serial.print(tepC);
tepC=tepC/RrEF; // (R/Ro)
// Serial.print(" Rref "); Serial.print(Rref[ggg]);// Serial.print(" R/Ro "); Serial.print(tepC);
tepC=log(tepC); // Serial.print(" LOG "); Serial.print(tepC*1); // ln(R/Ro)
tepC /= beta; // Serial.print(" C/b "); Serial.print(tepC); // 1/B * ln(R/Ro)
tepC += 1.0 / (tepRrEF+ 273.15); // + (1/To)
tepC=1.0 / tepC; // Prevracena hodnota
tepC -= 273.15; // Prevod z Kelvinu´ na stupne Celsia
//Serial.print(napeti);Serial.print(" ");//Serial.print(teplota[ggg],HEX);Serial.print(" ");
}
tady je jedna z variant kódu:
#include <Wire.h> //prvních šestnáct teplot přes ADS1115
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 kotel(0x48);
Adafruit_ADS1115 kuchyn(0x49);
Adafruit_ADS1115 obyv(0x4A);
Adafruit_ADS1115 koup(0x4B);
Adafruit_ADS1115 ads; /* 1AU4629 Use this for the 16-bit version */
//Adafruit_ADS1015 ads; /* Use this for the 12-bit version */
byte teplota[32];
int ccc, xxx,zz;
int16_t adc0, tepOK , adc1, adc2, adc3, Uo;
//const double napeti33=3300000; //mV
float tepC;
float logRt,Rt,T; // 10k termistor na zem,10k odpor na+3.3V
const float Rezistor[32]={ // PEVNY ODPOR pripojeny na 3,3V z Arduina DUE
12032.0, 12032.0,12032.0,12032.0, 10090.0, 10120.0, 10090.0, 10100.0,
10100.0, 10100.0,10100.0,10100.0, 10100.0, 10090.0, 10090.0, 10080.0,
9000.0, 9000.0, 9000.0, 9000.0, 9000.0, 9000.0, 12110.0, 12040.0,
12060.0, 12060.0, 12080.0, 12060.0, 12060.0, 12060.0, 12080.0, 12060.0};
const int Rref[32]={ //REFERENČNÍ ODPOR TERMISTORU
11400, 9600, 11400, 10800, 10000, 10000, 11900, 12300,
10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000,
10000, 10000, 10000, 10000, 25720, 26070, 10000, 10000,
12110, 12040, 12060, 12060, 12080, 13060, 12060, 12060,}; //24-30
// pri teplote uvedene zde:
const int refTep[32]={ //cervena zelena zluta deska MAC024
22, 19, 21, 22, 20, 20, 21, 20,
22, 22, 22, 22, 21, 25, 17, 22,
21, 25, 23, 20, 21, 25, 21, 25,
22, 22, 22, 22, 22, 22, 22, 22}, beta=3977; // Beta faktor
void setup(void)
{
Serial.begin(9600);
Serial.println("\n\n NOV meri napeti Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
kotel.begin();
kuchyn.begin();
obyv.begin();
koup.begin();
}
void loop(void) {
//mereni teploty ADS1115
Uo =0.1875*koup.readADC_SingleEnded(3); Uo=3300;
Serial.print(" Uo="); Serial.print(Uo); Serial.print("mV ");
ccc=xxx+zz;
for (xxx=0; xxx<4; xxx++ ){ // ctyri ads1115
for (zz=0; zz<4; zz++ ){ // ctyri vstupy A0-A3
ccc=xxx+zz;
if (xxx==0) tepOK=0.1875*kotel.readADC_SingleEnded(zz); //Serial.print(tepOK);Serial.print("mV");
if (xxx==1) tepOK=0.1875*kuchyn.readADC_SingleEnded(zz);
if (xxx==2) tepOK=0.1875*obyv.readADC_SingleEnded(zz);
if (xxx==3) tepOK=0.1875*koup.readADC_SingleEnded(zz);
// tepOK=min(2300,tepOK);
// SpoctiTeplotu (tepOK,Rezistor[ccc] ,Rref[ccc],refTep[ccc],ccc);
//teplota[ccc]=max (2*tepC+40.59,0); //xxx=3;zz=3;Serial.print(xxx*4+zz);Serial.print("=");
Serial.print(tepOK);Serial.print(" "); //Serial.print(teplota[ccc]);Serial.print(" ");
}//zz
Serial.print(" "); }//xxx
delay(13000);Serial.println(" ");
//mereni teploty pres DUE
}//loop
// Ro=Rezistor[ccc], RrEF= Rref[ccc] ,tepRrEF=refTep[ccc],ccc)
void SpoctiTeplotu (int16_t napeti,float Ro,int RrEF,int tepRrEF, byte ggg) {
// Serial.print(" nap "); Serial.print(napeti);//Serial.print(" "); Serial.print(RrEF);
// Serial.print(" "); Serial.print(tepRrEF);Serial.print(" "); Serial.print(ggg);
tepC=float(Uo) / float(napeti); //Serial.print(" Uo/U "); Serial.print(tepC);
tepC=tepC - 1; // Serial.print(" minus1 "); Serial.print(tepC);
tepC=Ro/ tepC; //Serial.print(" tepC "); Serial.print(tepC);
tepC=tepC/RrEF; // (R/Ro)
// Serial.print(" Rref "); Serial.print(Rref[ggg]);// Serial.print(" R/Ro "); Serial.print(tepC);
tepC=log(tepC); // Serial.print(" LOG "); Serial.print(tepC*1); // ln(R/Ro)
tepC /= beta; // Serial.print(" C/b "); Serial.print(tepC); // 1/B * ln(R/Ro)
tepC += 1.0 / (tepRrEF+ 273.15); // + (1/To)
tepC=1.0 / tepC; // Prevracena hodnota
tepC -= 273.15; // Prevod z Kelvinu´ na stupne Celsia
//Serial.print(napeti);Serial.print(" ");//Serial.print(teplota[ggg],HEX);Serial.print(" ");
}
Re: 4 x ads1115 na jedné I2C
A existuje ještě jeden problém. Podle schématu Adafruit je pin ADR připojen ke GND přes rezistor 10k - defaultní adresace 0x48. To je také věc, kterou by nejspíš při větším počtu modulů bylo třeba ošetřit.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host