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