oui c'est bien ici et bon point pour avoir mis les balises de code.
le code se lit correctement.
Quelques remarques:
tout ce qui concerne le temps doit être en unsigned long ➜
unsigned long lastTime = 0;
unsigned long lastReading = 0;
donnez des noms "parlants" aux variables globales.
char i = 0;
ici il s'agit de la position dans le buffer de réception du lidar, appelez le rxIndex
ou rxLidarIndex
par exemple. ce sera plus simple à suivre
de plus comme il n'est utilisé que dans le fonction readLIDAR() vous pourriez le déclarer comme une variable statique de cette fonction et le type habituel pour un index est size_t ou quand on sait qu'il est petit, on peut prendre un byte
int readLIDAR(void)
{
static byte rxLidarIndex = 0;
int distance = 0;
...
Ne faites pas les maths 2 fois, ça ralentit pour rien:
Serial.print("Distance=");
Serial.print(rx_buf[3] * 256 + rx_buf[2]);
Serial.print(";");
Serial.print("Strength=");
Serial.print(rx_buf[5] * 256 + rx_buf[4]);
distance = rx_buf[3] * 256 + rx_buf[2];
pour économiser de la SRAM, mettez tous les textes imprimés en utilisant la macro F("") qui va ranger le texte en mémoire flash. par exemple
Serial.print(F("readLidar Terminé"));
pas la peine d'appeler wdt_reset()
en début de loop. Si vous êtes revenu là c'est que vous êtes passé juste avant par le main()
qui fait ce qu'il faut. On fait plutôt cela en cours de route si une opération est longue et bloque la loop() trop longtemps
vous faites
newDistance = readLIDAR(); //Go get distance in cm
avec newDistance
qui est un float mais la fonction retourne un int. Si vous pouvez éviter les calculs en virgule flottante le code sera plus efficace.
ce commentaire n'est pas clair. mettez plutôt la formule qui explique
//22.36936 comes from a big coversion from cm per 50ms to mile per hour
1 cm / 50ms <=> 72000 cm/h <=> 0.720 km / h <=> 0.720 / 1,60934 mile/h <=> 0,4473883704 mile/h
On en prend la moitié pour compter que le signal a fait un aller retour
0,4473883704 / 2 = 0,2236941852
expliquez pourquoi vous le multipliez par 100
petFriendlyDelay()
ni averageAnalogRead()
ne sont pas appelées, autant les virer du code
accessoirement, enableLIDAR()
est appelée plusieurs fois mais jamais disableLIDAR()
tous les print des debugs pourraient être mis en optionnel en utilisant une macro. J'utilise souvent ceci
#define DEBUG 1 // SET TO 0 OUT TO REMOVE TRACES
#if DEBUG
#define D_SerialBegin(...) Serial.begin(__VA_ARGS__);
#define D_print(...) Serial.print(__VA_ARGS__)
#define D_write(...) Serial.print(__VA_ARGS__)
#define D_println(...) Serial.println(__VA_ARGS__)
#else
#define D_SerialBegin(bauds)
#define D_print(...)
#define D_write(...)
#define D_println(...)
#endif
au lieu de faire
Serial.print("0x");
Serial.print(rx_buf[i], HEX);
Serial.print(";");
vous écrivez
D_print("0x");
D_print(rx_buf[i], HEX);
D_print(";");
et si vous changez le niveau de debug à 0
#define DEBUG 0
alors toutes les impressions vont être virées du code ce qui fait gagner du temps et de la mémoire
je ne suis pas sûr que la gestion du watchdog soit nécessaire.
voilà quelques pistes