... Suite du message précédent
Le programme est un mix de 2 exemples trouvés sur le site www.mon-club-elec.fr, utilisant le shield ethernet et l'écran MI0283QT-2 (superbe matos au passage).
Les 2 exemples pris séparément fonctionnent sans problème (même si le shield ethernet et l'écran sont branchés en même temps), mais je désespère de faire passer le mix dont je donne le source ci-dessous à toute fin utile :
#include <SPI.h>
#include <Ethernet.h>
#include <Server.h>
#include <Client.h>
#include <MI0283QT2.h> // librairie de l'afficheur TFT MI0283QT2
#include <ADS7846.h> // inclusion de la librairie pour le touchpad
#define TOUCHPAD_EEPROMADDR (0x00) //adresse eeprom des données de calibration du touchpad
int posX=0; // variable position courante renvoyée par drawText
int pression=0, X=0, Y=0; // variable X,Y appui touchpad
//--- déclaration du tableau d'adresse MAC ---
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//---- tableau de l'adresse IP de la carte Arduino
byte ip[] = { 192,168,0,127 }; // le PC a pour IP : 169.254.10.1
//----- tableau de l'adresse de la passerelle ---
byte passerelle[] = { 192, 168, 0, 2 }; // l'adresse du PC de connexion
//----- tableau du masque de sous réseau
byte masque[] = { 255, 255, 255, 0 }; // idem masque sous-réseau du PC : 255.255.255.0
//--- création de l'objet serveur ----
Server serveurHTTP(80); // crée un objet serveur utilisant le port 80 = port HTTP
MI0283QT2 lcd; // création d'un objet de type MI0283QT2 appelé lcd
ADS7846 touchpad; // création un objet touchpad de type ADS7846
#define blanc RGB(255,255,255)
#define bleu RGB(0,0,255)
#define rouge RGB(255,0,0)
#define vert RGB(0,255,0)
#define TAILLE_BOUTON 10
struct {
int x;
int y;
int color;
} Boutons[]= {{60,5,rouge},
{75,5,vert},
{90,5,bleu}};
int nbBoutons = sizeof(Boutons)/sizeof(Boutons[0]);
void AfficheMenu()
{
int i;
lcd.clear(RGB(255,255,255)); // efface ecran en blanc
lcd.drawRect(1,1,50,25,bleu);
lcd.drawText(5,10,"Clear",1,bleu,blanc);
for (i=0;i<nbBoutons;i++) {
lcd.fillRect(Boutons[i].x,
Boutons[i].y,
Boutons[i].x+TAILLE_BOUTON,
Boutons[i].y+TAILLE_BOUTON,
Boutons[i].color);
}
}
void setup()
{ // --- ici instructions à exécuter au démarrage ---
//---- initialise la connexion Ethernet avec l'adresse MAC, l'adresse IP et le masque
Ethernet.begin(mac, ip, passerelle, masque);
//---- initialise le serveur ----
serveurHTTP.begin();
//initialisation écran MI0283QT2 240x320 pixels
lcd.init(4); //spi-clk = Fcpu/4
lcd.clear(RGB(255,255,255)); // efface ecran en blanc
//---- initialisation du touchpad de l'afficheur
touchpad.init(); // initialisation du Touchpad
touchpad_calibration(); // appelle la fonction de calibration du touchpad - voir code après fonction loop
// Par défaut 0 = point 0,0 en regard connecteur USB
// IMPORTANT : touchpad et afficheur doivent avoir la meme orientation !
lcd.setOrientation(270); // configure orientation afficheur en degrés : 0,90,180,270
touchpad.setOrientation(270); // configure orientation touchpad en degrés : 0,90,180,270
lcd.led(25); // fixe luminosité
AfficheMenu();
} // fin de la fonction setup()
// ********************************************************************************
void loopEther();
void loopLcd();
void loop(){
loopEther();
loopLcd();
}
void loopEther()
{ // debut de la fonction loop()
Client client = serveurHTTP.available();
if (client) { // le test est VRAI si le client existe
while (client.connected()) { // tant que le client est connecté
if (client.available()) { // le test est vrai si il y a au moins 1 octet disponible
char c = client.read(); // lit l'octet suivant reçu du client (pour vider le buffer au fur à mesure !)
} else { // si pas de caractères disponibles = requete client terminée
// envoi d'une entete standard de réponse http
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
// envoie les chaines de caractères voulues = du code HTML
// code HTML pour police jaune sur fond bleu
// <body style="color: rgb(255, 255, 0); background-color: rgb(0, 0, 255);" >
client.print("<body style="),client.print(byte(34)); // <body style="
client.print("color: rgb(255, 255, 0); background-color: rgb(0, 0, 255);");
//color: rgb(255, 255, 0); background-color: rgb(0, 0, 255);
client.print(byte(34)),client.print(">") ; // " >
client.println("
");
// affiche chaines caractères simples
client.print("Yo !");
client.println("
"); // saut de ligne HTML
client.print("Salut la compagnie !! ");
client.println("
"); // saut de ligne HTML
client.print("Bientot ca fera meme le cafe !!!");
client.println("
"); // saut de ligne HTML
// code HTML pour inclure une image à partir lien web
client.println("
");//
client.print("<img src="),client.print(byte(34)); // <img src="
client.print("http://www.arduino.cc/mes_images/clipart/logo_arduino_150.gif");
client.print(byte(34)),client.print(">") ; // " >
client.println("
");//
break; // on sort de la boucle while
}
} // --- fin while client connected
// on donne au navigateur le temps de recevoir les données
delay(1);
// fermeture de la connexion avec le client
client.stop();
} //---- fin if client existe ----
} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************
#define SEUIL_PRESSION 10
void loopLcd()
{ // debut de la fonction loop()
static int PrevPression=0;
static int PrevX;
static int PrevY;
int i;
static int couleur = bleu;
touchpad.service(); // lance la fonction de service du touchpad
pression=touchpad.getPressure(); // renvoie la valeur courante de la pression sur le touchpad
if (pression<SEUIL_PRESSION) pression=0;
X=touchpad.getX(); // renvoie la valeur courante de X du touchpad
Y=touchpad.getY(); // renvoie la valeur courante de Y du touchpad
if (pression!=0) {
if ((X>1) && (X<50) && (Y>1) && (Y<25)) {
AfficheMenu();
pression=0;
}
for (i=0;i<nbBoutons;i++) {
if ((X>Boutons[i].x) && (X<(Boutons[i].x+TAILLE_BOUTON)) &&
(Y>Boutons[i].y) && (Y<(Boutons[i].y+TAILLE_BOUTON))) {
couleur=Boutons[i].color;
pression=0;
break;
}
}
}
if (pression!=0) {
if (PrevPression==0) { // on vient d'appuyer, tracer le point
lcd.drawPixel(X,Y,couleur);
} else { // on s'est déplacé, tracer la ligne
lcd.drawLine(PrevX,PrevY,X,Y,couleur);
}
}
PrevX=X;
PrevY=Y;
PrevPression=pression;
} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
void touchpad_calibration(void)
{
// fonction classique de calibrage
} //------------------- fin fonction calibration touchpad -------------
// --- Fin programme ---
Pour finir, j'ai à l'origine eu ce problème sur une machine linux (ubuntu), mais le problème est le même avec une machine windows XP (les messages données plus haut).
Ce problème semble assez courant, souvent sans réelle solution (la carte est morte, "le bootloader a eu chaud" ...).
C'est le premier post que je trouve avec une solution qui hélas n'a pas fonctionné dans mon cas.
D'autres pistes à explorer ?
Merci
PS: La carte n'est alimentée que par le port USB lors de l'upload. Je vais essayer de lui apporter un supplément de jus par le connecteur d'alim, on ne sait jamais.