Stocker dans une variable ce qui est affiché sur le Moniteur serie ?

Bonjour ! Comme beaucoup je suis en plein projet de fin d'étude, je suis en pleine réalisation d'un module de stationnement !!

Avant d'exposer ma question (qui m'a plutôt l'air bête..), j'vais plus ou moins exposer ce que j'ai déjà accompli (J'ai bien compris qu'on n'est pas à la pèche au solution ici :))

J'ai donc pour charge de réaliser un module de stationnement alimenté par batterie, et qui envoie les données récolté par Liaison HF dans un délai de 30 minutes.
Pour la partie capteur j'ai utilisé un capteur Ultrason, qui me paraissait être le plus fiable et aussi une grande solution de facilité, en effet dans l'utilisation cela marche, mais ça me complique pas mal au niveau du code!!

 digitalWrite(TRIGPIN, LOW); // Set the trigger pin to low for 2uS
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH); // Send a 10uS high to trigger ranging
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW); // Send pin low again
  int distance = pulseIn(ECHOPIN, HIGH,26000); // Read in times pulse
  distance = distance/58;                

  delay(2000);// Wait 50mS before next ranging
  
  if ((distance>3) && (distance<25))  {
        Serial.println("place occupé");
        uint8_t data[] = "Place1 occupé";
    rf95.send(data, sizeof(data));
   
    rf95.waitPacketSent();
        
        
    }
    else {
     Serial.println("place libre");
     uint8_t data[] = "Place1 libre";
    rf95.send(data, sizeof(data));
   
    rf95.waitPacketSent();
     
    }
 }

J'use donc de chaîne de caractère, puis envoie une autre chaîne de caractère similaire par Liaison HF. Cependant, je ne peux légalement envoyé de donnée par RF dans un délais qui est en dessous de 15 minutes, et il me paraîtrait insensé d'envoyé une seule mesure tout les 30 minutes..

J'aimerai donc savoir si c'était possible en langage C de "stocker" temporairement les quelque 8/10 mesures captée durant la demi heure, envoyé le tout, clear la variable et rebelote..

Merci !

C'est possible, il suffit d'utiliser un tableau et une variable qui compte les données stockées. Tu la remets à zéro lorsque tu veux réinitialiser. Pas besoin d'effacer le tableau, tu recommences à stocker au début du tableau

Salut

un tableau et une variable qui compte les données stockées

Attention, tableau et compteur en variable globale bien sûr ou static, pas comme dans ton code où data est locale.

@+

Merci pour vos réponse !!

J'ai regarder un peu et j'ai vu des notions d'index et de tableau, mais je comprends comment je pourrais "collecté" mes chaines de caractere en sortie :frowning:

Et je n'arrive pas a trouver de code exemple qui pourrait m'expliquer le procéder

if ((distance>3) && (distance<25))  {
        (Etatplace== LOW)
        Serial.println("1");
        Serial.println(Etatplace);
        
        uint8_t data[] = "Place1 occupé";
    rf95.send(data, sizeof(data));
   
    rf95.waitPacketSent();
        
        
    }
    else {
     Etatplace== HIGH)
     Serial.println("0");
     Serial.println(Etatplace);
     
     uint8_t data[] = "Place1 libre";
    rf95.send(data, sizeof(data));
   
    rf95.waitPacketSent();
     
    }
 }

J'ai un peu modifier mon code ducoup, afin d'eviter un maximum les chaines de caractère

Cela parait un peu mieux ?

hello
je n'ai pas lu ton post, mais j'ai aperçu :

(Etatplace== LOW) et plus loin (Etatplace== LOW)

je pense que tu devrais avoir un simple signe = et non un double signe ==

Merci bien de l'avoir remarqué !!

Ça résout déjà un de mes problème haha

hello
une autre , tu es sur que ton code compile ?

else {
Etatplace== HIGH)

il manque une "(" devant etatplace

C'est modifié merci !!!

Maintenant je me retrouve donc avec 2 valeurs tout ou rien, je vais donc pouvoir les collecté plus facilement ?

J'arrive toujours pas a comprendre le procédé de collecte de donnée :frowning:

D'abord :

if (distance>3 && distance<25)  {    // <-- modif ici
        Etatplace= LOW;  // <-- modif ici
        Serial.println("1");
        Serial.println(Etatplace);
        uint8_t data[] = "Place1 occupée";
        rf95.send(data, sizeof(data));
        rf95.waitPacketSent();  
    }  else {
       Etatplace= HIGH;  // <-- modif ici
       Serial.println("0");
       Serial.println(Etatplace);
       uint8_t data[] = "Place1 libre";
      rf95.send(data, sizeof(data));
      rf95.waitPacketSent();
    } 
 }

