Bonjour Thierry,
Tout d'abord MERCI pour la création et le PARTAGE de ce merveilleux duo, Accessories et Commanders, qui nous facilite grandement la programmation de nos petits Arduino !
C'est en USANT et ABUSANT de tes deux bibliothèques que je me suis retrouvé dans des cas ou mon arduino NANO et arduino PRO avaient des comportements erratiques allant parfois jusqu'au RESET.
Voici le .ino pour le test d'un bouton poussoir et d'un relais:
#include <Commanders.h>
#include <Accessories.h>
const int buttonPin = 3; // broche du poussoir
ButtonsCommanderPush Bouton;
PortOnePin Port;
AccessoryLight Relais;
void ReceiveEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEventType, int inEventData)
{
Accessories::ReceiveEvent(inId, (ACCESSORIES_EVENT_TYPE)inEventType, inEventData);
}
void setup()
{
Serial.begin(115200); // console ARDUINO PC
Commanders::begin(ReceiveEvent);
Accessories::begin();
Bouton.begin(100, buttonPin);
Port.begin(4, DIGITAL_INVERTED);
Relais.begin(&Port, 100);
PRINT_COMMANDERS()
PRINT_ACCESSORIES
}
void loop(void)
{
Commanders::loop();
Accessories::loop();
}
Après avoir activé les modes debug des bibliothèques, ainsi qu'ajouté beaucoups de print supplémentaires dans le fichier Accessory.cpp, voici ce que j'ai remarqué:
L'affichage de multiples "Debounce : Cant move !" et puis parfois un RESET !
Console:
Opening port
Port open
Commanders V1.60.0
Created by Thierry Paris.
(c) Locoduino 2016-2018
*** Setup Commanders started.
Accessories V1.1.1
Developed by Thierry Paris.
(c) Locoduino 2016-2018
*** Setup Accessories started.
AccessoryBaseLight OFF
AccessoryBaseLight SetState OFF
********* Commanders List
Commander: ButtonsCommander
Push - Pin :3
Event Id: 100 / Event type: MOVEPOSITIONID
********* End of List
********* Accessories List
Light : ID 100 / Fading Step: 0 / Fading Delay: 0 / Blinking Delay: 0 / [PortOnePin pin: 4 (DIGITAL_INVERTED)]
********* End of Accessories
*** Setup Commanders Finished.
*** Setup Accessories Finished.
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:65
Stack size:47
Free ram:1383
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:65
Stack size:47
Free ram:1383
Accessory id 100, Event 5, Data 0 Action ADD event **************************
ButtonsCommanderButton id:100 selected !
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:75
Stack size:28
Free ram:1392
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:75
Stack size:28
Free ram:1392
Accessory id 100, Event 5, Data 0 Action ADD event **************************
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:85
Stack size:28
Free ram:1382
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:85
Stack size:28
Free ram:1382
... après une longue série .... la fin de l'affichage ... où l'on voit que la RAM dispo = 132 octets !!
Accessory id 100, Event 5, Data 0 Action ADD event **************************
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:1335
Stack size:28
Free ram:132
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:1335
Stack size:28
Free ram:132
Accessory id 5, Event 5, Data 0 Action ADD event **************************
On remarque la grande valeur de GetDebounceDelay 58855, valeur que nulle part je ne trouve et que je n'ai pas initialisée.
J'ai fait un affichage de la SRAM libre, et elle diminuait après chaque affichage de "Debounce : Cant move !" se soldant parfois par un RESET.
Le message "Debounce : Cant move" ce situe dans le fichier accessory.cpp dont un extrait ci-dessous:
bool Accessory::IsMovementPending()
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.print(F("GetLastMoveTime : "));
Serial.print(GetLastMoveTime());
Serial.print(F("\tGetDebounceDelay : "));
Serial.println(GetDebounceDelay());
MEMORY_PRINT_HEAPSIZE
MEMORY_PRINT_STACKSIZE
MEMORY_PRINT_FREERAM
#endif
if (this->IsActionDelayPending())
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.println(F("ActionPending : Cant move !"));
#endif
return true;
}
if (millis() - this->GetLastMoveTime() <= this->GetDebounceDelay())
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.println(F("Debounce : Cant move ! ++++++++++++++++++++++++++"));
Serial.print(F("GetLastMoveTime : "));
Serial.print(GetLastMoveTime());
Serial.print(F(", GetDebounceDelay : "));
Serial.println(GetDebounceDelay());
MEMORY_PRINT_HEAPSIZE
MEMORY_PRINT_STACKSIZE
MEMORY_PRINT_FREERAM
#endif
return true;
}
this->SetLastMoveTime();
return false;
}
La conséquence de la très grande valeur (58855 ici) retournée par GetDebounceDelay(), fera que le code ci-dessous retournera TRUE
if (millis() - this->GetLastMoveTime() <= this->GetDebounceDelay())
{
return true;
}
La fonction Accessory::IsMovementPending(), est appelée par:
void Accessory::ExecuteEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent, int inData)
{
Accessory *acc = GetById(inId);
if (acc != NULL)
{
if (acc->IsMovementPending() || (ActionsStack::FillingStack && inEvent != ACCESSORIES_EVENT_EXTERNALMOVE))
{
ActionsStack::Actions.Add(inId, inEvent, inData);
#ifdef ACCESSORIES_DEBUG_MODE
Serial.print(F("Accessory id "));
Serial.print(inId);
Serial.print(F(", Event "));
Serial.print(inEvent);
Serial.print(F(", Data "));
Serial.print(inData);
Serial.println(F(" Action ADD event **************************"));
#endif
return;
}
if (inEvent == ACCESSORIES_EVENT_MOVEPOSITIONINDEX && (inData < 0 || inData >= acc->GetMovingPositionSize()))
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.print(F("Accessory id "));
Serial.print(inId);
Serial.print(F(" bad MovePositionIndex event "));
Serial.println(inData);
#endif
return;
}
acc->Event(inId, inEvent, inData);
}
}
D'après ce que je comprends, le retour TRUE de IsMovementPending() va appeler ActionsStack::Actions.Add(inId, inEvent, inData);
c'est cette dernière qui va consommer de la RAM .....
Bref, j'ai testé
l'initialisation de debounceDelay=50 dans le constructeur de Accessory et là, plus de RESET, plus de consommmation de la SRAM, et plus de message Cant move !!!!
Il semblerai que debounceDelay prenait "ce qu'il trouvait" en SRAM après l'allumage du NANO ou le upload d'un nouveau programme.
Je joins les copies du moniteur série, ainsi que le fichier Accessory.cpp pour montrer où j'ai inséré les print qui ont permis cet affichage.
J'espère ne pas être trop à côté de la plaque dans les"explications" que j'ai trouvé à mon problème ! Et je fais confiance à Thierry pour me le dire très franchement
car il s'agit peut-être tout simplement que je ne sais pas utiliser la bibliothèque !
Toutes mes amitiés à l'équipe de Locoduino qui, on ne se lasse pas de le dire, fait un remarquable travail.
Cyrille