Bonjour à tous ,j'ai un code Arduino pour un anémomètre qui fonctionne bien, mais voilà, je voudrais changer d'écran LCD pour un LCD i2c pour des raison de montage. J'ai exécuter un scan pour avoir l'adresse de l'écran (0x27) et lorsque je fais des test style "hello" tout fonctionne. J'ai voulu modifier mon code pour l'anemo,mais voilà ,j'ai bien ce que j'avais à l'écran comme pour l'autre lcd :" vent: 0.00 Km/h "mais quand l'anémo tourne ,il ne ce passe rien.Il n'incrit aucune valeur.Quelqu'un aurait-il une idée? En tout ca merci d'avance pour votre dévouement.
voici le premier code .tout fonctionne bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171 #include <LiquidCrystal.h> int etat_serre = 0; // Indicateur d'état de la serre (0 = Ouvert/ 1=fermée) unsigned long fermeture_serre_tic = 0; // tic de fermeture de la serre (le tic c'est "le temps") unsigned long duree_fermeture_serre = 1 * 60000; // Durée max de fermeture de la serre en millisecondes (1 heures) int relaisPin = 3; int anemo = 2; LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // initialisation, on définit les ports pour RS, E et D4 à D7 // Temps en millisecondes depuis lequel le programme tourne // Est déclaré volative pour permettre de transmettre cette valeur de manière fiable // vers une SP de type ISR (SP de type Interruption) volatile unsigned long timeRun; unsigned long timeLast; float periode; const int RELAY = 3; /***************Variables pour la vitesse du vent*****************************/ //declare un var anemo qui = 2 float v_vent = 0.00; //var qui contiendra la vitesse du vent float rayonBras = 0.01; //rayon du bras 9cm => 0.09m int anemoTickCompteur = 0; //variable pour le comptage du nombre de "TICKS" du capteur ILS de l'anemo float FEtalonage = 3.1; unsigned long previousMillis = 0; const unsigned long TimePause = 30 * 60000; const unsigned long TimeMarche = 5 * 60000 ; enum {ARRET, MARCHE} etat; void setup() { lcd.setCursor(0, 0); // Place le c lcd.begin(16, 2); // definit l'écran sur caractères (16) et de lignes (2) delay(100); // Pause lcd.setCursor(1, 0); // Place le cursor lcd.print("initialisation"); // Affiche le message delay(500); // Pause lcd.clear(); // Efface l'écran delay(250); // Pause lcd.print("vent: "); // Affiche texte lcd.setCursor(6, 0); // Place le cursor lcd.print(v_vent); // Affiche la valeur de la vitesse du vent égale à 0.00 au départ lcd.setCursor(11, 0); // Place le cursor lcd.print("km/h"); // Affiche le texte // On initialise les entrées/sorties etat = MARCHE; /********************************************************************* Mise en place des broches avec les fonctions d'interruption *********************************************************************/ pinMode(anemo, INPUT); // On écrit l'état du relais, definit la pin anemo(2) comme une entrée // Dès que la broche anemo(2) changera d'etat (RISING = état BAS vers HAUT (front montant)) on appelle le SP AnemoTicks attachInterrupt(digitalPinToInterrupt(anemo), AnemoTicks, RISING); // On initialise timeLast timeLast = millis(); } /*****************************************************/ /** Boucle lancée automatiquement après Setup() **/ /*****************************************************/ void loop() { // Interdit les interruptions, le temps que la variable timeRun soit chargée // pour éviter que AnemoTicks() soit lancé en plein chargement de la variable noInterrupts(); // Affecte le temps depuis lequel le programme tourne à la variable timeRun timeRun = millis(); // Autorise à nouveau les interruptions interrupts(); } /***********************************************************/ /** Sous-programme (ISR) appelé par interruption anemo **/ /** (Note : delay() ne peut pas fonctionner à ce niveau) **/ /** Une seule interruption sur 4 est prise en compte **/ /***********************************************************/ void AnemoTicks() { anemoTickCompteur++; if (anemoTickCompteur >= 4) { // Remise à 0 du compteur anemoTickCompteur anemoTickCompteur = 0; // Calcul la période et on divise par 1000.0 pour obtenir le résultat en seconde periode = (timeRun - timeLast) / 1000.0; // On initialise timeLast pour préparer le prochaine calcul de la période timeLast = timeRun; // calcul de la vitesse du vent avec la formule // vitesse du vent = rayonBras * 2pi * fréquence (frequence=nb_tour/s) // => résultat en m/s 2 Ticks = 1 tour/ 4 Ticks = 2 tours v_vent = rayonBras * 2 * 3.14 * (4 / periode) * FEtalonage; // Met le resultat en km/h v_vent = v_vent * 3.6; // Appelle le SP d'affichage des informations surle panel LCD Afficher(); // Appelle le SP de Gestion de la Serre GereSerre(); } } /***********************************************/ /** Affichage des informations sur le PANEL **/ /***********************************************/ void Afficher() { lcd.setCursor(6, 0); // Place le cursor lcd.print(v_vent); // Affiche la valeur de la vitesse du vent lcd.setCursor(7, 1); // Place le cursor pinMode( 3, OUTPUT); // Prépare l'activation du relai relié au PIN 3 } /***************************************************/ /** Gestion de la Serre (commande l'ouverture et **/ /** la fermeture) **/ /***************************************************/ void GereSerre() { if (v_vent > 30) // condition Km/h selon affichage sur l'écran (100/3.6) { // On ferme la serre digitalWrite(RELAY, LOW); // On notifie la fermeture etat_serre = 1; // On mémorise le Tic de fermeture fermeture_serre_tic = timeRun; } else { if (etat_serre == 1) { // La serre a été fermée suite à un vent trop fort if ((timeRun - fermeture_serre_tic) > duree_fermeture_serre ) { // On reouvre la serre préalablement fermée à cause du vent digitalWrite(RELAY, HIGH); // On notifie l'ouverture etat_serre = 0; } else { // On ferme la serre (ou on termine de la fermer) digitalWrite(RELAY, LOW); } } else { // On ouvre la serre digitalWrite(RELAY, HIGH); } } }
et le second avec les modification
sur le LCD ,j'ai bien "vent: 0.00Km/h".Mais quand l'anémo tourne ,je n'ai rien. Alors ,est-ce que parce que l'ecran est connecté su A4 et A5 qui ccause problème.Voici la modification que j'ai faite.Je passe certainement à côté de quelque chose de tout simple ,mais je ne vois pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184 #include <Wire.h> #include <LiquidCrystal_I2C.h> int etat_serre = 0; // Indicateur d'état de la serre (0 = Ouvert/ 1=fermée) unsigned long fermeture_serre_tic = 0; // tic de fermeture de la serre (le tic c'est "le temps") unsigned long duree_fermeture_serre = 1 * 60000; // Durée max de fermeture de la serre en millisecondes (1 heures) int relaisPin = 3; int anemo = 2; // indiquer (adresse i2c, nombre de colonnes, nombre de lignes) LiquidCrystal_I2C lcd(0x27, 16, 2); // Temps en millisecondes depuis lequel le programme tourne // Est déclaré volative pour permettre de transmettre cette valeur de manière fiable // vers une SP de type ISR (SP de type Interruption) volatile unsigned long timeRun; unsigned long timeLast; float periode; const int RELAY = 3; /***************Variables pour la vitesse du vent*****************************/ //declare un var anemo qui = 2 float v_vent = 0.00; //var qui contiendra la vitesse du vent float rayonBras = 0.01; //rayon du bras 9cm => 0.09m int anemoTickCompteur = 0; //variable pour le comptage du nombre de "TICKS" du capteur ILS de l'anemo float FEtalonage = 3.1; unsigned long previousMillis = 0; const unsigned long TimePause = 30 * 60000; const unsigned long TimeMarche = 5 * 60000 ; enum {ARRET, MARCHE} etat; void setup() { // initialise l'afficheur LCD lcd.init(); // allumer retroeclairage lcd.backlight(); // allumer retroeclairage lcd.backlight(); // activer l'affichage lcd.display(); // activer l'affichage lcd.display(); lcd.setCursor(0, 0); // Place le c lcd.begin(16, 2); // definit l'écran sur caractères (16) et de lignes (2) delay(100); // Pause lcd.setCursor(1, 0); // Place le cursor lcd.print("initialisation"); // Affiche le message delay(500); // Pause lcd.clear(); // Efface l'écran delay(250); // Pause lcd.print("vent: "); // Affiche texte lcd.setCursor(6, 0); // Place le cursor lcd.print(v_vent); // Affiche la valeur de la vitesse du vent égale à 0.00 au départ lcd.setCursor(11, 0); // Place le cursor lcd.print("km/h"); // Affiche le texte // On initialise les entrées/sorties etat = MARCHE; /********************************************************************* Mise en place des broches avec les fonctions d'interruption *********************************************************************/ pinMode(anemo, INPUT); // On écrit l'état du relais, definit la pin anemo(2) comme une entrée // Dès que la broche anemo(2) changera d'etat (RISING = état BAS vers HAUT (front montant)) on appelle le SP AnemoTicks attachInterrupt(digitalPinToInterrupt(anemo), AnemoTicks, RISING); // On initialise timeLast timeLast = millis(); } /*****************************************************/ /** Boucle lancée automatiquement après Setup() **/ /*****************************************************/ void loop() { // Interdit les interruptions, le temps que la variable timeRun soit chargée // pour éviter que AnemoTicks() soit lancé en plein chargement de la variable noInterrupts(); // Affecte le temps depuis lequel le programme tourne à la variable timeRun timeRun = millis(); // Autorise à nouveau les interruptions interrupts(); } /***********************************************************/ /** Sous-programme (ISR) appelé par interruption anemo **/ /** (Note : delay() ne peut pas fonctionner à ce niveau) **/ /** Une seule interruption sur 4 est prise en compte **/ /***********************************************************/ void AnemoTicks() { anemoTickCompteur++; if (anemoTickCompteur >= 4) { // Remise à 0 du compteur anemoTickCompteur anemoTickCompteur = 0; // Calcul la période et on divise par 1000.0 pour obtenir le résultat en seconde periode = (timeRun - timeLast) / 1000.0; // On initialise timeLast pour préparer le prochaine calcul de la période timeLast = timeRun; // calcul de la vitesse du vent avec la formule // vitesse du vent = rayonBras * 2pi * fréquence (frequence=nb_tour/s) // => résultat en m/s 2 Ticks = 1 tour/ 4 Ticks = 2 tours v_vent = rayonBras * 2 * 3.14 * (4 / periode) * FEtalonage; // Met le resultat en km/h v_vent = v_vent * 3.6; // Appelle le SP d'affichage des informations surle panel LCD Afficher(); // Appelle le SP de Gestion de la Serre GereSerre(); } } /***********************************************/ /** Affichage des informations sur le PANEL **/ /***********************************************/ void Afficher() { lcd.setCursor(6, 0); // Place le cursor lcd.print(v_vent); // Affiche la valeur de la vitesse du vent lcd.setCursor(7, 1); // Place le cursor pinMode( 3, OUTPUT); // Prépare l'activation du relai relié au PIN 3 } /***************************************************/ /** Gestion de la Serre (commande l'ouverture et **/ /** la fermeture) **/ /***************************************************/ void GereSerre() { if (v_vent > 30) // condition Km/h selon affichage sur l'écran (100/3.6) { // On ferme la serre digitalWrite(RELAY, LOW); // On notifie la fermeture etat_serre = 1; // On mémorise le Tic de fermeture fermeture_serre_tic = timeRun; } else { if (etat_serre == 1) { // La serre a été fermée suite à un vent trop fort if ((timeRun - fermeture_serre_tic) > duree_fermeture_serre ) { // On reouvre la serre préalablement fermée à cause du vent digitalWrite(RELAY, HIGH); // On notifie l'ouverture etat_serre = 0; } else { // On ferme la serre (ou on termine de la fermer) digitalWrite(RELAY, LOW); } } else { // On ouvre la serre digitalWrite(RELAY, HIGH); } } }
Partager