ESP32 BLEScan->start(0);

Odpovědět
MiraVorlik
Příspěvky: 11
Registrován: 10 čer 2022, 10:00
Reputation: 0

ESP32 BLEScan->start(0);

Příspěvek od MiraVorlik » 17 čer 2022, 06:32

Zdravím lidi, mám takový problém s ESPéčkem, všude kde hledám dočítám se že třída BLEScan je asynchronní, tedy že dokáže běžet na druhém jádru ESP a nezastaví mi kód. Bohužel opak je pravdou a tak se ptám zdali něco nedělám špatně. V Loop() mám tuto podmínku a parametr pro skenování mám hodnotu 0 aby skenoval nepřetržitě, ale díky tomu se mi loop zastaví a já už nemohu provádět nic. Tento kód je na straně client. Skenování je nepřetržité protož server se senzorem (taky ESP32) se uspává kvůli baterii. Nějaké další informace o BLEscan viz. odkaz. Díky za rady ;-)

if (doConnect == false) {
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true);
pBLEScan->start(0);
}


http://www.neilkolban.com/esp32/docs/cp ... _scan.html

martinius96
Příspěvky: 560
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: ESP32 BLEScan->start(0);

Příspěvek od martinius96 » 17 čer 2022, 12:36

Ahoj, niečo podobné sme riešili už dávnejšie na Facebooku v Arduino skupine: https://www.facebook.com/groups/6897323 ... 156171874/
Nepoužívala sa tam trieda, ktorú popisuješ. Avšak mohlo by ti toto poslúžiť ako príklad pre úpravu tvojho kódu.
Problém bol identický, že beh skenovania zablokoval vykonávanie programu a bolo potrebné čakať až sa sken ukončí. Ak by sa skenovalo nepretržite, nebolo by možné vykonávať žiaden program.
Využili sme FreeRTOS a vytvorili sme task, ktorý obsluhuje bluetooth. Loop (mimochodom je to taktiež task) tak mohol byť využitý pre ostatný program, ktorý nebol pozastavený po dobu vykonávania tasku, ktorý obsluhuje BLE.

Skenovanie sa vykonáva 10 sekúnd a zase dookola, keďže to beží v slučke while(1). Myslím, žeby to fungovalo aj keby si to spustil s parametrom 0 pre nepretržité skenovanie (možno by to už nemuselo byť ani vo while(1), treba vyskúšať, nemalo by to ukončiť task, ak to beží nepretržite.
V loope môžeš fungovať nezávisle na tom, čo je v tasku, ten ti beh loopu nezastaví, ani neobmedzí.

Kód: Vybrat vše

#include <BLEScan.h> // Knihovna pro BLEScaner
BLEScan* sken; // Ukazatel na tridu BLE skeneru
 
TaskHandle_t Task1;
 
void setup() {
  Serial.begin(115200);
  xTaskCreatePinnedToCore(
    Task1code, /* Function to implement the task */
    "Task1", /* Name of the task */
    10000,  /* Stack size in words */
    NULL,  /* Task input parameter */
    5,  /* Priority of the task */
    &Task1,  /* Task handle. */
    0); /* Core where the task should run */
 
}
 
void loop() {
  //TOTO NAM BEZI NA CORE 1 (APP_CPU)
 
}
 
void Task1code( void * parameter) {
  //AK CHCEM NIECO SPUSTIT V TASKU RAZ PRED BEHOM SLUCKY, VLOZIM TO TU
  //TASK BEZI NA CORE 0 (PRO_CPU)
  while (1) {
    BLEScanResults foundDevices = sken->start(10, false); // Spust skener na 10 vteřin
    sken->stop();// Zastav skener
    sken->clearResults(); // Smaz vysledky
  }
} 

MiraVorlik
Příspěvky: 11
Registrován: 10 čer 2022, 10:00
Reputation: 0

Re: ESP32 BLEScan->start(0);

Příspěvek od MiraVorlik » 17 čer 2022, 12:52

Super, díky za námět. o víkendu to otestuji a uvidím jak pochodím ;-)

MiraVorlik
Příspěvky: 11
Registrován: 10 čer 2022, 10:00
Reputation: 0

Re: ESP32 BLEScan->start(0);

Příspěvek od MiraVorlik » 21 čer 2022, 07:47

Takže, zatím se nedaří. U tohoto projektu je fakt jeden problém za druhým :D Dle předchozího námětu dávám dohromady rozdělní úloh na jádra. K tomu mi trochu pro zorientování pomohla tato stránka:

https://microcontrollerslab.com/esp32-d ... duino-ide/

