Problème sur le contrôle d'un LCD.

Bonjour à tous,

Merci d'avance pour l'intêret que vous allez portez à ce post.
Comme je l'ai déjà préciser sur mon premier post sur ce forum, je cherche à contrôler un LCD (muni d'un S1D13700) à distance. J'ai donc tout d'abord contrôllé au Minima le LCD avec un Arduino Uno. j'ai ensuite créé une liaison série entre l'Arduino et un Pi tout d'abord très simpliste. On m'a ensuite demandé (je suis en stage) de trouvé un moyen d'envoyer les donnée de contrôle du PC jusqu'à l'Arduino. J'ai donc créer un serveur python qui s'occupe de gérer toute cette partie. Le problème est que maintenant je dois modifier mon programme Arduino pour répondre totalement aux cahier des charges.
Je vous met tout d'abord mes codes:

code python:

import socket
import serial
	

hote = ''
port = 3001

connexion_principale = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connexion_principale.bind((hote, port))
connexion_principale.listen(2)
print("Le serveur ecoute a present sur le port {}".format(port))
connexion_avec_client, infos_connexion = connexion_principale.accept()
msg_recu = b""
while msg_recu != b"fin":	
	ser = serial.Serial('/dev/ttyACM0', 9600)
	print("La connection Arduino Pi est realise")	
	msg_recu = connexion_avec_client.recv(1024)
	choix = msg_recu[0:2]
	texte = msg_recu[2:]
	if choix == ('H.'):
		ser.write('H.')
		print(msg_recu)
	elif choix == ('B.'):
		ser.write('B.')
		print(msg_recu)
	elif choix == ('G.'):
		ser.write('G.')
		print(msg_recu)
	elif choix == ('D.'):
		ser.write('D.')
		print(msg_recu)
	elif choix == ('R.'):
		ser.write('R.')
		print(msg_recu)
	elif choix == ('Q.'):
		sys.exit(6)
		print(msg_recu)
	elif choix == ('T.'):
		ser.write(texte)
		print(msg_recu)			
	print(msg_recu.decode())
	connexion_avec_client.send(b"connection reussi")

print("Fermeture de la connexion")
connexion_avec_client.close()
connexion_principale.close()

Ce code marche car je l'avais tester avant la modification du programme Arduino mais je le met quand même.

Code Arduino:

#include <S1D13700.h>

S1D13700 glcd;
char text = 0;
int octetReception = 0;
int positionText = 1;
int positionTextHo = 1;
String ordreGauche = "G.";
String ordreDroit = "D.";
String ordreHaut = "H.";
String ordreBas = "B.";
String ordreReset = "R.";
String ordre = "";
String ordreEcrit = "T.";

void setup()
{
  Serial.begin(9600);
  
  glcd.pins.d0 = 2;
  glcd.pins.d1 = 3;
  glcd.pins.d2 = 4;
  glcd.pins.d3 = 5;
  glcd.pins.d4 = 6;
  glcd.pins.d5 = 7;
  glcd.pins.d6 = 8;
  glcd.pins.d7 = 9;
  glcd.pins.rd = 10;
  glcd.pins.wr = 11;
  glcd.pins.a0 = 12;
  glcd.pins.cs = 13;
  
  glcd.initLCD();

  glcd.clearText();
  
  glcd.clearGraphic();

  glcd.drawBox(5,5,315,235);
  
  glcd.textGoTo(1, 1);

}

void loop()
{
  String maChaineDeCaractere ="";
  char textEcrit[50];
  String choix = "";
  String texteAEcrire = "";
  
while(Serial.available()>0)
  {
     octetReception = Serial.read(); 
     text = char(octetReception);
     maChaineDeCaractere += text;
     choix = maChaineDeCaractere.substring(0,2);

      if (choix.compareTo(ordre) == 0)
      {
          maChaineDeCaractere="";
          delay(100);
          break;
      }
      else if(choix.compareTo(ordreGauche) == 0)//gauche
      {
        if(positionText<=0)
        {
         glcd.textGoTo(positionText,positionTextHo); 
        }
        else
        {
        positionText--;
        glcd.textGoTo(positionText, positionTextHo);
        }        
      }
      else if(choix.compareTo(ordreDroit) == 0)//droite
      {
        if(positionText>=38)
        {
         glcd.textGoTo(positionText,positionTextHo); 
        }
        else
        {
        positionText++;
        glcd.textGoTo(positionText, positionTextHo);                      
        }
      }
      else if(choix.compareTo(ordreHaut) == 0)//Haut
      {
        if(positionTextHo<=0)
        {
         glcd.textGoTo(positionText,positionTextHo); 
        }
        else
        {
        positionTextHo--;
        glcd.textGoTo(positionText, positionTextHo);                      
        }
      }
      else if(choix.compareTo(ordreBas) == 0)//Bas
      {
        if(positionTextHo>=28)
        {
         glcd.textGoTo(positionText,positionTextHo); 
        }
        else
        {
        positionTextHo++;
        glcd.textGoTo(positionText, positionTextHo);                      
        }
      } 
      else if(choix.compareTo(ordreReset) == 0)//Reset
      {
         glcd.initLCD();
         glcd.clearText(); 
         glcd.textGoTo(1, 1);
         positionText = 1;
         positionTextHo = 1;
      }
      else
      {
          //text = char(octetReception);
          //maChaineDeCaractere += text;
          //Serial.println(maChaineDeCaractere);
          //maChaineDeCaractere.toCharArray(textEcrit, 50);  
          //glcd.textGoTo(positionText, positionTextHo);      
          //glcd.writeText(textEcrit); 
          
      }
    
    } 
}

