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.