Buonasera, sono un eterno principiante, nel senso che ogni volta che scopro qualcosa di nuovo diventa un chiodo fisso.
Ho da poco scoperto gli Esp32 e i vari sensori tra cui il D18B20 per testare la temperatura.
fatto il primo sketch con il ciclo loop leggo le temperature tranquillamente.
Poi però l'utilizzo di "loop" mi andava stretto, in quanto utilizzando delay tra una lettura e l'altra non potevo gestire altre operazioni con intervalli diversi.
Cerco e scopro gli interrupt software, su cui la maggior parte della documentazione è riferita a versioni precedenti.
Dopo ulteriori ricerche ho trovato qualcosa sulla nuova versione e facendo qualche prova con WOKWI funziona perfettamente.
La realtà ha evidenziato risultati più deludenti.
Ad ogni ciclo mi viene restituito un errore credo su indirizzi di memoria non gestibili.
Interrupt ...28:13:6b:58:00:00:00:b9 -> 20.31°
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x40083f5c PS : 0x00050d31 A0 : 0x800d20c7 A1 : 0x3ffbf8ec
A2 : 0x00000040 A3 : 0x00018040 A4 : 0x000637ff A5 : 0x3ffbf8cc
A6 : 0x00000000 A7 : 0xb33fffff A8 : 0x800d4610 A9 : 0x4008aac2
A10 : 0x00000000 A11 : 0x7da15afe A12 : 0x800838d8 A13 : 0x3ffbf8ac
A14 : 0x3ffc1fe8 A15 : 0x400854e4 SAR : 0x00000019 EXCCAUSE: 0x0000001c
EXCVADDR: 0x800d20d3 LBEG : 0x400866b5 LEND : 0x400866c5 LCOUNT : 0xffffffff
Backtrace: 0x40083f59:0x3ffbf8ec |<-CORRUPTED
su questo non riesco a trovare soluzioni.
vi allego il codice, se qualcuno potesse aiutarmi
#include <OneWire.h>
#include <DallasTemperature.h>
// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
DeviceAddress mac;
struct rdTemp
{
String sndMac;
float temp ;
};
hw_timer_t *timer = NULL;
rdTemp x;
void ARDUINO_ISR_ATTR onTimer()
{
Serial.print("Interrupt ...");
rdTemp dati = readTemp();
Serial.print(dati.sndMac);
Serial.print(" -> ");
Serial.print(dati.temp);
Serial.print("°");
Serial.println();
}
rdTemp readTemp()
{
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
String wMac = decodMac() ;
rdTemp x ={ wMac, temperatureC};
return x;
}
String decodMac()
{
String wMac = "" ;
String sep = "" ;
for (uint8_t ii = 0; ii < 8; ii++)
{
String mc = "00" + String(mac[ii], HEX) ;
int l = mc.length() ;
mc = mc.substring(l -2,l);
wMac += sep + mc ;
sep = ":" ;
}
return wMac ;
}
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
sensors.begin();
sensors.getAddress(mac, 0);
decodMac();
delay(100);
timer = timerBegin(1000000);
timerAttachInterrupt(timer, onTimer);
timerAlarm(timer, 5000000, true, 0);
}
void loop()
{
}