ADS1115 e ESP32 collegamenti e funzionamento

Buonasera a tutti,
Per avere una lettura più corretta dei valori di un termistore sto cercando di utilizzare il convertitore adc ADS1115.
Ho provato a collegarlo come da schema nella foto…ma quando provo a leggere i valori va in errore e poi inizia a stampare dei caratteri sbagliati.

questo lo sketch utilizzato per leggere il voltaggio

#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads(0x48);
float Voltage = 0.0;

void setup(void) 
{
Serial.begin(9600); 
ads.begin();
}

void loop(void) 
{
int16_t adc0;

adc0 = ads.readADC_SingleEnded(0);
Voltage = (adc0 * 0.1875)/1000;

Serial.print("AIN0: "); 
Serial.print(adc0);
Serial.print("\tVoltage: ");
Serial.println(Voltage, 7); 
Serial.println();

delay(1000);
}

e questo l’errore che esce

Guru Meditation Error: Core  1 panic'ed (InstrFetchProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x800d0f3c  PS      : 0x00060530  A0      : 0x400d0ee8  A1      : 0x3ffb1f00  
A2      : 0x3ffc0260  A3      : 0x00000048  A4      : 0x00000002  A5      : 0x00000001  
A6      : 0x00060320  A7      : 0x00000000  A8      : 0x00000002  A9      : 0x00000080  
A10     : 0x00000002  A11     : 0x00000048  A12     : 0x3ffc0260  A13     : 0x00000002  
A14     : 0x00000001  A15     : 0x3ffb1f0c  SAR     : 0x0000001d  EXCCAUSE: 0x00000014  
EXCVADDR: 0x800d0f3c  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0x00000000  

Backtrace: 0x400d0f3c:0x3ffb1f00 0x400d0ee5:0x3ffb1f30 0x400d100d:0x3ffb1f50 0x400d1083:0x3ffb1f70 0x400d0c64:0x3ffb1f90 0x400d24f9:0x3ffb1fb0 0x400889d9:0x3ffb1fd0

Rebooting...
a8⸮⸮⸮*!ġ$+U!⸮ ⸮⸮a@HP;	1 ⸮j⸮*!ġ$⸮a@⸮⸮⸮w⸮	1P<⸮>|⸮	1⸮⸮⸮@⸮	1⸮⸮⸮⸮䂍P⸮⸮`⸮I!T ⸮⸮*!ġ$+	1P<⸮>|⸮a,⸮⸮⸮⸮+!⸮P;a,⸮$⸮w⸮

facendo exception decoder risulta

PC: 0x400d103c: Adafruit_ADS1015::readADC_SingleEnded(unsigned char) at /Users/matteoandreoli/Documents/Arduino/libraries/Adafruit_ADS1X15/Adafruit_ADS1015.cpp line 182
EXCVADDR: 0x00000000

Decoding stack results
0x400d103c: Adafruit_ADS1015::readADC_SingleEnded(unsigned char) at /Users/matteoandreoli/Documents/Arduino/libraries/Adafruit_ADS1X15/Adafruit_ADS1015.cpp line 182
0x400d235d: String::changeBuffer(unsigned int) at /Users/matteoandreoli/Library/Arduino15/packages/esp32/hardware/esp32/1.0.4/cores/esp32/WString.cpp line 168
0x400889d9: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 143

nella foto allegata lo schema che ho seguito per i collegamenti la mia versione è a 16bit non a 12 come nella foto… grazie mille :slight_smile:

Premesso che non conosco la piattaforma ESP32, ma posso dirti che l’errore avviene a run-time e non a compile-time. L’errore è una eccezione non gestita e infatti stampa “Exception was unhandled”. Altra cosa che salta agli occhi è “esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 143”.

Altro di specifico non so dirti, visto che l’errore si verifica durante l’esecuzione potrebbe anche dipendere da un collegamento elettrico errato.

Ciao.

... port.c è un modulo di FreeRTOS™ dove sono presenti le routines specifiche di una certa piattaforma hardware (tutto il resto del OS è comune a tutte le piattaforme).

Ora, mi sembra di vedere che la cosa sia scatenata dalla linea 182 del modulo Adafruit_ADS1015.cpp della libreria Adafruit_ADS1X15, che in qualche modo coinvolge il modulo del "core ESP32" WString.cpp che, a sua volta, riporta a String::changeBuffer(unsigned int) ... e questa cosa mi fa venire il sospetto che ci sia FORSE un problema a livello di allocazione dinamica della memoria (classe String, metodo changeBuffer), parte che è proprio gestita nella sezione di "porting " di FreeRTOS ... ::slight_smile:

Guglielmo

... aggiungo, sono andato a guardare il "core ESP32", modulo WString.cpp e, alla linea indicata, 168, c'è proprio una bella: free(wbuffer()); ... C.V.D. ... qualcuno chiama quella deallocazione di memoria probabilmente con un pointer non valido.

Guglielmo

Maurotec:
Altro di specifico non so dirti, visto che l’errore si verifica durante l’esecuzione potrebbe anche dipendere da un collegamento elettrico errato.

Vi chiedo infinitamente scusa mi sono effettivamente accorto di un errore nei collegamenti :frowning: …ora credo di avere risolto ma ho un altro problema…
sto cercando di utilizzare questo modulo per misurare la temperatura tramite un termistore ntc.
prendendo lo sketch da un progetto che avevo utilizzato per arduino

void setup() {
  Serial.begin(9600);                 // Initialize the serial port, set the baud rate into 9600
  Serial.println("UNO is ready!");    // Print the string "UNO is ready!"
}

void loop() {
  // Convert analog value of A0 port into digital value
  int adcVal = analogRead(A0);
  // Calculate voltage
  float v = adcVal * 5.0 / 1024;
  // Calculate resistance value of thermistor
  float Rt = 10 * v / (5 - v);
  // Calculate temperature (Kelvin)
  float tempK = 1 / (log(Rt / 10) / 3950 + 1 / (273.15 + 25));
  // Calculate temperature (Celsius)
  float tempC = tempK - 273.15;

  // Send the result to computer through serial port
  Serial.print("Current temperature is: ");
  Serial.print(tempK);
  Serial.print(" K, ");
  Serial.print(tempC);
  Serial.println(" C");
  delay(5000);
}

Tenendo conto della lettura in 16 bit dell ads1115 e che il voltaggio che fornisco è di 3.3 ho cercato di calcolare il voltaggio letto in questo modo

#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads(0x48);

void setup(void) {
Serial.begin(9600);
ads.begin();

}

void loop(void) {

 int16_t adcVal; 

 adcVal = ads.readADC_SingleEnded(0); // Read ADC value from ADS1115

 float v = adcVal * (3.3 / 65535); // Calculate voltage
 
 Serial.println(v);
 delay(1000);

}

Ma il valore di “v” che ottengo è diverso da quello che ottengo con lo sketch di arduino… dove sto sbagliando??

Grazie infinite