Bonjour,
Je travaille sur un programme permettant de gérer un carrefour avec des feux tricolores et il faut aussi gérer un bouton qui active/désactive le jour.
Et si ce bouton est activé les feux doivent clignoter orange avec un délai de 2 sec mais avant cela il faut que tous les feux passent au rouge et pas d'un coup sinon imaginez les accidents .
Voici le programme
Je précise que l'algo n'est pas terminé.
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 // Programme permettant de gérer des feux tricolores ////////////////////////////////////////////////////////// // prototypes de fonctions void init( ); // Procédure d’initialisation du PIC void allumage_feux( ); // Sous programme de l'allumage de feux ////////////////////////////////////////////////////////// // Constantes #define feu_voltaire_rouge PORTB.F0 #define feu_voltaire_orange PORTB.F1 #define feu_voltaire_vert PORTB.F2 #define feu_michel_rouge PORTB.F3 #define feu_michel_orange PORTB.F4 #define feu_michel_vert PORTB.F5 #define ETEINT 0 #define ALLUME 1 #define capteur_nuit PORTA.F0 ////////////////////////////////////////////////////////// // Fonction principale void main() { init (); // appel de la procédure « init » while (1) { allumage_feux() ; // appel de la procédure « allumage_feux » } } ////////////////////////////////////////////////////////// void init ( ) // sous programme d’initialistion du PIC, des variables, etc … { trisb = 0x00; // config du port B en sortie portb = 0x00; // Tous les feux sont éteints à l'init trisa = 0xFF; // config du port A en sortie } ////////////////////////////////////////////////////////// void allumage_feux ( ) // sous programme { int boucle; if ( capteur_nuit == ALLUME) // On demande si le bouton 1 (Capteur jour/nuit) est allumé { while ( capteur_nuit == ALLUME) // Tant qu'il est allumé on fait clignoter les feux orange toutes les 2 sec { feu_voltaire_orange = ALLUME; // Feu Voltaire orange allumé feu_michel_orange = ALLUME; // Feu Michel orange allumé delay_ms(2000); // Pendant 2 sec feu_voltaire_orange = ETEINT; // Feu Voltaire orange éteint feu_michel_orange = ETEINT; // Feu Michel orange éteint delay_ms(2000); // Pendant 2 sec } } else // Sinon mise en route du système de feu classique { while(boucle < 5) // Boucle qui permet de faire clignoter les feux oranges 5 sec { feu_voltaire_orange = ALLUME; // Feu Voltaire orange allumé feu_michel_orange = ALLUME; // Feu Michel orange allumé delay_ms(500); // Tempo 500 ms feu_voltaire_orange = ETEINT; // Feu Voltaire orange éteint feu_michel_orange = ETEINT; // Feu Michel orange éteint delay_ms(500); // Tempo 500 ms boucle ++; // Incrémente la variable boucle } } // Début circulation // Circulation Voltaire feu_voltaire_rouge = ALLUME; // Feu Voltaire rouge allumé feu_michel_rouge = ALLUME; // Feu Michel rouge allumé delay_ms(1000); // Pendant 1 sec feu_voltaire_rouge = ETEINT; // Feu Voltaire rouge éteint feu_voltaire_vert = ALLUME; // Feu Voltaire vert allumé delay_ms(10000); // A modifier 10 s // Circulation Michel feu_voltaire_vert = ETEINT; // Feu Voltaire vert éteint feu_voltaire_orange = ALLUME; // Feu Voltaire orange allumé delay_ms(1000); // Pendant 1 sec feu_voltaire_orange = ETEINT; // Feu Voltaire orange éteint feu_voltaire_rouge = ALLUME; // Feu Voltaire rouge allumé delay_ms(1000); // Pendant 1 sec feu_michel_rouge = ETEINT; // Feu Michel rouge éteint feu_michel_vert = ALLUME; // Feu Michel vert allumé delay_ms(10000); // A modifier 10 s feu_michel_vert = ETEINT; // Feu Michel vert éteint feu_michel_orange = ALLUME; // Feu Michel orange allumé delay_ms(1000); // Pendant 1 sec feu_michel_orange = ETEINT; // Feu Michel orange éteint feu_michel_rouge = ALLUME; // Feu Michel rouge allumé delay_ms(1000); // Pendant 1 sec }
J'ai plus besoin d'aide pour le début avec le fameux bouton jour/nuit, j'ai fait un classique if else mais ça ne marche pas.
Je m'explique admettons que le capteur jour/nuit soit allumé dès le début donc les feux vont clignoter indéfiniment orange avec le délai de 2 sec mais si je relâche le bouton l'étape de la boucle (ligne 53-62 je crois) est complétement ignorée et le programme passe à la suite.
Bien entendu je ne veux pas les réponses directement, j'ai juste besoin d'un coup de pouce.
Merci
Partager