Velocizzare lettura i2c su ads1115

Ciao a tutti ho creato un dispositivo con Arduino mega che legge una tensione con un ads1115 e lo scrive su una sd card collegata anch’essa in i2c minimizzando al massimo il codice cioè ridotto a due righe di codice leggi e scrivi all’interno di un ciclo while ho riscontrato che per una singola lettura e scrittura ci impiega 9.3 ms esiste un modo per velocizzare il processo?

Come possiamo sapere se si puó ottimizzare il Tuo codice se non ce lo fai vedere?
Cosa dice il datasheet del ads1115 rispetto alla possibile velocitá della I2C?
Ciao Uwe

ma tutti con missioni time critical ? :smiley:
saranno anche tanti ma sono comunque 9 millesmi di secondo

ad ogni modo facci vedere anche le linee di codice che così si ragiona meglio :slight_smile:

sovrapposto a uwe :slight_smile:

Ecco il codice

T1=millis();
while(i<10000){
adc0 = ads.readADC_SingleEnded(0);
Myfile.println(adc0);
}
T2=millis()-T1;
Serial.println(T2);

così non esce mai da while....

Chiedo scusa errore mio avevo aperto il progetto sbagliato questo è il codice giusto

T1=millis();
while(i<10000){
adc0 = ads.readADC_SingleEnded(0);
Myfile.println(adc0);
i++;
}
T2=millis()-T1;
Serial.println(T2);

dalla libreria trovi:

/*=====================================================
    CONVERSION DELAY (in mS)
    -----------------------------------------------------------------------*/
    #define ADS1015_CONVERSIONDELAY         (1)
    #define ADS1115_CONVERSIONDELAY         (8)
/*=====================================================*/

e

/**************************************************************************/
/*!
    @brief  Gets a single-ended ADC reading from the specified channel
*/
/**************************************************************************/
uint16_t Adafruit_ADS1015::readADC_SingleEnded(uint8_t channel) {
  if (channel > 3)
  {
    return 0;
  }
  
...omissis

  // Write config register to the ADC
  writeRegister(m_i2cAddress, ADS1015_REG_POINTER_CONFIG, config);

  // Wait for the conversion to complete
  delay(m_conversionDelay);

  // Read the conversion results
  // Shift 12-bit results right 4 bits for the ADS1015
  return readRegister(m_i2cAddress, ADS1015_REG_POINTER_CONVERT) >> m_bitShift;  
}

quindi il minimo tempo necessario sono 8 mS

Forse riscrivendo una versione personale della libreria che scrive la penultima lettura durante il tempo di conversione dell'ultima...