Coucou tout le monde
J’ai cédé au charme d’un écran tactile LCD de 4D systems (le LCD43-PT) et son fameux Visi-Genie.
Si mettre en place images/boutons/sons/… est un jeu d’enfant, la communication avec l’Arduino est beaucoup plus trash, surtout pour quelqu’un comme moi qui n’a jamais fait de langage C.
J’en appel aux pros de la programmation, pour qui le langage Arduino est une seconde langue maternelle. XD
Sur le papier c’est très simple. Pour changer les propriétés d’un objet il suffit de passer la commande “SendMessage (Code de l’action, Code de l’objet, Valeur à transmettre)”
Ca marche trés bien pour UN SEUL objet. Mais (car il y a ce foutu ‘mais’) si je met plusieurs “Sendmessage” à la suite, seul le premier objet est modifié et aucun autres !.
J’ai donc fais un double tableau ( tableau 1 = codes de tous les objets et tableau 2 = toutes les valeurs a transmettre) pour tout passer d’en seul coup sous la forme d’une fonction “Void Afficher()”
Et la plus rien ! plus aucun objets n’est modifié ! J’ai beau trifouiller depuis des jours, rien !
Voici le code :
// *********************************************
// INCLUDE
// *********************************************
#include “SoftwareSerial.h”
#include “Arduino.h”
// *********************************************
// CONSTANTES
// *********************************************
#define DisplaySerial Serial
SoftwareSerial mySerial (0,1); // RX, TX du Shield LCD
#define READ_OBJ 0x00 // code actions entre le LCD et l’arduino
#define WRITE_OBJ 0x01
#define REPORT_OBJ 0x05
#define REPORT_EVENT 0x07
const uint16_t Gauge0 = 0x0B00;
const uint16_t Gauge1 = 0x0B01;
const uint16_t Gauge2 = 0x0B02;
const uint16_t Gauge3 = 0x0B03;
const uint16_t Gauge4 = 0x0B04;
const uint16_t Gauge5 = 0x0B05;
const uint16_t Gauge6 = 0x0B06;
const uint16_t Gauge7 = 0x0B07;
const uint16_t Gauge8 = 0x0B08;
const uint16_t Gauge9 = 0x0B09;
const uint16_t Gauge10 = 0x0B0A;
const uint16_t Gauge11 = 0x0B0B;
const uint16_t Gauge12 = 0x0B0C;
const uint16_t Gauge13 = 0x0B0D;
const uint16_t Gauge14 = 0x0B0E;
const uint16_t String0 = 0x1100;
const uint16_t String1 = 0x1101;
const uint16_t String2 = 0x1102;
const uint16_t String3 = 0x1103;
const uint16_t String4 = 0x1104;
const uint16_t String5 = 0x1105;
const uint16_t String6 = 0x1106;
const uint16_t String7 = 0x1107;
const uint16_t String8 = 0x1108;
const uint16_t String9 = 0x1109;
const uint16_t String10 = 0x110A;
const uint16_t String11 = 0x110B;
const uint16_t String12 = 0x110C;
const uint16_t String13 = 0x110D;
const uint16_t String14 = 0x110E;
const uint16_t String15 = 0x110F;
// *********************************************
// VARIABLES
// *********************************************
uint8_t command;
uint16_t object, value;
boolean flag;
int Temperature;
unsigned int val;
// *********************************************
// FONCTIONS
// *********************************************
// Recuperer les ACK : 0xc6 (06 = succes) ou 0xd5 (15 = echec)
uint8_t nacAck() {delay (10);while(!mySerial.available());return mySerial.read();}
// READMESSAGE = Lecture des infos envoyées par le LCD
bool readMessage(uint8_t &command0,uint16_t &object0, uint16_t &value0) {
bool flag0=false;uint8_t buffer[6];uint8_t checksum = 0x00;uint8_t i=0;
if(mySerial.available()>0) {buffer = mySerial.read();command0 = buffer[0];i++;checksum = command0;
if (command0==REPORT_EVENT){
if(mySerial.available()>3) {buffer = mySerial.read();checksum ^= buffer;i++;object0 = buffer[1]<<8 | buffer[2];buffer = mySerial.read ();checksum ^= buffer;i++;object0 = buffer[1]<<8 | buffer[2];buffer = mySerial.read();checksum ^=buffer*;i++;*
value0 = buffer[3]<<8 | buffer[4];}}flag0 = (checksum==mySerial.read());}return flag0;}
// SENDMESSAGE = Envoi des messages au LCD
bool sendMessage(uint8_t command0, uint16_t object0, uint16_t value0) {
bool flag0 = false;uint8_t buffer[6];uint8_t checksum = 0x00;uint8_t i=0;buffer = command0;checksum = command0;i++;buffer = object0 >>8;checksum ^= buffer*;i++;*
buffer = object0 & 0xff;checksum ^= buffer;i++;buffer = value0 >>8;checksum ^= buffer;i++;buffer= value0 & 0xff;checksum ^= buffer_;i++;buffer = checksum;i++;
mySerial.write(buffer, i); return(nacAck()==0x06);
}
// AFFICHER = envoyer les valeurs aux objets du LCD
uint16_t a;
const int MaxItem = 47; // Nombre total des objets a afficher = taille du tableau_
const uint16_t NoItem[42]= {0x0B00,0x0B01,0x0B02,0x0B03,0x0B04,0x0B05,0x0B06,0x0B07,0x0B08,0x0B09,0x0B0A,0x0B0B,0x0B0C,0x0B0D,0x0B0E,0x1100,0x1101,0x1102,0x1103,0x1104,0x1105,0x1106,0x1107,0x1108,0x1109,0x110A,0x110B,0x110C,0x110D,0x110E,0x110F};
** uint16_t Valeur[42]= {0x000A,0x0010,0x001A,0x001A,0x000A,0x0010,0x001A,0x001A,0x000A,0x0010,0x001A,0x001A,0x000A,0x0010,0x001A,0x001A,0x000A,0x0010,0x001A,0x001A,0x000A,0x0010,0x001A,0x001A,0x000A,0x0010,0x001A,0x001A,0x000A,0x0010,0x0010};**
void afficher () { // Boucle pour afficher la valeur des item
** for(int compt=0; compt<MaxItem; compt++) {**
** Serial.println(NoItem[compt]);**
** Serial.println("–");**
** Serial.println(Valeur[compt]);}**
** for(int compt=0; compt<MaxItem; compt++) {**
** sendMessage(WRITE_OBJ, NoItem[compt], Valeur[compt]);
_ delay (10);}
};**_
// *********************************************
// VOID SETUP
// *********************************************
void setup() {
mySerial.begin(9600);
*delay (3000); *
}
// *********************************************
// VOID LOOP
// *********************************************
void loop() {
afficher();
sendMessage(0x0001, 0x0A00, 0x0015); // Toute seule, cette fonction marche
delay(500);
}
Est ce que vous avez vu une c… dans le code ?. J’ai tellement le nez dessus depuis plusieurs jours que j’y arrive plus. ]
Toute remarque sera la bienvenue.
Merci d’avance