Salve, è possibile con la sua libreria utilizzare il deep sleep invece che il light sleep con il modulo lora in WOR?
Ho provato ad utilizzare il deep sleep su un esp32 modificando l’esempio per il WOR della sua libreria, ma al momento non riesco a svegliare il tutto dopo che entra in deep sleep.
Ciao Federico,
ho finito di scrivere un articolo proprio sull’argomento, ho ordinato gli shield per il DOIT
ESP32 DEK KIT v1 e il LOLIN32, appena mi arrivano pubblico l’articolo con tutte le informazioni.
Allora, per prima cosa devi controllare che i pin siano RTC, ma soprattutto devi impostare la presevazione dello stato dei pin, altrimenti i flag M0 e M1 perdono lo stato come spiegato qui
Qui ti incollo una porzione del codice che ho usato con gli e22
e22ttl.begin();
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
if (ESP_SLEEP_WAKEUP_EXT0 == wakeup_reason) {
Serial.println("Waked up from external GPIO!");
gpio_hold_dis(GPIO_NUM_21);
gpio_hold_dis(GPIO_NUM_19);
gpio_deep_sleep_hold_dis();
e22ttl.setMode(MODE_0_NORMAL);
delay(1000);
e22ttl.sendFixedMessage(0, DESTINATION_ADDL, 23, "We have waked up from message, but we can't read It!");
}else{
e22ttl.setMode(MODE_1_WOR);
delay(1000);
Serial.println();
Serial.println("Start sleep!");
delay(100);
if (ESP_OK == gpio_hold_en(GPIO_NUM_21)){
Serial.println("HOLD 21");
}else{
Serial.println("NO HOLD 21");
}
if (ESP_OK == gpio_hold_en(GPIO_NUM_19)){
Serial.println("HOLD 19");
}else{
Serial.println("NO HOLD 19");
}
esp_sleep_enable_ext0_wakeup(GPIO_NUM_15,LOW);
gpio_deep_sleep_hold_en();
//Go to sleep now
Serial.println("Going to sleep now");
esp_deep_sleep_start();
delay(1);
ma ricorda che puoi svegliare dal deep sleep, ma il device si riavvia e così non riesci a leggere il messaggio, perciò ti consiglio di usare un messaggio per svegliare ed uno successivo con le informazioni.
1) Non capisco perchè una volta che l’ESP32 viene riavviato dal pin AUX del modulo LORA , il uC ESP32 non può essere in grado di leggere il messaggio che il modulo LORA ha bufferizzato in memoria e dunque l’ESP32 ha tutto il tempo di riavviarsi , interrogare il modulo e leggere il messaggio ricevuto.
2) Nella piccola porzione di codice che hai postato non comprendo il significato della variabile “ESP_OK” …. e la relativa condizione che hai inserito.
Buondì,
in realtà avevo rilevato che al “risveglio” perde l’hold dei pin e il buffer se ne va, inoltre al begin della Serial faccio anche i vari set dello stato dell’E32, sarebbe utile fare una prova di read sulla seriale bypassando la libreria e l’inizializzazione dei pin.
La funzione torna ESP_OK se c’è fattibilità dell’hold.
Ciao Renzo
ho fatto in modo di impostare l’hold dei pin , con oscilloscopio alla mano , nella transizione da stato normale a deep sleep , tutti i pin collegati al modulo LoraWan non cambiano di stato. Ho anche implementato la condizione per la quale non effettuo nessuna configurazione del modulo Lorawan al risveglio del uC da deepsleep , mentre se è una condizione di reset normale effettuo regolarmente la configurazione. Ciò nonostante il buffer del modulo lora quando il uC si risveglia in seguito alla ricezione in un pacchetto in modalità WOR è vuoto.
Mi potresti spiegare come funziona la lettura del buffer lorawan?? Cioè , vorrei capire, è il modulo lorawan che memorizza in maniera autonoma il pacchetto dati ricevuto e quando viene interrogato via seriale restituisce il pacchetto che ha in pancia?? Oppure quando è attiva la modalità WOR , il modulo in automatico dopo il ritardo WOR trasmette via seriale i dati verso il uC??
Poichè nella seconda ipotesi mi spiegherei perchè il uC quando si sveglia ed interroga il buffer lora (tramite la tua libreria) ritorna 0. Perchè ipotizzando che il modulo lora trasmette subito i dati seriali , il uC ovviamente se li perde poichè sta ancora dormento.
Per maggior chiarezza ti giro il Fw.
P.S: Per far funzionare tutto correttamente ho comunque dovuto inserire l’attributo “RTC_DATA_ATTR” alle tue variabili di libreria altrimenti al riavvio dal deep sleep , quando si eseguiva l’istruzione di interrogazione del buffer lora, il uC andava in crash generando un errore al quanto bislacco “Guru Meditations error” , ho risolto dichiarando le tue variabili come segue:
RTC_DATA_ATTR Configuration configuration;
RTC_DATA_ATTR ResponseStructContainer LoraWan_Config;
RTC_DATA_ATTR ResponseStatus rs;
RTC_DATA_ATTR LoRa_E220 LoraWan(&Serial2, 13, 18, 19); // Serial AUX M0 M1
Ciao Alexzupo,
Penso che prima di tutto devi fare una wake simile a questa this example
in particolare questa parte
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
if (ESP_SLEEP_WAKEUP_EXT0 == wakeup_reason) {
Serial.println("Waked up from external GPIO!");
gpio_hold_dis(GPIO_NUM_21);
gpio_hold_dis(GPIO_NUM_19);
gpio_deep_sleep_hold_dis();
e32ttl.setMode(MODE_0_NORMAL);
delay(1000);
e32ttl.sendFixedMessage(0, DESTINATION_ADDL, 23, "We have waked up from message, but we can't read It!");
}else{
e32ttl.setMode(MODE_2_POWER_SAVING);
delay(1000);
Serial.println();
Serial.println("Start sleep!");
delay(100);
if (ESP_OK == gpio_hold_en(GPIO_NUM_21)){
Serial.println("HOLD 21");
}else{
Serial.println("NO HOLD 21");
}
if (ESP_OK == gpio_hold_en(GPIO_NUM_19)){
Serial.println("HOLD 19");
}else{
Serial.println("NO HOLD 19");
}
esp_sleep_enable_ext0_wakeup(GPIO_NUM_15,LOW);
gpio_deep_sleep_hold_en();
//Go to sleep now
Serial.println("Going to sleep now");
esp_deep_sleep_start();
delay(1);
}
// e32ttl.setMode(MODE_0_NORMAL);
// delay(1000);
Serial.println();
Serial.println("Wake and start listening!");
rimuovi anche e32ttl.begin(); ed inseriscilo solo sull’else
e prova a leggere il buffer nell’if
if (ESP_SLEEP_WAKEUP_EXT0 == wakeup_reason) {
Serial.println("Waked up from external GPIO!");
gpio_hold_dis(GPIO_NUM_21);
gpio_hold_dis(GPIO_NUM_19);
gpio_deep_sleep_hold_dis();
e32ttl.setMode(MODE_0_NORMAL);
delay(1000);
e32ttl.sendFixedMessage(0, DESTINATION_ADDL, 23, "We have waked up from message, but we can't read It!");
}
senza I vari hold_dis, leggi il buffer dell’UART direttamente
se trovo del tempo lo testo anche io in maniera autonoma.
Ciao Renzo,
purtroppo non era un problema derivante dallo stato logico dei pin M0 e M1 al risveglio.
Il problema (molto più semplice) risiede semplicemente sul fatto che il uC dal momento che si sveglia passano 53mS prima che effettui la prima operazione.
Mentre il modulo Lorawan (in modalità WOR) alla ricezione del pacchetto , abbassa il segnale AUX e dopo 2mS invia i dati via seriale. il uC siccome non si è ancora svegliato, dunque , si perde totalmente la ricezione del pacchetto seriale.
P.S: Il tempo 53mS l’ho calcolato con oscilloscopio alla mano e con un Fw base in cui gestisco solo il deepSleep. Ho eliminato qualsiasi libreria o altro che possa concorrere a far perdere tempo all’inizializzazione.
Eh no, in quanto il uC dopo 53 mS attiva il modulo di ricezione seriale interno. Quindi prima di quel tempo la seriale è completamente disattivata. Aggiungo che anche durante il deepsleep la seriale non accumula dati nel buffer.
Buondì,
no no, mi sono spiegato male.
I LoRa EByte E32 hanno un buffer proprio a prescindere da quello dell’esp32, in pratica possono memorizzare 256byte di dati senza intervento del microcontrollore, per poi essere disponibili alla prima lettura, in pratica è una coda FIFO.
Secondo me può essere che quando inizializzo la seriale dell’arduino svuoto la seriale dell’e32.
Ciao RM
Non comprendo una cosa.
Quando il uc è in modalità sleep , il modulo E220 è in modalità WOR. Ho notato con l’oscilloscopio che appena arriva un pacchetto il modulo E220 , abbassa la linea di AUX e trasmette via seriale dei dati….che suppongo siano quelli che ha ricevuto. Oppure no??
Mantenere un repository, un sito o un forum è come prendersi cura di un giardino - richiede costante attenzione e cura per farlo prosperare. Se sei un abile giardiniere (o programmatore!) e vuoi aiutarci a far fiorire il nostro sito, saremmo felici di averti nel nostro team! Cerchiamo anche scrittori talentuosi e moderatori per il nostro forum per aiutarci a far crescere la nostra comunità. Se sei interessato a unirti a noi, non esitare a contattarci per farci sapere in che modo puoi contribuire!
Sei un appassionato di elettronica o programmazione? Condividi la tua conoscenza con gli altri, scrivi un semplice tutorial o come fare un grande progetto Contattami. share_your_ideas@mischianti.org
The content displayed on this website is protected under a CC BY-NC-ND license. Visitors are prohibited from using, redistributing, or altering any content from this website for commercial purposes, including generating revenue through advertising. Any unauthorized use is a violation of the license terms and legal action may be taken against individuals or entities found to be in violation.
You must also provide the link to the source.
Per offrire le migliori esperienze, utilizziamo tecnologie come i cookie per memorizzare e/o accedere alle informazioni del dispositivo. Acconsentire a queste tecnologie ci permetterà di elaborare dati come il comportamento di navigazione o gli ID unici su questo sito. Non acconsentire o ritirare il consenso può influire negativamente su determinate funzionalità e funzioni.
Functional
Sempre attivo
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
Per offrire le migliori esperienze, utilizziamo tecnologie come i cookie per memorizzare e/o accedere alle informazioni del dispositivo. Acconsentire a queste tecnologie ci permetterà di elaborare dati come il comportamento di navigazione o gli ID unici su questo sito. Non acconsentire o ritirare il consenso può influire negativamente su determinate funzionalità e funzioni.
Functional
Sempre attivo
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.