Bohužel, i po úpravě svého kódu to nefunguje a teď tedy budu bádat proč mi serial monitor vypisuje tuto chybu s tím že se ESP restartuje dokola ...

Guru Meditation Error: Core 0 panic'ed (IllegalInstruction). Exception was unhandled.
16:21:19.065 -> Memory dump at 0x400d2b64: 25a18b41 f01dfff9 41008136
16:21:19.065 -> Core 0 register dump:
16:21:19.065 -> PC : 0x400d2b6a PS : 0x00060830 A0 : 0x00000000 A1 : 0x3ffdc870
16:21:19.065 -> A2 : 0x00000000 A3 : 0x3ffcee0c A4 : 0x00000000 A5 : 0x00000000
16:21:19.112 -> A6 : 0x00000000 A7 : 0x00000000 A8 : 0x800d2b6a A9 : 0x3ffdc850
16:21:19.112 -> A10 : 0x3ffdc878 A11 : 0x00000000 A12 : 0x00000000 A13 : 0x00000000
16:21:19.112 -> A14 : 0x3ffc2cd0 A15 : 0x80000001 SAR : 0x00000006 EXCCAUSE: 0x00000000
16:21:19.112 -> EXCVADDR: 0x00000000 LBEG : 0x400905b4 LEND : 0x400905ca LCOUNT : 0x00000000

Kdyby se s tím někdo setkal a vyřešil to, dejte vědět díky ;-)

martinius96
Příspěvky: 560
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: ESP32 BLEScan->start(0);

Příspěvek od martinius96 » 21 čer 2022, 12:25

Ťažko povedať, tú chybu môže dávať mnoho vecí...
Od jednoduchých v programe, napr: pinMode(4, INPUT_PULLUP) po problémy vo flash pamäti, nvs sektore a pod...

Skús si do Arduino IDE integrovať EspExceptionDecoder: https://github.com/me-no-dev/EspExceptionDecoder
Tam nakopíruješ backtrace a pomôže ti to s odhalením chyby. Možno len používaš nejaký pin, ktorý je pre EN, BOOT signál, alebo je pripojený niekde ku flash.

MiraVorlik
Příspěvky: 11
Registrován: 10 čer 2022, 10:00
Reputation: 0

Re: ESP32 BLEScan->start(0);

Příspěvek od MiraVorlik » 21 čer 2022, 12:48

martinius96 píše:
21 čer 2022, 12:25
Ťažko povedať, tú chybu môže dávať mnoho vecí...
Od jednoduchých v programe, napr: pinMode(4, INPUT_PULLUP) po problémy vo flash pamäti, nvs sektore a pod...

Skús si do Arduino IDE integrovať EspExceptionDecoder: https://github.com/me-no-dev/EspExceptionDecoder
Tam nakopíruješ backtrace a pomôže ti to s odhalením chyby. Možno len používaš nejaký pin, ktorý je pre EN, BOOT signál, alebo je pripojený niekde ku flash.
Díky za tip, opravdu i INPUT_PULLUP používám v kódu :roll: ale to se dá ošetřit fyzicky kdyby to byl opravdu takový problém. Každopádně ten backtrace dekódují a uvidím kam se dopracuju. ;)

martinius96
Příspěvky: 560
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: ESP32 BLEScan->start(0);

Příspěvek od martinius96 » 21 čer 2022, 14:19

Ono nejde tak úplne o INPUT_PULLUP ako konkrétny pin s ktorým sa pracuje a menia sa na ňom stavy nielen na začiatku ale aj v priebehu programu..
Ten príklad s GPIO4 má problém v tom, že GPIO4 je BOOT signál a je štandardne na úrovni +3,3V a pri stlačení BOOT tlačidla prechádza na LOW (0V).
Pri nastavení na INPUT_PULLUP v programe to dávalo túto chybu a doska sa neustále reštartovala, keďže pinMode sa nastavoval hneď v loope(). Pomohlo zmeniť pin a chybová hláška sa už neukázala.

V obrázku nižšie ten GPIO4 síce nie je spomenutý, ale sú tam ďalšie piny na ktoré si treba dať pozor..
Taktiež piny 34, 35, 36, 39 fungujú iba ako INPUT. Nemôžeš ich nastaviť na INPUT_PULLUP, ani použiť ako výstup.
Obrázek

MiraVorlik
Příspěvky: 11
Registrován: 10 čer 2022, 10:00
Reputation: 0

Re: ESP32 BLEScan->start(0);

Příspěvek od MiraVorlik » 22 čer 2022, 08:08

