Envoyer chaine de caractère interface VB vers LCD

Dailyg038 Messages postés 21 Date d'inscription mercredi 22 janvier 2014 Statut Membre Dernière intervention 29 novembre 2016 - 25 nov. 2016 à 22:14
Dailyg038 Messages postés 21 Date d'inscription mercredi 22 janvier 2014 Statut Membre Dernière intervention 29 novembre 2016 - 29 nov. 2016 à 11:34
Salut,
J'aurai une question concernant mon projet,
Je me suis fait un petit Laser Game "maison" tout fonctionne comme je voulais, donc c'est parfait.
Maintenant je voudrais apporter quelques amélioration , la cible dispose d'un afficheur qui affiche le pseudo du joueur ainsi que les points, ont commencent avec 10.000 PTS chaque fois que la cible est touché ont décrémente de 500 PTS et un jeux de lumière à base de LED joue son rôle, une fois arriver à 0 la cible affiche Game Over.

Côté VB j'ai créé une interface qui me permet de discuter avec la cible donc l'Arduino (via le port série) sur le quel est monté l'afficheur.

Ce que je voudrais c'est pouvoir changer le pseudo directement depuis l'interface ce qui serais beaucoup plus pratique.

Pour cela j'ai pensé ajouter un TextBox avec un bouton pour valider mes je vois pas trop comment coder ça ? J'ai un peu de mal avec les chaînes de caractères... si c'est possible de m'éclairer un peu ??

Merci
++

9 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
Modifié par Whismeril le 26/11/2016 à 08:07
Bonjour

dans ma boule de cristal, je voie que tu dois ajouter un ; à la ligne 27 de ton code.

Sinon, si tu veux une réponse utile, il faut poster qui code lequel dialogue avec ton port série.

Voir ici comment poster un code lisible.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 26/11/2016 à 18:32
Bonjour Whismeril
Essuies ta boule de cristal !
Ce ne serait pas plutôt une parenthèse fermée qui manque
Je ne vois pas le rôle d"un point-virgule en VB Net
Bon weekend à toi
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
26 nov. 2016 à 19:07
Quite à donner une réponse inutile, autant provoquer un bogue!
0
Dailyg038 Messages postés 21 Date d'inscription mercredi 22 janvier 2014 Statut Membre Dernière intervention 29 novembre 2016
27 nov. 2016 à 14:36
voici le code coté VB
Public Class Form1

'Corp de la fenêtre, ici nous avons la TextBox1 avec fond rouge et couleur du texte Blanc.
'on centre le texte par default, et nous définissons le port "Fermé" à l'ouverture du programme.


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Text1.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Text1.BackColor = Color.Red
Text1.ForeColor = Color.White
Text1.TextAlign = HorizontalAlignment.Center
Text1.Text = "Port Fermé"
SerialPort1.Close()
SerialPort2.Close()
End Sub


'On crée un bouton de connexion sur le port série.

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Connect.Click
Text1.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
'Si le port est ouvert on crée un Scénario:
With SerialPort1
If .PortName = "COM4" Then
.BaudRate = 9600
.DataBits = 8
.Parity = IO.Ports.Parity.None
.StopBits = IO.Ports.StopBits.One
.Handshake = IO.Ports.Handshake.None
Text1.TextAlign = HorizontalAlignment.Center
Text1.ForeColor = Color.White
Text1.Text = "Port Ouvert"
Text1.BackColor = Color.Green
Else
Text1.BackColor = Color.Green
End If


'Configuration du port
End With
With SerialPort1
.PortName = "COM4"
.BaudRate = 9600
.DataBits = 8
.Parity = IO.Ports.Parity.None
.StopBits = IO.Ports.StopBits.One
.Handshake = IO.Ports.Handshake.None

End With
Try
'Ouverture du Port.
SerialPort1.Open()
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub

'Bouton On Pour allumer les LED.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btOn.Click
SerialPort1.Write("1")
SerialPort1.Write("2")
btOn.ForeColor = Color.Green
btOff.ForeColor = Color.Black

End Sub

