short** Time;
short soixante[6] = {0, 0, 1, 1, 1, 1};
short vingtquatre[5] = {0, 0, 0, 1, 1};
short seconde = 0;
const int bouton_change_heure = 21;
const int bouton_heure = 20;
const int bouton_minute = 19;
short change_heure = 0;
////////////////////////////////////////////////////////
// Création tableau Time
void initialiser_temps_0(){
Time = (short **)malloc(3 * sizeof(short *));
Time[0] = (short *)malloc(6 * sizeof(short));
Time[1] = (short *)malloc(5 * sizeof(short));
for (int i = 0; i < 2; i ++)
for (int j = 0; j < 6 - i; j ++){
Time[i][j] = 0;
}
}
////////////////////////////////////////////////////////
// Setup
void setup() {
initialiser_temps_0();
//initialiser PIN LED
for (int i = 1; i < 12; i ++){
pinMode(i, OUTPUT);
}
//initialiser PIN Boutons
for (int i = 19; i < 22; i ++){
pinMode(i, INPUT);
}
}
////////////////////////////////////////////////////////
// Calcul temps
//Réinitialise les minutes/heure à 0
void ligne_a_0(int i, int j){
for (int u = 0; u < j; u++){
Time[i][u] = 0;
}
}
//Regarde si le nombre du tableau Time est similaire à celui donné
int verification_nombre(int i, int j, short nombre_a_verifier[]){
for (int u = 0; u < j; u++){
if (nombre_a_verifier[u] != Time[i][u]) return 0;
}
return 1;
}
//Incrémente de 1 les minute/heures
void incremente_tableau(int i){
int y = 0;
Time[i][0] += 1;
while (Time[i][y] == 2){
Time[i][y] = 0;
Time[i][y + 1] += 1;
y ++;
}
}
//Incrémente les seconde et vérifie s'il faut incrémenter les minute/heures
void incremente_temps(){
seconde += 2;
if (seconde == 60){
seconde = 0;
incremente_tableau(0);
if (verification_nombre(0, 6, soixante)){
ligne_a_0(0, 6);
incremente_tableau(1);
if (verification_nombre(1, 5, vingtquatre)){
ligne_a_0(1, 5);
}
}
}
}
////////////////////////////////////////////////////////
// Fonctions LED
//Allume les LED en fonction des 1 et 0 du tableau Time
void allume_led(){
for (int i = 0; i < 2; i ++){
for (int j = 0; j < 6; j ++){
if (Time[i][j]) digitalWrite(j + 1 + (6 * i), HIGH);
}
}
for (int j = 0; j < 5; j ++){
if (Time[2][j]) digitalWrite(j + 1 + (6 * 2), HIGH);
}
}
void eteind_all_led(){
for(int i = 1; i < 12; i++){
digitalWrite(i, LOW);
}
}
void allume_all_led(){
for(int i = 1; i < 12; i++){
digitalWrite(i, HIGH);
}
}
////////////////////////////////////////////////////////
// Fonctions Boutons
//Vérifie si un bouton a été pressé
int bouton(int B){
if (digitalRead(B) == HIGH) return 1;
return 0;
}
////////////////////////////////////////////////////////
// Changer heure
//animation qui prévient que le mode parametrage de l'heure à été activé
void animation_parametre_temps(){
for (int i = 0; i < 4; i ++){
allume_all_led();
delay(200);
eteind_all_led();
delay(200);
}
}
//Incrémente les heures/minutes et affiche le changement
void parametre_temps_incrementation(int i, int j, short nombre_a_verifier[]){
incremente_tableau(i);
if (verification_nombre(i, j, vingtquatre)){
ligne_a_0(i, j);
}
eteind_all_led();
allume_led();
}
//Incrémente les heures/minutes en boucle et affiche le changement tant que le bouton est appuyé
void parametre_temps_incrementation_prolonge(int i, int j, short nombre_a_verifier[], int bouton_presse){
short n = 0;
while (bouton(bouton_presse)){
if (n == 2){
parametre_temps_incrementation(i, j, nombre_a_verifier);
n = 0;
}
else n ++;
delay(50);
}
}
//Vérifie quel bouton est appuyé pour activer les bonnes fonctions
void parametre_temps(){
//Stockage permettant de savoir si un bouton à déjà été apuyé au cycle d'avant
short bouton_appuye[2] = {0, 0};
//Réinitialise les secondes à 0
seconde = 0;
//Stockage permettant de savoir depuis combien de temps un bouton à été apuyé
short appui_prolonge[2] = {0, 0};
//Boucle de vérification des boutons appuyé
while(!bouton(bouton_change_heure)){
if (!bouton_appuye[0] && bouton(bouton_minute)){
bouton_appuye[0] = 1;
parametre_temps_incrementation(0, 6, soixante);
}
else if (!bouton_appuye[1] && bouton(bouton_heure)){
bouton_appuye[1] = 1;
parametre_temps_incrementation(1, 5, vingtquatre);
}
else if (bouton_appuye[0] && !bouton(bouton_minute)) bouton_appuye[0] = 0;
else if (bouton_appuye[1] && !bouton(bouton_heure)) bouton_appuye[1] = 0;
if (bouton_appuye[0] && bouton(bouton_minute)){
appui_prolonge[0] ++;
if (appui_prolonge[0] == 20){
parametre_temps_incrementation_prolonge(0, 6, soixante, bouton_minute);
}
}
else if (bouton_appuye[1] && bouton(bouton_heure)){
appui_prolonge[1] ++;
if (appui_prolonge[1] == 20){
parametre_temps_incrementation_prolonge(1, 5, vingtquatre, bouton_heure);
}
}
else {
appui_prolonge[0] = 0;
appui_prolonge[1] = 0;
}
delay(50);
}
}
//Vérifie si le bouton pour le mode parametrage de l'heure à été appuyé assez longtemps pour lancer le mode
void verification_change_heure(){
if (bouton(bouton_change_heure)){
change_heure ++;
if (change_heure == 2){
change_heure = 0;
animation_parametre_temps();
parametre_temps();
}
}
else change_heure = 0;
}
////////////////////////////////////////////////////////
void loop() {
incremente_temps();
allume_led();
delay(2000);
eteind_all_led();
verification_change_heure();
}