Sigfox nic neodesílá po probuzení ESP32 z deep sleep

Odpovědět
Orsen95
Příspěvky: 25
Registrován: 17 bře 2018, 18:58
Reputation: 0

Sigfox nic neodesílá po probuzení ESP32 z deep sleep

Příspěvek od Orsen95 » 05 pro 2020, 15:06

Dobrý den,
potřebuji každých 15 minut bezdrátově odesílat hodnoty ze stanice na Sigfox. Stanice hned po připojení napájení pošle zprávu dobře, ale po probuzení ESP32 z deep sleep se nepošle nic.

Kód: Vybrat vše

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
#define uS_TO_S_FACTOR 1000000
#define TIME_TO_SLEEP 899 //v sekundách
Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {
  delay(500);
  
  sht31.begin(0x44); //sht31
  Serial.begin(9600); //PC
  Serial2.begin(9600);  //sigfox
  
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);  //nastavení deep sleep

  float t = sht31.readTemperature();  //načtení teploty a vlhkosti
  uint8_t h = sht31.readHumidity();

  uint8_t zprava[3];
  char hexBajt[3];
  int16_t teplota16 = t * 100;    //převedení

  memcpy(&zprava[0], &teplota16, 2);  //zkopírování do zprávy
  memcpy(&zprava[2], &h, 1);

 Serial.println(teplota16); 
  Serial.println(t);
 Serial.println(h);
 
   Serial2.print("AT$SF=");
  // Projde pole bajt po bajtu
  for (int i = 0; i < sizeof(zprava); i++) {
    // Pomoci funkce sprintf prevedu bajt na hexadecimalni zapis
     Serial.println(i);
    sprintf(hexBajt, "%02X", zprava[i]);
    // Poslu hexadecimalni podobu bajtu do modemu a pokracuji
    Serial2.print(hexBajt);
  }
  // uzavreni zpravy
  Serial2.print("\r");

Serial.println("odesláno");
  
  delay(500);
  
  esp_deep_sleep_start();

  Serial.print("chyba");
}

void loop() {
}

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Sigfox nic neodesílá po probuzení ESP32 z deep sleep

Příspěvek od pavel1tu » 05 pro 2020, 17:48

No a nebude to tím, že funkce setup() se vykoná jen jednou po zapnutí,
neměl by jsi mít program v loop() ?
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Orsen95
Příspěvky: 25
Registrován: 17 bře 2018, 18:58
Reputation: 0

Re: Sigfox nic neodesílá po probuzení ESP32 z deep sleep

Příspěvek od Orsen95 » 05 pro 2020, 21:04

pavel1tu píše:
05 pro 2020, 17:48
No a nebude to tím, že funkce setup() se vykoná jen jednou po zapnutí,
neměl by jsi mít program v loop() ?
děkuji za odpověď, do setupu jsem to dal kvůli tomu deep sleep, který udržuje v chodu jen hodiny, po určitém čase coprocesor resetuje esp a celý setup by měl proběhnout znovu.

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Sigfox nic neodesílá po probuzení ESP32 z deep sleep

Příspěvek od Caster » 05 pro 2020, 23:08

Myslím, že má @pavelitu pravdu, nastavení na začátku proběhne jen jednou a po probuzení program pokračuje v prázdné smyčce... ;) .

Orsen95
Příspěvky: 25
Registrován: 17 bře 2018, 18:58
Reputation: 0

Re: Sigfox nic neodesílá po probuzení ESP32 z deep sleep

Příspěvek od Orsen95 » 06 pro 2020, 10:27

Caster píše:
05 pro 2020, 23:08
Myslím, že má @pavelitu pravdu, nastavení na začátku proběhne jen jednou a po probuzení program pokračuje v prázdné smyčce... ;) .
Tak jsem to tedy vyzkoušel a ono to funguje :D. Jen mi není uplně jasné proč.
In Deep sleep mode, power is shut off to the entire chip except RTC module. So, any data that is not in the RTC recovery memory is lost, and the chip will thus restart with a reset.
https://lastminuteengineers.com/esp32-d ... p-sources/

Kód: Vybrat vše

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
#define uS_TO_S_FACTOR 1000000
#define TIME_TO_SLEEP 899
Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {
  delay(500);
  
  sht31.begin(0x44);
  Serial.begin(9600);
  Serial2.begin(9600);
  
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
}

void loop() {

  float t = sht31.readTemperature();
  uint8_t h = sht31.readHumidity();

  uint8_t zprava[3];
  char hexBajt[3];
  int16_t teplota16 = t * 100;

  memcpy(&zprava[0], &teplota16, 2);
  memcpy(&zprava[2], &h, 1);

 Serial.println(teplota16);
  Serial.println(t);
 Serial.println(h);
 
   Serial2.print("AT$SF=");
  // Projdu pole bajt po bajtu
  for (int i = 0; i < sizeof(zprava); i++) {
    // Pomoci funkce sprintf prevedu bajt na hexadecimalni zapis
     Serial.println(i);
    sprintf(hexBajt, "%02X", zprava[i]);
    // Poslu hexadecimalni podobu bajtu do modemu a pokracuji
    Serial2.print(hexBajt);
  }
  // uzavreni zpravy
  Serial2.print("\r");

Serial.println("odesláno");
  
  delay(500);
  
  esp_deep_sleep_start();

  Serial.print("chyba");
}

ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Reputation: 0
Kontaktovat uživatele:

Re: Sigfox nic neodesílá po probuzení ESP32 z deep sleep

Příspěvek od ArduXPP » 06 pro 2020, 10:51

V režimu deep sleep se data udržují v ram atd. Takže není potřeba znovu načtení setupu.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Sigfox nic neodesílá po probuzení ESP32 z deep sleep

Příspěvek od pavel1tu » 06 pro 2020, 18:44

ArduXPP píše:
06 pro 2020, 10:51
V režimu deep sleep se data udržují v ram atd. Takže není potřeba znovu načtení setupu.
Tak tak - restartu se vyhýbej - není potřeba - tedy většinou
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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

Re: Sigfox nic neodesílá po probuzení ESP32 z deep sleep

Příspěvek od martinius96 » 17 led 2021, 23:12

To je zvláštne, že to funguje takto...
Používam ESP32 v deep-sleep s Timer wake up funkciou z RandomNerdTutorials. pre môj projekt Hladinomer, kde odosielam dáta cez HTTP, prípadne HTTPS...

Celú programovú implementáciu mám v setupe(), loop() mám prázdny.
Po prebudení sa mi vykoná celý setup(), dáta sa odošlú každých 5 minút.

V tomto prípade so Sigfox modulom sa setup() nevykonal, lebo používal i loop(), lebo nevidím tam iný rozdiel, prečo by sa mu setup() nemal vykonať po wake z deep sleepu. U neho sa nevykoná Reset a pokračuje mu len loop()? Prečo? Vedel by mi to niekto bližšie vysvetliť, čo mi uniká? Prečo to jemu funguje inak ako mne a jemu prenos nefungoval? Má to spojitosť s tým UART rozhraním?

V programe označený koniec prvého behu setupu a následne SW reset.
Obrázek

Prog. implementácia na ukážku, ktorú používam:

Kód: Vybrat vše


#define uS_TO_S_FACTOR 1000000  /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  300        /* Time ESP32 will go to sleep (in seconds) */
#include <WiFi.h>
#include <NewPingESP8266.h>
#define pinTrigger    22
#define pinEcho       23
#define maxVzdialenost 450
NewPingESP8266 sonar(pinTrigger, pinEcho, maxVzdialenost);

const char * ssid = "SSID_NAME"; //meno wifi siete
const char * password = "SSID_PASSWORD"; //heslo na wifi siet
const char * host = "arduino.XXXX.eu"; //bez https a bez www

WiFiClient client;
void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password); //pripoj sa na wifi siet s heslom
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("Wifi pripojene s IP:");
  Serial.println(WiFi.localIP());
  int vzdialenost = sonar.ping_cm();
  delay(50);
  if (vzdialenost > 0) {
    vzdialenost = 0;
    for (int i = 0; i < 5; i++) {
      vzdialenost += sonar.ping_cm();
      delay(50);
    }
    vzdialenost = vzdialenost / 5;
    Serial.print("Vzdialenost medzi senzorom a predmetom je: ");
    Serial.print(vzdialenost);
    Serial.println(" cm.");
    String data = "hodnota=" + String(vzdialenost);
    String url = "/DIR/data.php";
    if (client.connect(host, 80)) {
      client.println("POST " + url + " HTTP/1.0");
      client.println("Host: " + (String)host);
      client.println("User-Agent: ESP32");
      client.println("Connection: close");
      client.println("Content-Type: application/x-www-form-urlencoded;");
      client.print("Content-Length: ");
      client.println(data.length());
      client.println();
      client.println(data);
      Serial.println("Data uspesne odoslane na web");
    } else {
      Serial.println("Pripojenie zlyhalo...");
    }
    client.stop();
  }
  else {
    Serial.println("Vzdialenost medzi predmetom a senzorom je mimo rozsah.");
  }
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) +
                 " Seconds");
  esp_deep_sleep_start();
}

void loop() {

}

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Sigfox nic neodesílá po probuzení ESP32 z deep sleep

Příspěvek od jankop » 18 led 2021, 10:16

Jediné vysvětlení je, že ESP32 nepřejde do DeepSleep, ale jenom do LightSleep. Pak zůstává RAM živá a program může pokračovat bez resetu. Je ho totiž možné budit i od vstupů nebo Serial. To lze parametrizovat. A jak mám zkušenosti, tak třeba ESP8266 si spoustu parametrů ukládá mimo standardní Flash. Možná při experimentech použil nějakou konfiguraci parametrů, nastavil LightSlep a ten tam zůstal. Jinak se to vysvětlit nedá.
https://docs.espressif.com/projects/esp ... modes.html

Odpovědět

Kdo je online

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