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
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