Ensuite, tu ne parles plus de ton problème initial, celui du stockage de données : est-il réglé (je ne vois rien ici qui le montre) ?

Enfin, je ne comprends pas ta question sur la collecte des données : de quelles données s'agit-il et qu'appelles-tu "collecte" ?

Je ne sais même pas a vrai dire si j'utilise les bons termes..

Je souhaiterai maintenant être capable de pouvoir envoyé un ensemble de donnée toute les 30 minutes, comme deja expliqué, en 30 minutes mon capteur aura le temps d'afficher 10 "1" ou "0" sur le moniteur serie, sauf que j'aimerai envoyé ces 10 valeurs en même temps par liaison HF et recommencer le processus avec 10 autres mesure sur 30minutes et ainsi de suite..

Tu utilises 'rf95' : c'est du LoRa ?
Moi je ne connais pas LoRa, dans ce cas, je ne peux pas t'aider.

Si d'autres le peuvent, il faut que tu donnes tous les détails, on ne peut pas les deviner !!!

La solution la plus simple à mon avis, puisque ton message sera une suite de 1 et de 0, serait de construire un chiffre en binaire qui assemble ces 1 et ces 0 et d'envoyer ce nombre en une fois. Le récepteur n'aurait plus qu'à décoder les 1 et les 0 pour connaitre l'ensemble du message.

Si c'est le cas, tu peux te renseigner sur le commande "<<" qui permet de décaler un ensemble de bits vers la gauche (en binaire ça correspond à une multiplication par 2).
Tu peux l'utiliser pour créer ton message binaire. Supposons que tu veuilles envoyer 5 valeurs, dans l'ordre 0 1 1 0 1. Ça te donnerait le message 01101 soit 13 en décimal.
On le stocke dans la variable M (comme message), qui est initialisée à 0.

  • 1ère étape : M = M + 0 (la première valeur)
  • 2ème étape : M = (M<<1)+1 -- ça donne M = 1
  • 3ème étape : M = (M<<1)+1 -- ça donne M = 3
  • 4ème étape : M = (M<<1)+0 -- ça donne M = 6
  • 5ème étape : M = (M<<1)+1 -- ça donne M = 13

Tu envoies le chiffre 13 et tu le décodes de la façon inverse, par exemple avec l'opérateur % (modulo).

Note que ton message peut monter jusqu'à la valeur 2^11-1 (c'est 10 fois le chiffre 1) soit 2047, ça rentre dans un int mais pas dans un byte (pour la déclaration de la variable M).

Yes c'est du LORA !

Ca me parait être une solution évidente, mais pas vraiment copain avec mon cahier des charges, lors de la reception, ce sont des variable claire et horodaté qui doivent être affiché..

J'ai pensé à un tableau, cela pourrait marcher ?

Je ne connais pas LoRa, je ne sais pas comment envoyer des tableaux

Merci pour l'aide déjà fournis !

Noflex:
ce sont des variable claire et horodaté qui doivent être affiché..

Il y a une différence entre affichage et communication. Si tu reçois ton mot de 10 bits, dont chaque bit correspond à une mesure de distance toutes les 30 minutes (je crois comprendre que tu utilises un capteur ultrasons orienté vers le haut, si une voiture est stationnée, le capteur la détecte, et si la mesure donne une hauteur trop élevée ou pas de mesure du tout c'est que la place est libre : correct ?), lorsque tu décodes ton mot bit par bit, tu peux afficher un message comme :

heure = heure_actuelle - 30 * 3600 * place_du_bit; // calcul de l'heure correspondant à la mesure traitée
if (bit == 0) {
Serial.print ("Place libre à ");
Serial.println (heure);
}
else
{
Serial.print ("Place occupée à ");
Serial.println (heure);
}

Bien sûr, il faudrait calculer et afficher l'heure convenablement, ce n'est qu'un exemple.

Merci bien, j'ai plutot bien compris l'exemple !

Cependant reste encore maintenant à pouvoir envoyé les 10bits en même temps

et si la mesure donne une hauteur trop élevée ou pas de mesure du tout c'est que la place est libre : correct ?), l

Bingo !

Tu n'envoies pas les bits mais la variable ont qui les contient. Ça dire pouvoir se faire avec LoRa

Oh je vois, et pour la variable, tu n'aurais pas un bout de code exemple pr que je comprenne comment les 10 valeurs vont etre stocké ?

Il suffit d'écrire ce que j'ai mis dans la réponse #11, dans une boucle.
Tu stokes tes 10 bits dans un tableau, une mesure toutes les 30 minutes, à la fin des 10 mesures, tu fais une boucle qui fais ce que j'ai dis dans le message #11 pour créer la variable à envoyer