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
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
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.
... 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 ... :
... 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.
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 ..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??