Ecran LCD et lecteur SD, encore

Bonjour, je débute et je e suis lancé dans un programme qui actionne un servo aléatoirement (ça c'est ok), et pour lequel j'ai besoin de garder des statistiques du fonctionnement, en temps réel sur un écran LCD et en différé sur une carte SD.
La partie enregistrement sur SD marche très bien. J'ai ajouté un écran LCD 1602 fourni dans un kit avec une carte UNO.
Le rétroéclairage de l'écran clignote et seule la ligne du haut est visible en caractères pleins, il s'éteint quand la carte SD est utilisée.
J'ai pas mal fouillé sur le forum, j'ai trouvé quelques sujets similaires qui ne m'ont pas aidé et je me pose quelques questions :slight_smile:
La carte SD occupe les pins 10 à 13, or l'écran LCD semble devoir occuper en particulier les pins 11 et 12 pour les pins DB4 et DB5, mais j'ai lu des posts disant que l'on pouvait mettre n'importe quel pin (tant que ce n'était pas analogique !). Est-ce que les pins 11 et 12 de l'UNO sont particulières ?
J'ai essayé plusieurs configurations de câblage des pins DB4 à DB7 suite à un post qui parlait de remplacer par 8 et 9. Dans tous les cas le comportement de l'écran est le même que ci-dessus.

Je sèche... L'écran est HS ?
Si quelqu'un s'ennuie sur la plage et a une idée pour m'aider, je suis preneur !

Mon code :

 /*
 SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 10 

Servo branchée :
 * Jaune - pin 5
 * Noir - GND
 * Rouge - 5V
Led Verte :
 * Orange - pin 4

Photorésistance (LDR) :
 * Blanc - pin A0

Ecran :
 * LCD RS pin to digital pin 7
 * LCD Enable pin to digital pin 6
 * LCD D4 pin to digital pin 8
 * LCD D5 pin to digital pin 9
 * LCD D6 pin to digital pin 2
 * LCD D7 pin to digital pin 3


 */
 
#include <Servo.h>
#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>

#define LDR A2  // photoresistor sur pin A2

File myFile;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 8, 9, 2, 3);

Servo myservo;  // create servo object to control a servo


int distriJour = 0;   // variable pour le nbre de distributions par jour
int pos = 90;    // variable to store the servo position
int alea = 1;   // variable du tirage aléatoire
unsigned int deltaT = 0; // variable du temps entre tirage valide
int ledPin = 4; // variable led témoin fonctionnement
unsigned int lumiere;  // variable pour mesure lumière



void setup() {
pinMode(ledPin, OUTPUT);
pinMode(LDR, INPUT);

if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    while (1);
  }
  
  myservo.attach(5);            // attaches the servo on pin 4 to the servo object
  Serial.begin(9600);           // com avec port serie usb
  randomSeed(analogRead(A1));   // génère nombre aléatoire avec seed selon bruit sur pin A1

// set up the LCD's number of columns and rows: (ligne 0 en bas, ligne 1 en haut, colonne de 0 à 15 (=2 lignes et 16 colonnes)
  lcd.begin(16, 2);
  
}