martinius96 píše:
21 čer 2022, 14:19
Ono nejde tak úplne o INPUT_PULLUP ako konkrétny pin s ktorým sa pracuje a menia sa na ňom stavy nielen na začiatku ale aj v priebehu programu..
Ten príklad s GPIO4 má problém v tom, že GPIO4 je BOOT signál a je štandardne na úrovni +3,3V a pri stlačení BOOT tlačidla prechádza na LOW (0V).
Pri nastavení na INPUT_PULLUP v programe to dávalo túto chybu a doska sa neustále reštartovala, keďže pinMode sa nastavoval hneď v loope(). Pomohlo zmeniť pin a chybová hláška sa už neukázala.

V obrázku nižšie ten GPIO4 síce nie je spomenutý, ale sú tam ďalšie piny na ktoré si treba dať pozor..
Taktiež piny 34, 35, 36, 39 fungujú iba ako INPUT. Nemôžeš ich nastaviť na INPUT_PULLUP, ani použiť ako výstup.
Zajímavé že jsem to ještě neodpálil protože jsem používal piny 34,35 pro tlačítka jako PULLUP, no nic přenastavil jsem je na 32, 33. ;) Na pin GPIO4 nic připojeného nemám to by být problém neměl dale jsem vynechal všechny piny 6-11.

Jinak zkusil nějakou obměnu kódu pro Core0 kde má běžet skenovaní BLE a co se týkalo té hlášky "Guru Meditation Error: Core 0 panic'ed (IllegalInstruction). " tak asi se mu moc nelíbilo že jsem tam měl pouze podmínku a ne nějakou smyčku. Tedy on vykonal podmínku, řekl si "no nic teď už nemám co na práci a tak to restartuju abych si tu podmínku mohl vykonat znova" :lol: Dal jsem tam smyčku while a chyba zmizela. Takže kde byl skutečný problém budu ještě zkoumat přes ten editor (ještě jsem se k tomu nedostal).

I když se dál peru s tím kódem, protože si nejsem jist jak funguje návaznost či provázanost tříd pro BLE a dalších příkazu které odkazují na běh programu v Core1, ale to už budu testovat systémem pokus omyl :D

MiraVorlik
Příspěvky: 11
Registrován: 10 čer 2022, 10:00
Reputation: 0

Re: ESP32 BLEScan->start(0);

Příspěvek od MiraVorlik » 22 čer 2022, 08:21

MiraVorlik píše:
22 čer 2022, 08:08
martinius96 píše:
21 čer 2022, 14:19
Ono nejde tak úplne o INPUT_PULLUP ako konkrétny pin s ktorým sa pracuje a menia sa na ňom stavy nielen na začiatku ale aj v priebehu programu..
Ten príklad s GPIO4 má problém v tom, že GPIO4 je BOOT signál a je štandardne na úrovni +3,3V a pri stlačení BOOT tlačidla prechádza na LOW (0V).
Pri nastavení na INPUT_PULLUP v programe to dávalo túto chybu a doska sa neustále reštartovala, keďže pinMode sa nastavoval hneď v loope(). Pomohlo zmeniť pin a chybová hláška sa už neukázala.

V obrázku nižšie ten GPIO4 síce nie je spomenutý, ale sú tam ďalšie piny na ktoré si treba dať pozor..
Taktiež piny 34, 35, 36, 39 fungujú iba ako INPUT. Nemôžeš ich nastaviť na INPUT_PULLUP, ani použiť ako výstup.
Zajímavé že jsem to ještě neodpálil protože jsem používal piny 34,35 pro tlačítka jako PULLUP, no nic přenastavil jsem je na 32, 33. ;) Na pin GPIO4 nic připojeného nemám to by být problém neměl dale jsem vynechal všechny piny 6-11.

Jinak zkusil nějakou obměnu kódu pro Core0 kde má běžet skenovaní BLE a co se týkalo té hlášky "Guru Meditation Error: Core 0 panic'ed (IllegalInstruction). " tak asi se mu moc nelíbilo že jsem tam měl pouze podmínku a ne nějakou smyčku. Tedy on vykonal podmínku, řekl si "no nic teď už nemám co na práci a tak to restartuju abych si tu podmínku mohl vykonat znova" :lol: Dal jsem tam smyčku while a chyba zmizela. Takže kde byl skutečný problém budu ještě zkoumat přes ten dekoder (ještě jsem se k tomu nedostal).

I když se dál peru s tím kódem, protože si nejsem jist jak funguje návaznost či provázanost tříd pro BLE a dalších příkazu které odkazují na běh programu v Core1, ale to už budu testovat systémem pokus omyl :D

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host