Reboot interminable LilyGO TTGO OLED Lora32

Bonjour à tous, j'ai un problème avec ma carte LilyGO TTGO oled lora32.

Ref de la carte: T3 V1.6.1

Pinout:
7a9a0f0f-98ec-481d-b1ef-fcfa2913d6d2-image.png

Ma carte redémarre constamment. Je pense que c'est un problème de bibliothèque mais je n'arrive pas à trouver ?
Je dis ça car le code fonctionnait très bien jusqu'à ce que je change d'ordinateur et que je reprenne le code.

Voici le moniteur serie:

rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1288
load:0x40078000,len:13872
load:0x40080400,len:4
ho 8 tail 4 room 4
load:0x40080404,len:3048
entry 0x40080590
ets Jun  8 2016 00:22:57

J'ai téléchargé le code suivant et cela fonctionne très bien. Je n'ai pas de redémarrage avec ce code:

//words preceded by "//"" are comments and are not executed
bool ticktock;  //declare ticktock as a boolean flag

void setup() {           //runs once on start up
  Serial.begin(115200);  //open the serial port for USB cable
  delay(500);
}

void loop() {            //runs in circles!
  ticktock = !ticktock;  //every pass through reverse the flag
  if (ticktock) {        //test current value of the ticktock flag
    Serial.println("tick");
  } else {  //prints one or the other to the USB port
    Serial.println("tock");
  }
  delay(1000);  //wait for a second and run again!
}

Cependant, avec le code de ce site : TTGO LoRa32 SX1276 OLED with Arduino IDE | Random Nerd Tutorials , la carte redémarre tout le temps. Tout comme avec mon code.

Est ce que quelqu'un pourrait m'aider please ? :wink:

et quand la carte reboot elle dit quoi ?

Le moniteur affiche ça:

rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1288
load:0x40078000,len:13872
load:0x40080400,len:4
ho 8 tail 4 room 4
load:0x40080404,len:3048
entry 0x40080590
ets Jun  8 2016 00:22:57

et rien d'autre ?

avez vous bien choisi la bonne carte dans l'IDE ? la définition des cartes est-elle à jour ?

TG1WDT_SYS_RESET veut dire "Task Group 1 Watch dog Timer System Reset" ➜ c'est le watchdog qui n'est pas content.

cf ESP32 OTA reset with TG1WDT_SYS_RESET · Issue #158 · thingsboard/thingsboard-client-sdk · GitHub

Oui j'ai bien choisi la bonne carte et elle est à jour. Je pense que mon problème se situe au niveau de la librairie de l'afficheur OLED car dès que j'enlève tout ce qui concerne l'affichage, je n'ai plus de reboot.

Du coup je creuse encore. Ha oui effectivement peut-être que c'est le fait de faire tourner trop de tâche en même temps... Je te tiens au courant ! Merci.

quel est le code qui plante ?

Voici le code qui a fonctionné à merveille durant 1 an:

//VERSION FONCTIONNELLE AU 30/03/2023

//Ajout de l'envoi du counter.


#include <ArduinoJson.h>
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <SSD1306.h>


#define SCK     5    // GPIO5  -- SX1278's SCK
#define MISO    19   // GPIO19 -- SX1278's MISO
#define MOSI    27   // GPIO27 -- SX1278's MOSI
#define SS      18   // GPIO18 -- SX1278's CS
#define RST     14   // GPIO14 -- SX1278's RESET
#define DI0     26   // GPIO26 -- SX1278's IRQ(Interrupt Request)
#define BAND    8695E5

SSD1306 display(0x3c, 21, 22);
unsigned int compteur = 0;
unsigned int compteurE = 0;
String rssi = "RSSI --";
String packSize = "--";
String packet ;
String poids = "";
String tempINT = "";
String tempEXT = "";
String humEXT = "";
float data1R[7];
String NumRuche = "Numéro de ruche"; // Donnée de discrimination pour reconnaître les différentes ruches
String Data1 = "";
String Volts = "Tension";
int bouton = 0;
int etatbouton = 0;
long temps;
int memoirebouton;


void setup() {
  pinMode(bouton, INPUT);
  pinMode(16, OUTPUT);
  digitalWrite(16, LOW);    // set GPIO16 low to reset OLED
  delay(50);
  digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high、
  compteur = 0 ;
  temps = millis();
  Serial.begin(115200);
  while (!Serial);
  Serial.println();
  Serial.println("LoRa Receiver Callback");
  LoRa.setSpreadingFactor(10);
  SPI.begin(SCK, MISO, MOSI, SS);
  LoRa.setPins(SS, RST, DI0);
  if (!LoRa.begin(BAND)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  LoRa.setSpreadingFactor(10); // Facteur d'étalement 7 est la valeur par défaut. Permet de discriminer deux émissions
  LoRa.receive();
  Serial.println("init ok");
  display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_10);

  delay(1500);
}

