Icône force de signal dessiné facilement

Bonjour,

Je suis en tain de me faire un petit GPS de rando et j'aimerais afficher la quantité de satellite reçus sur l'écran, sous forme d'une icône comme sur les téléphones portables :

J'ai réussi à coder cette affichage sans problème et lorsque le nombre de satellite change, mon icône suit sans soucis.
Mais ce code me prend une petite quarantaine de lignes et j’aimerais le diminuer (je travaille avec un Pro Mini 5V 16MHz) pour être sur d'avoir assez d'espace en mémoire pour finir le projet.

Donc lorsqu'il le GPS reçoit des satellites, il affiche l'antenne (qui fait aussi office de première barre = 1 ou 2 satellites reçus) et les autres barres en fonction du nombre de satellites, sachant que mon récepteur GPS peut recevoir 12 satellites en même temps, j'ai opté pour 6 barres : 1 barre = 2 satellites reçus.

S'il ne reçoit pas les 12 satellites, les barres disparaissent mais un point reste au "pied" de la barre pour avoir un aperçu rapide de la proportion de réception.

Lorsque je n'ai aucune réception, une croix s'affiche et les points bas de chaque barres aussi.

Pour minimiser le code j'ai essayé de faire deux boucles for.

La première :

for (int g = 0; g <= NbSat; g = g + 2) {
      display.drawPixel(colonne + g, 6, BLACK);
}

Cette boucle me permet déjà d'afficher les points bas de chaque barres, c'est déjà pas mal :wink:
Mais le plus compliqué reste à venir. Afficher le reste des barres (hauteur des barres proportionnelle à leurs position > première barre = 1 pixel de haut, deuxième barre = 2 pixels de haut, ...).

J'ai donc essayé d'implanter une deuxième boucle for dans la première mais sans succès.

Auriez vous une idée du calcul à faire ?

Cette méthode, si elle peut marcher, me permettrait d'économiser un paquet de ligne de code....

Merci d'avoir lu ce pâté ! :slight_smile:
Et merci de votre future aide...

Si j'ai bien compris, tu fais du drawPixel() et drawLine(). Pourquoi ne fais-tu pas un bitmap de tes deux images, cela ferait ( 3 + 8 ) x 13 = 143 octets de mémoire flash. Après, selon le cas (switch ... case) tu fais un drawBitmap() en sélectionnant la région voulue.

Par ailleurs, tu dis utiliser un Pro Mini à 5V d'alim, il va te falloir une batterie de cette tension, voire un peu plus.

Il existe une version en 3.3 V qui peut être utilisé à partir d'une batterie de 3.7 V.

J'ai réalisé un tel GPS, si cela peut t'aider.

Cordialement.

Pierre

Avec des boucles, je partirais là-dessus:
Une image de base, qui correspond aux points de base des six colonnes utilisées.
Dans le cas de la première colonne, une "fonction" dédiée. C'est à dire un test, et l'affichage de la petite croix, ou de l'antenne.

Pour la boucle, je ferais un truc comme ça:

int nb_sat = n; //n à définir en fonction du nombre effectif de satellites.
int origin_x = 5 //origin_x et _y: coordonnée du pixel de la base de la première colonne.
int origin_y = 8

//Il convient probablement de nettoyer (effacer) l'afficheur avant de le mettre à jour.
//On commence par balayer chaque colonne, en fonction du nombre de satellites
//La colonne 0 est passée, puisque gérée particulièrement (antenne/croix)
for (int i = 1; i < nb_sat / 2; i++){
    //Puis pour chacune de ces colonnes, on affiche le point de base, puis on remonte autant de ligne que nécessaire
    for (int j = 0; j < i; j++){
        setPix(origin_x + 2 * i, origin_y - j); //Je ne sais pas quelle est le nom de la fonction, mais setPix est explicite!
    }
}

Bonsoir Pierre et troisiemetype,

merci pour vos réponses.

@Pierre
Merci beaucoup pour la fonction drawLine, je ne connais pas encore bien cette librairie et j'étais passé dessus sans y faire attention. Ça va m’économiser un paquet de ligne de code...

J'étais tombé sur ton projet de GPS, très intéressant, je reviendrais certainement vers toi pour l'histoire des menus, que je trouve compliqués à mettre en oeuvre...

@TroisiemeType
Merci pour les boucles for...
Voici le code adapté :

  for (int i = 1; i < NbSat / 2; i++) {
    //Puis pour chacune de ces colonnes, on affiche le point de base, puis on remonte autant de ligne que nécessaire
    for (int j = 0; j-1 < i; j++) {
      display.drawPixel(colonne + 2 * i, ligne - j, BLACK);
    }
  }

Elles correspondent à ce que je cherchais. Par contre à 5 satellites je n'ai que l'antenne et un barre d'affichée... or je devrais avoir deux barres. Je continue à chercher. Merci.

@ Pierre : Et effectivement pour la version 3.3V, j'y ai pensé. Pour l'instant je n'ai que le 5V sous la main et tout est monté sur plaqué d'essais à points. Mais la version finale sera avec le modèle 3.3V.
Pour ce qui est des BitMap je n'ai pas encore découvert cette fonction. Mais la fonction de troisiemetype me va bien est utilise peu de code.

for ([color=red]int i = 1[/color]; i < NbSat / 2; i++) {
    //Puis pour chacune de ces colonnes, on affiche le point de base, puis on remonte autant de ligne que nécessaire
    for (int j = 0; j-1 < i; j++) {
      display.drawPixel(colonne + 2 * i, ligne - j, BLACK);
    }
  }

Par contre à 5 satellites je n'ai que l'antenne et un barre d'affichée... or je devrais avoir deux barres. Je continue à chercher. Merci.

c'est parce que vous commencez avec i=1

quand vous avez 5 satellites, NbSat / 2 vaut 2 votre boucle dit donc:

pour i = 1 jusqu'à i<2 (donc pas d'itération puisque strictement inférieur)

donc normal d'avoir l'antenne (compte pour 2 satellites) puis une barre = 2 autres. mais comme vous n'en n'avez pas 6 pas de troisième barre

Voilà qui va mieux :

    for (int i = 0; i < (NbSat / 2) + 1 ; i++) {
      for (int j = 0; j - 1 < i ; j++) {
        display.drawPixel(colonne + 2 * i, ligne - j, BLACK);
      }
    }

Merci de votre aide.