Le problème est que je cherche à isoler dans un premier cas les deux premier caractère d'octetReception pour pouvoir donner des ordres du LCD (ce qui pour le moment ne marche pas) et de récuperer les caractères d'octetReception allant du 3ème (après le ".") jusqu'aux "\n\r" pour le traiter et faire qu'après le curseur saute une ligne. Voilà je pense avoir tout expliqué, si besoin je peux répondre aux questions.
Merci d'avance.

Comme tu reçois les caractères un par un tu peux parcourir ta réception et placer les éléments dans tes variables au fur et à mesure en utilisant suivant le cas les IF/FOR/WHILE ?

Peux tu donner le masque de la chaine que tu reçois?

Je sais pas si c'est ça que tu me demande mais j'ai récupérer ceux-ci lorsque j'ai taper 'B.'
--->'66\r\n'

edit: J'ai réussi à tout contrôler me reste plus que le saut de ligne avec pour cela attendre la fin de l'écriture

Ta boucle de réception ne me semble pas bien sécurisée

while(Serial.available()>0)
  {
     octetReception = Serial.read(); 
     text = char(octetReception);
     maChaineDeCaractere += text;
     choix = maChaineDeCaractere.substring(0,2);

Tu extrais 2 caractères d'une chaîne avant même de t'être assuré que tu as une chaîne assez longue.
Il faudrait peut être attendre d'avoir reçu la chaîne complète avant de l'interpréter.

Je suis d'accord avec toi mais je ne vois pas comment faire étant donnée que la taille de la chaîne change selon ce que l'utilisateur envoie :~

A minima il faudrait tester si 2 caractères ont été reçus

Ok merci je vais essayer même si je n'ai pas eu de problèmes avec ce point pour le moment.
Ce qui m'embête c'est le saut de ligne avec écriture.

else
      {
          texteAEcrire.toCharArray(textEcrit, 50);  
          glcd.textGoTo(positionText, positionTextHo);      
          glcd.writeText(textEcrit);           
      }

J'avais tenter ceci:

else
      {
          texteAEcrire.toCharArray(textEcrit, 50);  
          glcd.textGoTo(positionText, positionTextHo);      
          glcd.writeText(textEcrit);   
         positionTextHo++;
        glcd.textGoTo(positionText, positionTextHo);   
      }

Mais ça ne marchais pas ça m'affichait:
Exemple: Ecriture de Hello

H
He
Hel
Hell
Hello
_

Bonjour,
Si l'on s'en référe à ça : toCharArray() - Arduino Reference
Il semblerai qu'il faille stocker la conversion dans un buffer, ce qui n'ai pas le cas ici :

else
{
texteAEcrire.toCharArray(textEcrit, 50);

Merci à tous pour vos messages mais j'ai réussi ce que je voulais faire. Voici le code corrigé si ça vous intéresse:

else
      {
          texteAEcrire.toCharArray(textEcrit, 50);  
          glcd.textGoTo(positionText, positionTextHo);      
          glcd.writeText(textEcrit);           
          if (Serial.available() == 0)
          {
            positionTextHo++;
            glcd.textGoTo(positionText, positionTextHo);
          }
          else;
      }

Maintenant j'ai l'impression qu'on me demande l'impossible :astonished:.
Je dois trouver un moyen de faire une rotation de l'affichage et un moyen de mettre en place plusieurs taille de police (sachant que c'est un S1D13700) je dois me taper S1D13700.cpp =(

Encore bonjour à tous!

Désolé de relancer le sujet mais je me suis dit que je vais utiliser le même :slight_smile:

Donc maintenant mon chef de service veut que je puisse modifier la taille de la police de l'afficheur S1D13700.
Je regarde donc S1D13700.h que voici:

#ifndef S1D13700_h
#define S1D13700_h

#include "WProgram.h"

/*uncomment the line below if you need to use non-default pins
	for your data lines */

#define S1D13700_CUSTOM_DATA_PINS

#define FIXED_DIR DDRD
#define FIXED_PORT PORTD
#define FIXED_PIN PIND


class S1D13700
{
  public:
    S1D13700(void);
    void writeCommand(unsigned char command);
    void writeData(unsigned char data);
    unsigned char readData(void);
    void initLCD(void);
	void setData(unsigned char data);
    void writeText(char * text);
    void setPixel(unsigned int x,unsigned int y, unsigned char state);
    void setCursorAddress(unsigned int address);
    void textGoTo(unsigned char x, unsigned char y);
    void graphicGoTo(unsigned int x, unsigned int y);
    void clearText(void);
    void clearGraphic(void);
    
    void drawBox(int x0, int y0, int x1, int y1);
    void drawCircle(int x0, int y0, int radius);
    void drawLine(int x0, int y0, int x1, int y1);
	
	struct pin_type {
		unsigned char d0;
		unsigned char d1;
		unsigned char d2;
		unsigned char d3;
		unsigned char d4;
		unsigned char d5;
		unsigned char d6;
		unsigned char d7;
		unsigned char a0;
		unsigned char wr;
		unsigned char rd;
		unsigned char cs;
		unsigned char rst;
	} pins;
    
    
    
  private:
    void hardReset(void);
};

#define READDELAY() asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")

/*definitions for specific LCD settings as well as the
  command codes for various function */

#define 	S1D13700_SYSTEM_SET   	0x40
#define 	S1D13700_SLEEP_IN   	0x53
#define 	S1D13700_DISP_OFF   	0x58
#define 	S1D13700_DISP_ON   		0x59
#define 	S1D13700_SCROLL   		0x44
#define 	S1D13700_CSRFORM   		0x5d
#define 	S1D13700_CGRAM_ADR   	0x5c
#define 	S1D13700_CSRDIR_U   	0x4e
#define 	S1D13700_CSRDIR_D   	0x4f
#define 	S1D13700_CSRDIR_L   	0x4d
#define 	S1D13700_CSRDIR_R   	0x4c
#define 	S1D13700_HDOT_SCR   	0x5a
#define 	S1D13700_OVLAY   		0x5b
#define 	S1D13700_CSRW   		0x46
#define 	S1D13700_CSRR   		0x47
#define 	S1D13700_MWRITE   		0x42
#define 	S1D13700_MREAD   		0x43
#define 	S1D13700_SCR_WIDTH   	319
#define 	S1D13700_M0   			0
#define 	S1D13700_M1   			0
#define 	S1D13700_M2   			0
#define 	S1D13700_WS   			0
#define 	S1D13700_IV   			1
#define 	S1D13700_FX   			7
#define 	S1D13700_FY   			14
#define 	S1D13700_WF   			1
#define 	S1D13700_CR   			39
#define 	S1D13700_TCR   			90
#define 	S1D13700_LF   			239
#define 	S1D13700_APL   			40
#define 	S1D13700_APH   			0
#define 	S1D13700_LINES   		30
#define 	S1D13700_SAD1L   		0
#define 	S1D13700_SAD1H   		0
#define 	S1D13700_SL1   			0xEF
#define 	S1D13700_SAD2L   		0xB0
#define 	S1D13700_SAD2H   		0x04
#define 	S1D13700_SL2   			0xEF
#define 	S1D13700_SAD3L   		0
#define 	S1D13700_SAD3H  		0
#define 	S1D13700_SAD4L   		0
#define 	S1D13700_SAD4H   		0
#define 	S1D13700_CRX   			0x04
#define 	S1D13700_CRY   			0x07
#define 	S1D13700_CM   			0
#define 	S1D13700_MX0   			0
#define 	S1D13700_MX1   			0
#define 	S1D13700_DM1   			0
#define 	S1D13700_DM2   			0
#define 	S1D13700_OV   			0
#define 	S1D13700_SAGL   		0
#define 	S1D13700_SAGH   		0x70
#define 	S1D13700_SCRD   		0
#define 	S1D13700_FLASH   		0x16
#define 	S1D13700_TEXTSIZE   	((S1D13700_SAD2H << 8) + S1D13700_SAD2L)
#define		S1D13700_GRAPHICSTART	((S1D13700_SAD2H << 8) + S1D13700_SAD2L)
#define 	S1D13700_GRAPHICSIZE   	((S1D13700_SL2+1) * (S1D13700_SCR_WIDTH+1))>>3
#define 	S1D13700_MEM_END   		10800
#define 	S1D13700_SYS_P1   		0x10 | (S1D13700_IV << 5) | (S1D13700_WS << 3) | (S1D13700_M2 << 2) | (S1D13700_M1 << 1) | S1D13700_M0
#define 	S1D13700_SYS_P2   		0x00 | (S1D13700_WF << 7) | S1D13700_FX
#define 	S1D13700_CSRF_P2   		0x00 | (S1D13700_CM << 7) | S1D13700_CRY
#define 	S1D13700_OVLAY_P1   	0x00 | (S1D13700_OV << 4) | (S1D13700_DM2 << 3) | (S1D13700_DM1 << 2) | (S1D13700_MX1 << 1) | S1D13700_MX0

#endif

avec la doc du S1D13700 que voilà: http://www.lcd-module.de/eng/pdf/zubehoer/s1d13700.pdf
J'ai donc trouvé Fx et Fy qui correspond au nombre de pixel en X et en Y mais je ne trouve pas MOD qui débloque le mod 16pixel(la taille la plus grande si j'ai bien compris).
Voilà peut être que si j'ai de la chance quelqu'un pourra m'aider sinon bah tant pis :smiley:
Merci d'avance.