Bonjour
Dans un premier temps je tiens a remercier les membres du forum sans qui je n'aurais jamais réussi mon petit projet perso, même si je ne comprends pas toutes les lignes de mon code parfaitement.
Voila mon souci, j'ai un LCD, un Keypad, et des sondes thermique je rentre des paramètres avec le keypad pour lancer des des instructions en fonctions des températures relevées.
Le LCD affiche les température des 2 sondes, mon code fonctionne seulement il affiche la température et rapidement l'écran LCD commence par faire comme des petits HHHH sur l’ensemble de l'écran et finit par une succession de lignes verticales.
J'ai analysé qu'il y avait un souci avec le "void_gestion temperature()" qui est à la fin de mon code car si je le supprime (je ne relève plus les températures) et l'affichage fonctionne.
Quelqu'un peut-il me dire si il voit dans mon code ce qui entraîne ce dysfonctionnement.
Merci d'avance
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <stdio.h>
#include <string.h>
#include <OneWire.h>
#include <simpleMinuteur.h>
#define NBRE_CAPTEUR 2 // nombre de capteur sur l'arduino
// *********** declararation des variables gestion des capteurs de temperature *******************
typedef struct Temperature Temperature;
struct Temperature
{
float valeur; // temperature en Celsius, 1 chiffre apres la virgule
byte addr[8]; // identifiant capteur
int pin; // numero de pin a utiliser
char mnemo[32]; // mnemonique de la variable
};
Temperature temperature[NBRE_CAPTEUR]; //creation des instances
// *********** declaration des RELAIS (pompe et thermoplongeur)***********************************
const int thermo = 22;
const int pompe = 24;
// *********** declaration des variables gestion du clavier (KEYPAD) ******************************************
const byte LIGNES = 4;
const byte COLONNES = 4;
const int C4 = 2;
const int C3 = 3;
const int C2 = 4;
const int C1 = 5;
const int L4 = A2;
const int L3 = A3;
const int L2 = A4;
const int L1 = A5;
char touches[LIGNES][COLONNES] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{',', '0', '#', 'D'}
};
byte BrochesLignes[LIGNES] = {L1, L2, L3, L4};
byte BrochesColonnes[COLONNES] = {C1, C2, C3, C4};
// *********** declaration des variables du parramétrage ******************************************
char touche;
unsigned int valeur1;
unsigned int valeur2;
unsigned int valeur3;
unsigned int valeur4;
unsigned int valeur5;
unsigned int valeur6;
unsigned int valeur7;
unsigned int valeur8;
// *********** declaration des variables gestion du TEMPS des paliers ******************************************
int P1;
int P2;
int P3;
int P4;
boolean verrouPalier1 = false;
boolean verrouPalier2 = false;
boolean verrouPalier3 = false;
boolean verrouPalier4 = false;
int palierEnCours = 0;
simpleMinuteur palier1;
simpleMinuteur palier2;
simpleMinuteur palier3;
simpleMinuteur palier4;
// *********** declaration des variables gestion des TEMPERATURE des paliers ******************************************
int T1;
int T2;
int T3;
int T4;
// *********** declaration des variables de l'écran (LCD) ******************************************
const int D4 = 10;
const int D5 = 11;
const int D6 = 12;
const int D7 = 13;
const int RS = 9;
const int E = 8;
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
Keypad clavier = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES );
// *********** A SUPRIMMER *****************************************
const int Led1 = 7;
const int Led2 = 6;
const int Led3 = 26;
const int Led4 = 28;
// *********** FIN declaration des variables *********************************************************************
void setup() {
Serial.begin(9600); // initialisation de la liaison serie
// *********** initialisation de l'écran LCD *******************
lcd.begin(20, 4); // nombre de colonne et de ligne
lcd.print("Entrer les") ;
lcd.setCursor(0, 1);
lcd.print("parrametres de") ;
lcd.setCursor(0, 2);
lcd.print("brassage") ;
delay(2500);
lcd.clear();
lcd.blink();
// *********** initialisation des variables gestion des capteurs de temperature *******************
temperature[0].addr[0]= 0x28; // capteur moult
temperature[0].addr[1]= 0xFF;
temperature[0].addr[2]= 0x46;
temperature[0].addr[3]= 0xE5;
temperature[0].addr[4]= 0x91;
temperature[0].addr[5]= 0x15;
temperature[0].addr[6]= 0x04;
temperature[0].addr[7]= 0x04;
temperature[0].pin=7;
temperature[0].valeur=0; // temperature en °C, 1 chiffre apres la virgule
strcpy(temperature[0].mnemo,"temperature moult"); //
temperature[1].addr[0]= 0x28; // capteur chauffage
temperature[1].addr[1]= 0xFF;
temperature[1].addr[2]= 0xF5;
temperature[1].addr[3]= 0xD4;
temperature[1].addr[4]= 0x61;
temperature[1].addr[5]= 0x15;
temperature[1].addr[6]= 0x01;
temperature[1].addr[7]= 0x70;
temperature[1].pin=8;
temperature[1].valeur=1; // temperature en °C, 1 chiffre apres la virgule
strcpy(temperature[1].mnemo,"temperature chauffage"); //
// *********** initialisation de la pompe et du thermoplongeur *******************
pinMode (thermo,OUTPUT);// broche 22 configurée en sortie
pinMode (pompe,OUTPUT);// broche 24 configurée en sortie
digitalWrite(thermo,HIGH);
digitalWrite(pompe,HIGH);
lcd.print ("Temperature");
lcd.setCursor(0,1);
lcd.print ( " Moult :");
lcd.setCursor(0,2);
lcd.print (" Chauf :");
lcd.setCursor(0, 3);
lcd.print ("Pallier en cours :");
// *********** A SUPPRIMER *******************
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
}
void loop()
{
gestion_temperature();
delay(100);
lcd.setCursor(9,1);
lcd.print ("20");
lcd.setCursor(9,2);
lcd.print ("50");
delay (2000);
// A SUPPRIMER **********************************************************************************
digitalWrite(Led1,HIGH);
delay(P1*50);
digitalWrite(Led1,LOW); // met la broche au niveau bas (0V) - éteint la LED
delay(P1*50);
digitalWrite(Led2,HIGH);
delay(T1*50);
digitalWrite(Led2,LOW); // met la broche au niveau bas (0V) - éteint la LED
delay(T1*50);
}
void gestion_temperature() // Mesure des températures****************************/
{
byte i=0;
for(i=0; i<NBRE_CAPTEUR; i++){
Serial.print(temperature[i].mnemo);
Serial.print(" => ");
temperature[i].valeur =getStuff(temperature[i].addr,temperature[i].pin);
Serial.print(temperature[i].valeur);
Serial.println(" C ");
delay(0);
}
}
/********************************************************************************
Cette fonction permet d'interroger le capteur de temperature OneWire
qui a ?t? d?clar? dans "temperature[i]"
********************************************************************************/
float getStuff(byte addr[8], int pin) // indiquer le n? de pin ? utiliser
{
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return 998;
}
OneWire ds(pin); // creation d'un objet OneWire avec le bon n? de pin
byte i;
byte present = 0;
byte data[12];
float real_temp;
float temp_count;
float read_temp;
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power off at the end (1=parasite mode)
delay(500); // delay de 1s si mode parasite. 100ms en mode normal
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
read_temp=((data[1]<<8) + data[0]) * 0.0625 ; // Divide the temperature by 2
temp_count=float(data[7] - data[6])/(float)data[7]; // Convert to real temperature
real_temp = ((float)read_temp-0.25)+temp_count;
// arrondi 1 chiffre apres la virgule
int temp = real_temp*100;
real_temp = (float)temp/100;
// Serial.println();
return real_temp;
}
s