'Bouton Off Eteindre les LED
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btOff.Click
SerialPort1.Write("0")
SerialPort1.Write("1")
btOff.ForeColor = Color.Red
btOn.ForeColor = Color.Black
End Sub

'Deconnexion du Port Serie
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Disconnect.Click
Text1.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
With SerialPort2
If .PortName = "COM4" Then
.BaudRate = 9600
.DataBits = 8
.Parity = IO.Ports.Parity.None
.StopBits = IO.Ports.StopBits.One
.Handshake = IO.Ports.Handshake.None
Text1.TextAlign = HorizontalAlignment.Center
Text1.ForeColor = Color.White
Text1.Text = "Port Fermé"
Text1.BackColor = Color.Red
btOff.ForeColor = Color.Black
btOn.ForeColor = Color.Black
Else
Text1.BackColor = Color.Red
btOff.ForeColor = Color.Black

End If
End With
Try
'Fermeture Du port Serie.
SerialPort1.Close()
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try

End Sub


Private Sub Text1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Text1.TextChanged
With SerialPort1
If .PortName = "COM4" Then
.BaudRate = 9600
.DataBits = 8
.Parity = IO.Ports.Parity.None
.StopBits = IO.Ports.StopBits.One
.Handshake = IO.Ports.Handshake.None
Text1.Text = "Port Ouvert"
Text1.TextAlign = HorizontalAlignment.Center
Text1.ForeColor = Color.White
Text1.BackColor = Color.Green
Else
Text1.BackColor = Color.Red

End If
End With


End Sub


Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

End Sub



Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click

End Sub


Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Orange.Click
Orange.BackColor = Color.Orange
End Sub

Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bleu.Click

End Sub

Private Sub Vert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Vert.Click

End Sub

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

End Sub

Private Sub validez_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles validez.Click

End Sub
End Class


et celui de l'arduino:
#include <LiquidCrystal.h> //ajout de la library LCD
LiquidCrystal lcd(12,11,4,5,6,7); //liaison 4 bits de données
int LED = 13;
int LED1 = 8;
int LED2 = 9;
int LED3 = 10;
int ledR1 = 2;
int ledR2 = 3;
int Afficheur = A1;
String pseudo = "Lilo"; //pseudo joueur.

int score = 500; //score de début partie.
int restart = 500; // score relance partie.

// Fonction setup(), appelée au démarrage de la carte Arduino
void setup()
{
// Initialise la communication avec le PC
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("***LASER GAME***");
lcd.setCursor(0,1);
lcd.print("****EVOLUTION***");
delay(4000);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(pseudo);
lcd.setCursor(5,1);
lcd.print(score);
pinMode(LED,OUTPUT); //on définie le pin de sortie "LED" pin 13 du Arduino
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(ledR1,OUTPUT);
pinMode(ledR2,OUTPUT);
pinMode(Afficheur,OUTPUT);

}
// Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
void loop()