void loop() {

  int packetSize = LoRa.parsePacket();
  if (packetSize) {   
      
    while (LoRa.available()) {
      //Serial.println("Paquets recus ");

      compteur++ ;
      //Serial.println(compteur);

      LoRa.readBytes((uint8_t *)&data1R, packetSize);
      Data1 += data1R[0]; //Lit les données l'une après l'autre (+=)
      Data1 = Data1.toFloat();
      NumRuche = data1R[0];
      tempINT = data1R[1];
      tempEXT = data1R[2];
      humEXT = data1R[3];
      compteurE = data1R[4];
      poids = data1R[5];
      Volts = data1R[6];
        /*   Serial.print("Tension :");
           Serial.println (Volts);
           Serial.print("Numero de ruche :");
           Serial.println (NumRuche);
           Serial.print("Température INT :");
           Serial.println (tempINT);
           Serial.print("Température EXT :");
           Serial.println (tempEXT);
           Serial.print("Humidite EXT :");
           Serial.println (humEXT);
           Serial.print("Poids :");
           Serial.println (poids);*/

      //Envoi en json                                                //Selon la video https://www.youtube.com/watch?v=nJ1wtUtcLfM
                                                                     //Verification de la trame avec: https://jsonlint.com/

      Serial.print("{\"Numruche\":");
      Serial.print(NumRuche);
      Serial.print(",\"Tension\":");
      Serial.print(Volts);
      Serial.print(",\"Temperature_INT\":");
      Serial.print(tempINT);
      Serial.print(",\"Temperature_EXT\":");
      Serial.print(tempEXT);
      Serial.print(",\"Humidite\":");
      Serial.print(humEXT);
      Serial.print(",\"CompteurE\":");
      Serial.print(compteurE);
      Serial.print(",\"CompteurR\":");
      Serial.print(compteur);
      Serial.print(",\"Poids\":");
      Serial.print(poids);
      Serial.println("}");
      
    }

  }
        //Gestion du bouton
      etatbouton = digitalRead(bouton);
      if (etatbouton == 0 || memoirebouton == 1 )
      {
        memoirebouton = 1;

        //Gestion de l'écran
        display.clear();
        display.setTextAlignment(TEXT_ALIGN_LEFT);
        display.setFont(ArialMT_Plain_10);

        display.drawString(0, 0, "Numero de ruche :");
        display.drawString(90, 0, String(NumRuche));
        display.drawString(0, 15, "Tint/ext: ");
        display.drawString(90, 15, String(tempINT));
        display.drawString(45, 15, String(tempEXT));
        display.drawString(0, 30, "Humidite EXT: ");
        display.drawString(90, 30, String(humEXT));
        display.drawString(0, 45, "Poids: ");
        display.drawString(90, 45, String(poids));
        display.display();
      }
      if ((millis() - temps) > 300000) // 5 min
        {
          memoirebouton = 0;
          display.clear();
          display.display();
          temps = millis();
        }
   
   
}

donc ceci n'est donc pas vu dans la console ?


vous devriez vérifier la taille de packetSize, si ce n'est pas 7 vous avez un souci...

Pour m'affranchir de ça, j'ai balancé un exemple de scetch LORA disponible dans la bibliothèque.

Je ne sais pas si mon soucis provient du code.

J'ai téléverser ce code pour essayer:

#include <SPI.h>
#include <LoRa.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("LoRa Receiver");

  if (!LoRa.begin(915E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}

void loop() {
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    // received a packet
    Serial.print("Received packet '");

    // read packet
    while (LoRa.available()) {
      Serial.print((char)LoRa.read());
    }

    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
  }
}

Et voila le monitor :

Tu penses pas que j'ai une bibliothèques foireuse ou un réglage PC qui fait que lance un téléchargement corrompu ?

Il n'y a que toi qui sait ce qu'il y a sur ta carte et si tu as bien chargé une librairie compatible.

Pendant le téléchargement, le PC dialogue avec la carte.
Est-ce que tu as un message d'erreur dans la console de l'IDE indiquant que le téléchargement a échoué?

Oui effectivement j'ai ça en erreur au début du téléversement:

c:\Users\LABAT\OneDrive\Documents\Arduino\libraries\LoRa\src\LoRa.cpp: In member function 'long int LoRaClass::packetFrequencyError()':
c:\Users\LABAT\OneDrive\Documents\Arduino\libraries\LoRa\src\LoRa.cpp:277:71: warning: 'B111' is deprecated: use 0b111 instead [-Wdeprecated-declarations]
  277 |   freqError = static_cast<int32_t>(readRegister(REG_FREQ_ERROR_MSB) & B111);
      |                                                                       ^~~~
In file included from C:\Users\LABAT\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.2\cores\esp32/Arduino.h:41,
                 from c:\Users\LABAT\OneDrive\Documents\Arduino\libraries\LoRa\src/LoRa.h:7,
                 from c:\Users\LABAT\OneDrive\Documents\Arduino\libraries\LoRa\src\LoRa.cpp:4:
C:\Users\LABAT\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.2\cores\esp32/binary.h:86:3: note: declared here
   86 |   B111 DEPRECATED(0b111) = 7,
      |   ^~~~
c:\Users\LABAT\OneDrive\Documents\Arduino\libraries\LoRa\src\LoRa.cpp:283:42: warning: 'B1000' is deprecated: use 0b1000 instead [-Wdeprecated-declarations]
  283 |   if (readRegister(REG_FREQ_ERROR_MSB) & B1000) { // Sign bit is on
      |                                          ^~~~~
C:\Users\LABAT\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.2\cores\esp32/binary.h:92:3: note: declared here
   92 |   B1000 DEPRECATED(0b1000) = 8,
      |   ^~~~~

si ce sont juste ces warnings, ce n'est pas grave

vu que l'exemple de base ne fonctionne pas, ce n'est pas la peine d'aller plus loin pour le moment

le LILYGO TTGO LoRa32 doit avoir une bibliothèque spécifique pour gérer le LoRa. Vous avez cherché ?

sur Amazon j'ai vu

En savoir plus

Automatic frequency correction Automatic gain control
wake-up and frequency hopping Highly configurable data packet handler
SMA Antenna TP4054
Paxcounter Testing GitHub - cyberman54/ESP32-Paxcounter: Wifi & BLE driven passenger flow metering with cheap ESP32 boards
Github GitHub - LilyGO/ESP32-Paxcounter: Wifi & BLE driven passenger flow metering with cheap ESP32 boards
Github GitHub - Xinyuan-LilyGO/TTGO-LoRa-Series: TTGO Lora Test code

Oui j'ai essayé toute les bibliothèques... Je vais essayer d'installer Ariduino ide sur un autre PC pour voir.

Bonjour biker32,

As-tu trouvé une solution à ton problème ?

Je ne suis pas expert, mais j'ai un projet en cours qui utilise une bibliothèque LoRa. J'avais un problème de reboot intempestif et j’ai finit par trouver la source avec la bibliothèque que j’utilise : Il semble que lorsque qu’un message arrive, il déclenche une interruption qui appelle la callback déclarée préalablement.
Si l’exécution de la callback est trop longue, le watch dog se plein et reboot la plaque.
Dans ma callback, je me contente donc de mettre a true une variable, puis, dans la loop, je lis cette variable pour savoir si j’ai un message et je fais sa lecture.

Les sorties sur Serial son particulièrement lentes.

J’espère que cela pourra servir a quelqu’un.

C’est un peu plus compliqué que cela parce qu’un un appel à print ou write sur Serial est généralement hyper rapide puisque cela ne consiste qu’à copier ce qu’il faut imprimer dans un buffer mémoire qui ensuite est émis de manière asynchrone et donc ça n’empêche généralement pas votre code d’avancer et c’est rapide.

Là où ça se complique c’est que si le buffer de sortie est plein alors la fonction print() bloque jusqu’à ce qu’il y ait de la place, ce qui veut dire qu’il faut que suffisamment d’octets présents dans le buffer aient été émis.

Hors l’UART fait son job d’émission asynchrone par le biais d’interruptions. Donc si vous faites un print dans un contexte déjà d’interruption ou potentiellement les nouvelles interruptions sont bloquées l’UART une fois qu’elle aura émis un octet en tâche de fond va lever une interruption qui ne sera pas vue puisque le code principal est bloqué dans ce contexte où les interruptions sont désactivées…. On est alors coincé là.

Arduino s’est rendu compte que c’était un bug fréquent des débutants et donc a modifié la procédure d’émission dans le cas où les interruptions sont désactivées pour émettre plus d’octets de manière synchrone tant que le buffer n’est pas suffisamment vidé (sans utiliser les interruptions donc, par attente active sur les registres d’états de l’UART).

C’est dans ce cas que l’impression devient lente puisque synchronisée sur le débit en bauds retenu.

C’est pour cela que l’on recommande très fortement de ne pas utiliser l’impression dans un contexte d’interruption.

Concernant le traitement d’une interruption qui dit qu’un message LoRa est dispo, il faut copier le message (le sortir du buffer LoRa) dans le code du callback parce qu’on n’est pas sûr qu’une fois revenu à la loop le module Lora ne sera pas encore en train de recevoir un autre message et d’utiliser son buffer. Il faut considérer que l’accès à ce buffer n’est valide que dans le contexte de l’interruption. Donc on le copie et on met un drapeau (une variable booléenne volatile ou mieux en utilisant un mutex/sémaphore) pour effectivement traiter le message plus tard dans la loop.

Dans un environnement où le traitement des messages peut être long par rapport à des salves de messages il faut que l’interruption rajoute le message dans une queue qui sera dépilée par la loop car on pourrait avoir plusieurs messages qui arrivent pendant qu’on en traite un. Il ne faut pas dans ce cas que la procédure d’interruption vienne modifier le buffer du message sur lequel votre code principal bosse…

Bref - attention à tout ce qui est parallélisme et contextes partagés

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.