Conversion de données

Bonjour à ceux qui me liront,
Je suis tout nouveau sur Arduino et je bloque sur une partie de projet.
En résumé :
J'ai monté un "module" type radio commande(TC) avec un nano et un kit RX/TX 433MHZ --> OK
J'ai monté un "module" récepteur avec un Uno et le même kit 433MHz -> OK
Cet ensemble fonctionne correctement.
La ou cela se corse, j'ai monté un afficheur 2 digits autour d'un Nano, un décodeur BCD/7 segments et deux afficheurs ceci fonctionne parfaitement à partir du moment ou je rentre un nombre dans le moniteur série à condition d'utiliser le code suivant:**

#include <SoftwareSerial.h>
SoftwareSerial UnoSerial(8,9);//RX,TX
// définition des broches du décodeur 7 segments
// (vous pouvez changer les numéros si vous voulez)
const int bit_A = 2;
const int bit_B = 3;
const int bit_C = 4;
const int bit_D = 5;

// définitions des broches des transistors pour chaque afficheur
const int alim_dizaine = 7; // les dizaines
const int alim_unite = 6;   // les unites

// variable pour l'affichage
bool afficheur = false;
long tempsaffichage = 0;
long tempscomptage = 0;
int valeur = 0;

int i=0;
const int BUFFER_SIZE = 50;
char buf[BUFFER_SIZE];

String inString = "";  // string to hold input


void setup()
{
    UnoSerial.begin(9600);
    Serial.begin(57600);
    // Les broches sont toutes des sorties
    pinMode(bit_A, OUTPUT);
    pinMode(bit_B, OUTPUT);
    pinMode(bit_C, OUTPUT);
    pinMode(bit_D, OUTPUT);
    pinMode(alim_dizaine, OUTPUT);
    pinMode(alim_unite, OUTPUT);

    // Les broches sont toutes mises à l'état bas
    digitalWrite(bit_A, LOW);
    digitalWrite(bit_B, LOW);
    digitalWrite(bit_C, LOW);
    digitalWrite(bit_D, LOW);
    digitalWrite(alim_dizaine, LOW);
    digitalWrite(alim_unite, LOW);
}

void loop()
{
    // gestion du rafraichissement
    // si ça fait plus de 10 ms qu'on affiche,
    // on change de 7 segments (alternance unité <-> dizaine)
    if((millis() - tempsaffichage) > 25)
    {
        // on inverse la valeur de "afficheur"
        // pour changer d'afficheur (unité ou dizaine)
        afficheur = !afficheur;
        // on affiche la valeur sur l'afficheur
        // afficheur : true->dizaines, false->unités
        afficher_nombre(valeur, afficheur);
        tempsaffichage = millis(); // on met à jour le temps
    }

    // ici, on peut traiter les évènements (bouton...)
    // Par exemple on incrément le compteur toutes les secondes
    if((millis() - tempscomptage) > 500)

                     
   
    while (UnoSerial.available() > 0) 
      {         
      int inChar =UnoSerial.read();     
      if  (isDigit(inChar))          
        {  
        // convert the incoming byte to a char and add it to the string:
         inString += (char)inChar;
        }
         // if you get a newline, print the string, then the string's value:
       if (inChar == '\n') 
       {       
         Serial.print("Value:");
         Serial.println(inString.toInt());
         Serial.print("String: ");
         Serial.println(inString);
         valeur = inString.toInt();             
         Serial.println(valeur);  
          // clear the string for new input:
         inString = "";           
             
        } 
        tempscomptage = millis(); // on met à jour le temps
              
    }
}

// fonction permettant d'afficher un nombre
// elle affiche soit les dizaines soit les unités
void afficher_nombre(char nombre, bool afficheur)
{
    char unite = 0, dizaine = 0;
    if(nombre > 9)
        dizaine = nombre / 10; // on recupere les dizaines
    unite = nombre - (dizaine*10); // on recupere les unités

    // si "
    if(afficheur)
    {
        // on affiche les dizaines
        digitalWrite(alim_unite, LOW);
        afficher(dizaine);
        digitalWrite(alim_dizaine, HIGH);
    }
    else // égal à : else if(!afficheur)
    {
        // on affiche les unités
        digitalWrite(alim_dizaine, LOW);
        afficher(unite);
        digitalWrite(alim_unite, HIGH);
    }
}

// fonction écrivant sur un seul afficheur
void afficher(char chiffre)
{
    digitalWrite(bit_A, LOW);
    digitalWrite(bit_B, LOW);
    digitalWrite(bit_C, LOW);
    digitalWrite(bit_D, LOW);

    if(chiffre >= 8)
    {
        digitalWrite(bit_D, HIGH);
        chiffre = chiffre - 8;
    }
    if(chiffre >= 4)
    {
        digitalWrite(bit_C, HIGH);
        chiffre = chiffre - 4;
    }
    if(chiffre >= 2)
    {
        digitalWrite(bit_B, HIGH);
        chiffre = chiffre - 2;
    }
    if(chiffre >= 1)
    {
        digitalWrite(bit_A, HIGH);
        chiffre = chiffre - 1;
    }
}