{

// Mesure la tension sur la broche A0
int cibleAtteinte = analogRead(A0);
int LEDr1 = Serial.available();
int LEDr2 = Serial.available();
Serial.println(LEDr1);
Serial.println(LEDr2);


if (LEDr1)
{
int LEDr1 = Serial.read() - 48;
if (LEDr1 == 1)
{
digitalWrite(ledR1,HIGH);
}

if (LEDr1 == 0)
{
digitalWrite(ledR1,LOW);
}
}

if (LEDr2)
{
int LEDr2 = Serial.read() - 49;
if (LEDr2 == 1)
{
digitalWrite(ledR2,HIGH);
}

if (LEDr2 == 0)
{
digitalWrite(ledR2,LOW);
}
}





// Envoi la mesure au PC pour affichage
Serial.println(cibleAtteinte); //envoi la valeur comprise entre 0 et 1023 pour l'afficher au pc.

if(cibleAtteinte>900) // si la cible à été touchée ont décrémente le score sur l'afficheur.
{
score -= 500;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(pseudo);
lcd.setCursor(5,1);
lcd.print(score);

if(score <= 0) //signale la fin de partie.
{
lcd.clear();
lcd.setCursor(3,0);
lcd.print("GAME OVER");
digitalWrite(ledR1,HIGH);
digitalWrite(ledR2,HIGH);
digitalWrite(LED,HIGH);
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
delay(500);

digitalWrite(LED,LOW);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
digitalWrite(LED,HIGH);
delay(100);

digitalWrite(LED,LOW);
digitalWrite(LED1,HIGH);
delay(100);

digitalWrite(LED1,LOW);
digitalWrite(LED2,HIGH);
delay(100);

digitalWrite(LED2,LOW);
digitalWrite(LED3,HIGH);
delay(100);

digitalWrite(LED3,LOW);
delay(500);

digitalWrite(LED,HIGH);
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
delay(15000);

digitalWrite(ledR1,LOW);
digitalWrite(ledR2,LOW);
digitalWrite(LED,LOW);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
delay(250);

lcd.setCursor(0,0);
lcd.print("***LASER GAME***");
lcd.setCursor(0,1);
lcd.print("****EVOLUTION***");
delay(6000);

lcd.clear();
delay(250);
lcd.setCursor(3,0);
lcd.print(pseudo);
lcd.setCursor(5,1);
lcd.print(restart);


}
else
{
clignote(500,3000); // clignote avec 0.5s d'interval pendant 3s
clignote(100,3000); // clignote avec 0.1s d'interval pendant 10s
clignote(100,4000);
}

}

}
// un appel à cette fonction fera clignoter la led pendant "temps" temps (en millisecondes)
// l'interval de temps entre la diode allumée et éteinte est spécifié par "interval" (en millisecondes)
void clignote(unsigned int interval, unsigned int temps)
{
unsigned long debut_clignotement = millis(); // le temps (en ms) auquel on commence à clignoter
while(millis() - debut_clignotement < temps) // tant que le temps spécifié en paramètre ne s'est pas écoulé, on clignote à la vitesse spécifiée en paramètre
{
digitalWrite(LED,HIGH);
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);

delay(interval);

digitalWrite(LED,LOW);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
digitalWrite(LED,HIGH);
delay(100);

digitalWrite(LED,LOW);
digitalWrite(LED1,HIGH);
delay(100);

digitalWrite(LED1,LOW);
digitalWrite(LED2,HIGH);
delay(100);

digitalWrite(LED2,LOW);
digitalWrite(LED3,HIGH);
delay(100);

digitalWrite(LED3,LOW);
delay(interval);
}

}


Merci à vous !
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
Modifié par Whismeril le 27/11/2016 à 21:07
Bonsoir

coté Arduino, je ne saurais pas t'aider.
C'est du C ou du C++?


Coté VB, tu traites déjà une chaine de caractère.
        SerialPort1.Write("0")

Là tu envoies la chaine "0".

Donc, sit tu veux envoyer le contenu d'un textBox
        SerialPort1.Write(monTextBox.Text)




Y'a un certain nombre de trucs dans ton code que je ne comprends pas, voir mes commentaires
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Connect.Click
        Text1.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))'ça tu l'as déjà fait dans le Load, pourquoi le refaire ici?

        'Si le port est ouvert on crée un Scénario:
         'Non, tu ne regardes pas s'il est ouvert, mais s'il a un nom
        With SerialPort1
            If .PortName = "COM4" Then
                .BaudRate = 9600'ça tu lui redis en dessous même s'il n'a pas de nom
                .DataBits = 8'ça aussi
                .Parity = IO.Ports.Parity.None'ça aussi
                .StopBits = IO.Ports.StopBits.One'ça aussi
                .Handshake = IO.Ports.Handshake.None'ça aussi, reconfigurer sans cesse le port risque plus de couper les connexions et créer des bug qu'autre chose. Cette conf doit être faite une fois pour toute dans un bouton dédié par exemple, ou dans le load.
                Text1.TextAlign = HorizontalAlignment.Center
                Text1.ForeColor = Color.White
                Text1.Text = "Port Ouvert"
                Text1.BackColor = Color.Green