void loop() {

lumiere = analogRead(LDR);    // lit l'entrée analogique
//Serial.println(lumiere);      // imprime sur le terminal la valeur
//delay(250);

if(lumiere<500) {     // lumiere à 100% : valeur = 0 ; dans le noir : valeur = 1023
  //lcd.clear();
  alea = random(0, 10);
  delay(1000);
  deltaT = deltaT + 1;     // incrément deltaT à chaque tirage chaque seconde
 
  int H = deltaT / 3600;    // Début conversion h:m:s
  int M = ((deltaT/3,6 - H*1000)/1000) * 60;
  int S = deltaT % 60;
  //Serial.println(H);
  //Serial.println(":");
  //Serial.println(M);
  //Serial.println(":");
  //Serial.println(S);  

  //Serial.println(alea);   // écrit sur le terminal
  lcd.setCursor(0,0);   // curseur en bas à gauche sur le LCD
  lcd.print(alea);      // écrit sur LCD
  lcd.setCursor(8,0);
  lcd.print(H);
  lcd.setCursor(10,0);
  lcd.print(":");
  lcd.setCursor(11,0);
  lcd.print(M);
  lcd.setCursor(13,0);
  lcd.print(":");
  lcd.setCursor(14,0);
  lcd.print(S);

  
  delay(100);
  
 
  if(alea == 5)
  {     // début boucle if alea ok, distribution
distriJour += 1;
    
  // digitalWrite(ledPin, HIGH);

  // affichage distribution par jour
  
//Serial.println("\t");   //saute une ligne
//Serial.println("Distribution n° :");
//Serial.println(distriJour);
//Serial.println("\t");
  lcd.setCursor(0,1);
  lcd.print("Distrib.");
  lcd.setCursor(8,1);
  lcd.print(distriJour);
  
for(int i = 0 ; i<=255; i +=1) {    // debut boucle allumage led
analogWrite(ledPin, i);
delay(10);
}     // fin boucle for allumage led

myFile = SD.open("stat.csv", FILE_WRITE); // ouvre le fichier csv en écriture, le crée si n'existe pas

    if (myFile) {           // écrit sur la carte
    myFile.println(deltaT);myFile.println(";");myFile.println(distriJour); 
    myFile.close();           // ferme le fichier
    }   // fin écriture carte

   
    Serial.println("deltaT = ");Serial.println(deltaT);    // ecrit sur le terminal
    deltaT = 0;
    H = 0;
    M = 0;
    S = 0;
    
    
  for (pos = 90; pos <= 110; pos += 1) { // goes from 'pos' degrees to 'pos <= xx' degrees (max 180)
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(50);                       // waits x ms (15 ms dans l'exemple) for the servo to reach the position
  }   // fin du for servo Aller
  
  for (pos = 110; pos >= 90; pos -= 1) { // goes from 'pos' degrees to 'pos >= xx' degrees
    myservo.write(pos);           // tell servo to go to position in variable 'pos'
    delay(50);                       // waits x ms for the servo to reach the position
  }  // fin du for servo Retour
    
 // digitalWrite(ledPin, LOW);  
 for(int i=255 ; i>=0; i -=1) {    // debut boucle extinction led
analogWrite(ledPin, i);
delay(10);

}     // fin boucle for extinction led

  
  }   // fin if "alea = 5"
  lumiere = 1024;         // réinitialise la valeur 'lumiere' à zero avant nouvelle mesure avant For
  
}     // fin du if "lumiere"

else {              // cas où 'lumiere' est >500 (nuit)
  distriJour = 0;   // Reset valeur de distriJour puisque nuit
  lcd.setCursor(0,1);
  lcd.print("Nuit");
  lcd.setCursor(8,1);
  lcd.print(lumiere);
}

}     // fin loop

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Bonjour stef_21

L'écran connecté seul, fais l'exemple HelloWorld.ino de la bibliothèque LiquidCrystal.h.
Adapte le pinout de l'exemple à ton montage.

Cordialement
jpbbricole

Le R/W de l'écran est bien connecté à GND

A priori, la librairie accepte n'importe quelle broche et la configure en sortie.

Merci à tous, un peu de bons conseils et un peu de repos : la nuit porte conseil, et quand on branche les pins d'alim de l'écran sur une ligne de la Breadboard qui n'est pas alimentée, eh bien ça marche mal. Donc, si ça peut en aider d'autres, les numéros de pins de connexion vers l'écran sur l'arduino UNO n'ont effectivement pas d'importance pour l'écran LCD1602A.
Pour info, le code ci-dessus marche bien pour l'écran, il faut juste ajouter un lcd.clear() à chaque cycle avant l'affichage pour que les chiffres de l'heure s'effacent bien en cas de remise à zero.
Merci aux contributeurs :+1:

lcd.clear();  // ajouté pour nettoyer l'ecran des caractères en trop (reset heures à zero)
  
  lcd.setCursor(0,0);   // curseur en bas à gauche sur le LCD
  lcd.print(alea);      // écrit sur LCD
  lcd.setCursor(8,0);
  lcd.print(H);
  lcd.setCursor(10,0);
  lcd.print(":");
  lcd.setCursor(11,0);
  lcd.print(M);
  lcd.setCursor(13,0);
  lcd.print(":");
  lcd.setCursor(14,0);
  lcd.print(S);