Ceci fonctionne je tape 15 et cela m'affiche 15.
Par contre ce module est destiné à être en liaison avec mon récepteur de façon à pouvoir afficher le code envoyé par la TC.
J'ai établi une liaison avec SoftWareSerial.
Celle ci fonctionne mais en fait le problème c'est que lorsque je lis les données reçues j'obtiens pour 15 -> 49 53 ce qui correspond aux valeurs ASCII du 1 et du 5.
Vous allez me dire c'est normal et je veux bien le croire.
En fait ce que je souhaite c'est transformer ce 4953 en 15 pour être exploité par mon afficheur.
J'ai beau chercher et j'avoue que je suis perdu avec toutes ces conversions.
Si quelqu'un pouvait m'aider ce serait sympa.
Merci d'avance.
Guy
PS : Si besoin d'infos sur le projet dites le moi.

Bonjour

Merci de ré-éditer le message ci dessus pour le mettre en conformité avec ce qui doit être consulté en arrivant sur le forum

  • écrire en caractères gras n'est pas recommandé

Le module peut etre...Ca peut etre utile!! :space_invader:

Sinon,voici un tableau de conversions:

Et il vient de: Envoyer et recevoir des données sur la voie série • Le blog d'Eskimon

C'est les blogs d'eskimons,dont un certains J-M-L est fan,le connaissant,il va surement faire son entrée ici prochainement :grin:

Conversion ASCII :voici un sujet qui peut aussi aider

Bonjour,
Désolé pour la présentation du message mais c'est la première fois que je poste.
Merci pour les premières réponses mais j'ai déjà regardé cela et je ne trouve pas de solution.
J'ai bien compris que je recevais mon code en caractères ASCII (4953 pour le code15).
Si je place un println après la lecture cela me renvoie deux lignes :

  • 49
  • 53
    Et mon décodeur attend 15.
    J'ai l'impression qu'il s'agit du read de la librairie sofwareserial qui ne renvoie de la même façon que le Serial.read.
    J'ai parcouru aussi le blog d'Eskimon et d'autres mais on y parle surtout de chaines de caractères pas de nombre.
    En attendant encore merci.
    Guy

Si tu veux convertir 49 en un 1, tu fais 49-48.
Ce qui pour 53, te donne 53-48 = 5.

Bonjour,
Merci, je l'avais trouvé celui là aussi et si je l'applique j'obtiens

  • 1
  • 5
    Moi j'attends 15
    Guy.

Si tu fais ce qui suit c'est normal

  Serial.println((char)49);
  Serial.println((char)53);

Peut être que si tu ne demandais pas d'afficher un retour à la ligne après ton texte/caractère
tu as essayé ça:

  Serial.print((char)49);
  Serial.println((char)53);

Tiens,pour convertir directement dans le code:Attention,ca a l'air compliqué
Utilise la fonction casting() directement dans le code pour convertir ton ascii en lettre

Voici un tuto:https://www.delftstack.com/fr/howto/java/java-ascii-to-char/#utilisez-charactertochars-pour-convertir-les-codes-ascii-en-caractères-en-java

C'est du java ton exemple :frowning: , mais c'est exactement ce qu'il fait avec inString.toInt()
Sa problématique est avant d'avoir concaténé son caractère dans un objet représentant une chaine.

Bonjour,
Je vous remercie pour vos recherches et idées.
J'ai résolu mon problème grâce à un post de JPBBricole sur Devellopez.com.
Je vous mets le bout de code que j'ai inclus dans mon module

```cpp
 
/*
    Name:       ARDDEV_Nounours18200.ino
    Created:	07.06.2021
    Author:     jpbbricole
*/
#include <SoftwareSerial.h>     // https://github.com/PaulStoffregen/SoftwareSerial
 
//------------------------------------- Liaison Master
SoftwareSerial btSerial(8, 9); // RX, TX
bool btCmdRecue = false;         // Si une nouvelle commande a été reçue
String btTexte = "";             // Texte de la commande
 
//------------------------------------- Ligne de commandes
bool cmdNouvelleRecue = false;      // Si une nouvelle commande a été reçue
String cmdTexte = "";               // Texte de la commande
 
void setup() 
{
	Serial.begin(57600);
	btSerial.begin(9600);
}
 
void loop()  
{
	//--------------------------------- Ecoute du port BT
	btSerialEvent();    
	if (btCmdRecue)      // Si une nouvelle commande depuis BT
	{
		//Serial.print(F("\nRecption Bluetooth "));
    Serial.println(btTexte);
		cmdExecute(btTexte);
 
		btTexte = "";
		btCmdRecue = false;
	}
	
}
 
/*---------------------------------------------------------------------------
	Execution de la ligne de commande
'*----------------------------------------------------------------------------
*/
void cmdExecute(String cmdRx)
{
	//Serial.print(F("Traitement de la commande "));
   Serial.println(cmdRx);
}
 
/*-----------------------------------------------------------------------
	Réception de commandes depuis Bluetooth
'*------------------------------------------------------------------------
*/
void btSerialEvent()                                       
{
	while (btSerial.available())
	{
		char monChar = (char)btSerial.read();     // Char received from IDE monitor
		if (monChar == '\n')                      // If new line char received = end of command line
		{
			btCmdRecue  = true;
		}
		else
		{
			if (monChar >= ' ') {btTexte += monChar;}     // >= ' ' to avoid not wanted ctrl char.
		}
	}
}

Mon afficheur fonctionne correctement maintenant.
A propos celui ci est basé sur un tuto d'Eskimon, merci à lui aussi.
@ bientôt,
Guy

Parfait!! Si ton projet est cool,poste le sur le forum!!! :star_struck: :star_struck:

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