'et surtout,bien que tu crois que le port est ouvert, ensuite tu vas essayer de l'ouvrir à nouveau
            Else
                Text1.BackColor = Color.Green
            End If


            'Configuration du port
        End With


        With SerialPort1
            .PortName = "COM4"
            .BaudRate = 9600
            .DataBits = 8
            .Parity = IO.Ports.Parity.None
            .StopBits = IO.Ports.StopBits.One
            .Handshake = IO.Ports.Handshake.None

        End With
        
         Try
            'Ouverture du Port.'là tu essayes d'ouvrir le port, même si plus haut tu croyais qu'il l'était déjà, et quoiqu'il en soit, il a un nom
            SerialPort1.Open()
        Catch ex As Exception
            'si tu arrives là, le port n'est pas ouvert, mais il a un nom
            MessageBox.Show(ex.ToString)
        End Try
    End Sub


Dans un autre bouton, tu reconfigures encore le port, et le textbox de façon identique, ça ne sert à rien.
Ton textbox, c'est comme le port série, tu le configure une fois pour toute, dans le load, ou même directement dans la fenêtre Propriétés du mode Design.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
Dailyg038 Messages postés 21 Date d'inscription mercredi 22 janvier 2014 Statut Membre Dernière intervention 29 novembre 2016
27 nov. 2016 à 21:19
Merci pour ta réponse, côté arduino c'est du c mes je devrais me débrouiller
En faite c'est plus côté VB qui me bloque,
Si j'envoie une chaîne de caractère depuis mon interface, côté arduino je réceptionne des chiffres !

Moi ce que je veux c'est taper le pseudo du joueur dans la textbox1 et en cliquant sur le bouton "validez" le pseudo est envoyé à l'Arduino et il l'affiche sur mon afficheur LCD

c'est assez complexe ça fait plusieurs jour que je bloque sur ça !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
27 nov. 2016 à 22:49
côté arduino je réceptionne des chiffres !

ben oui, pourquoi t'as fait
int LEDr1 = Serial.read() - 48; 

Au hazard?
Ou alors parce que tu t'es aperçu que c'est le code ASCII de 0?
0
Dailyg038 Messages postés 21 Date d'inscription mercredi 22 janvier 2014 Statut Membre Dernière intervention 29 novembre 2016
28 nov. 2016 à 13:11
Si dans vb je fait
SerialPort.Write ("pseudo)


Ensuite côté arduino je réceptionne:

string pseudo = Serial.available();
Pseudo = Serial.read ();
Serial.println(pseudo);


Par exemple ce bout de code va m'afficher des chiffres !
Tu vois ce que je veux dire ??
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 nov. 2016 à 16:10
Oui, c'est normal.
As tu lu ma réponse précédente?
0
Dailyg038 Messages postés 21 Date d'inscription mercredi 22 janvier 2014 Statut Membre Dernière intervention 29 novembre 2016
28 nov. 2016 à 16:30
Oui j'ai lu ta réponse effectivement je reçois le code ASCII
Et du coup sans me mâché le travail quel serait la solution pour réceptionner les caractères et pouvoir les afficher ?
Desolé pour toute c'est questions mes je deviens dingue depuis quelques jours.
Merci à toi en tout cas
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 nov. 2016 à 23:28
En c je ne connais pas le code, ni la démarche exacte (y'a des variantes selon les langages), mais le principe en gros est de récupérer tous les bytes (sous forme d'un tableau probablement) et de les convertir en caractères, puis en chaine de caractères.

Comme il peut y avoir des chiffres dans un pseudo, tu peux choisir de marquer tes trames par un caractère de début et de fin, ou un caractère de début et le nombre de caractères qui suivent, ou encore utiliser un cheksum et bien sûr mélanger tout ça.
0
Dailyg038 Messages postés 21 Date d'inscription mercredi 22 janvier 2014 Statut Membre Dernière intervention 29 novembre 2016
29 nov. 2016 à 11:34
Un grand merci à toi je vais me débrouiller avec sa :)
0
Rejoignez-nous