/* Minuterie pour application cuisine * Voir sur cette page http://radioamateurffp.wifeo.com/arduino.php * Mise au point par F8FFP avec l'aide de Jean-Michel F4CQG * début du projet en Fevrier et terminer en Mars 2011. * Remis à Laeticia pour son anniversaire. * #include #include #define SMALLSTEP 1 #define BIGSTEP 10 #define MINCONV 60000 #define NUM_KEYS 5 //============== partie pour la méoldie ====== int LEDPin = 8; int ledPin = 13; int speakerOut = 9; byte names[] = {'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C'}; int tones[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956}; byte melody[] = "2d2a1f2c2d2a2d2c2f2d2a2c2d2a1f2c2d2a2a2g2p8p8p8p"; // count length: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 // 10 20 30 int count = 0; int count2 = 0; int count3 = 0; int MAX_COUNT = 24; int statePin = LOW; //============================================ LCD4Bit_mod lcd = LCD4Bit_mod(2); bool bTimerIsRunning; unsigned long ulDuration; unsigned long ulUserAction; unsigned long ulCurrentTime; unsigned long ulPreviousTime; unsigned long ulEndTime; unsigned long ulPreviousRemainingTime; int adc_key_val[5] ={30, 150, 360, 535, 760 }; int adc_key_in; int key=-1; int oldkey=-1; void setup() { // variables initialization ulEndTime = 0; ulCurrentTime = 0; ulPreviousTime = 0; ulDuration = 0; ulUserAction = 0; ulPreviousRemainingTime = 0; bTimerIsRunning = false; //============== partie pour la méoldie ========= pinMode(ledPin, OUTPUT); pinMode(speakerOut, OUTPUT); pinMode(LEDPin, OUTPUT); //=============================================== // display initialization lcd.init(); // mise en marche du LCD lcd.clear(); // on efface l'écran des fois qu'il reste du chni lcd.printIn(" Bonjour"); delay(2000); // attendre 2000 millisecondes lcd.clear(); // on efface l'écran à la fin lcd.init(); // mise en marche du LCD lcd.clear(); // on efface l'écran des fois qu'il reste du chni lcd.printIn(" Bienvenue"); delay(1000); // attendre 1000 millisecondes lcd.clear(); // on efface l'écran à la fin lcd.init(); // mise en marche du LCD lcd.clear(); // on efface l'écran des fois qu'il reste du chni lcd.printIn(" sur le timer"); delay(1000); // attendre 1000 millisecondes lcd.clear(); // on efface l'écran à la fin lcd.init(); // mise en marche du LCD lcd.clear(); // on efface l'écran des fois qu'il reste du chni lcd.printIn(" SEB"); delay(5000); // attendre 5000 millisecondes lcd.clear(); // on efface l'écran à la fin // display initialization lcd.init(); lcd.clear(); lcd.cursorTo(1, 0); lcd.printIn(" Choisir duree "); digitalWrite(LEDPin, LOW); // arrête d'envoyer en boucle une tension de 5V sur le pin 8 } void loop() { //récup valeur button digitalWrite(LEDPin, LOW); // arrête d'envoyer en boucle une tension de 5V sur le pin 8 delay(80); ulUserAction = GetButtonValue(0); switch (ulUserAction) { case 0 : // right button : +10min ulDuration += BIGSTEP; DisplayRemainingTime(ulDuration); break; case 1 : // up button : +1min ulDuration += SMALLSTEP; DisplayRemainingTime(ulDuration); break; case 2 : // down button : -1min if (ulDuration >= 1) { ulDuration -= SMALLSTEP; } else { ulDuration = 0; } DisplayRemainingTime(ulDuration); break; case 3 : // left button : -10min if (ulDuration >= BIGSTEP) { ulDuration -= BIGSTEP; } else { ulDuration = 0; } DisplayRemainingTime(ulDuration); break; case 4 : // select button if (ulDuration > 0) { bTimerIsRunning = true; ulEndTime = millis() + (ulDuration * MINCONV); } break; } delay(80); // no user action, process countdown if running if (bTimerIsRunning) { ulCurrentTime = millis(); if (ulCurrentTime-ulPreviousTime > 1000) { if (ulEndTime < ulCurrentTime) { // countdown ended //============== display initialization ========= DisplayEnd(); lcd.init(); lcd.clear(); lcd.cursorTo(1, 0); lcd.printIn(" Choisir duree "); //============== partie pour la méoldie ========= melodie(); //=============================================== } else { digitalWrite(ledPin, HIGH); // allume la LED delay(1000); // attendre 1 seconde digitalWrite(ledPin, LOW); // éteint la LED delay(1000); // attendre une seconde // countdown still going DisplayRemainingTime((ulEndTime-ulCurrentTime)/MINCONV); } ulPreviousTime = ulCurrentTime; } } } void DisplayRemainingTime(unsigned long ulRemainingTime) { if (ulPreviousRemainingTime != ulRemainingTime) { lcd.clear(); lcd.cursorTo(1, 0); lcd.printIn("Duree restante:"); char buffer[16]; sprintf(buffer,"%d minute(s)", ulRemainingTime); // %d pour les variables décimale. (int)temp = 3 et temp1 = 14 lcd.cursorTo(2, 0); lcd.printIn(buffer); ulPreviousRemainingTime = ulRemainingTime; } } void DisplayEnd() { lcd.clear(); lcd.cursorTo(1, 0); lcd.printIn(" Duree atteinte"); lcd.cursorTo(2, 0); lcd.init(); // mise en marche du LCD delay(1000); // attendre 1000 millisecondes lcd.clear(); // on efface l'écran des fois qu'il reste du chni lcd.printIn("Bonne Appetit"); delay(1000); // attendre 10000 millisecondes bTimerIsRunning = false; ulCurrentTime = 0; ulEndTime = 0; digitalWrite(ledPin, HIGH); // envoit en boucle une tension de 5V sur le pin 13 delay(500); // fait une pause pendant 500 milisecondes ( une seconde ) digitalWrite(ledPin, LOW); // arrête d'envoyer en boucle une tension de 5V sur le pin 13 delay(500); // fait une pause pendant 500 milisecondes ( une seconde ) digitalWrite(LEDPin, HIGH); // envoit en boucle une tension de 5V sur le pin 13 delay(500); // fait une pause pendant 500 milisecondes ( une seconde ) } int GetButtonValue(int iAnalogSensor) { adc_key_in = analogRead(iAnalogSensor); //digitalWrite(13, HIGH); key = get_key(adc_key_in); // convert into key press if (key != oldkey) // if keypress is detected { delay(50); // wait for debounce time adc_key_in = analogRead(iAnalogSensor); // read the value from the sensor key = get_key(adc_key_in); // convert into key press if (key != oldkey) { oldkey = key; } } } // Convert ADC value to key number int get_key(unsigned int input) { int k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS) { k = -1; // No valid key pressed } return k; } //============== partie pour la méoldie ========= void melodie() { digitalWrite(speakerOut, LOW); for (count = 0; count < MAX_COUNT; count++) { statePin = !statePin; digitalWrite(ledPin, statePin); for (count3 = 0; count3 <= (melody[count*2] - 48) * 30; count3++) { for (count2=0;count2<8;count2++) { if (names[count2] == melody[count*2 + 1]) { digitalWrite(speakerOut,HIGH); delayMicroseconds(tones[count2]); digitalWrite(speakerOut, LOW); delayMicroseconds(tones[count2]); } if (melody[count*2 + 1] == 'p') { // make a pause of a certain size digitalWrite(speakerOut, 0); delayMicroseconds(500); pinMode(ledPin, INPUT); pinMode(speakerOut, INPUT); pinMode(ledPin, INPUT); pinMode(speakerOut, INPUT); digitalWrite(LEDPin, HIGH); // envoit en boucle une tension de 5V sur le pin 13 delay(500); // fait une pause pendant 500 milisecondes ( une seconde ) digitalWrite(LEDPin, LOW); // arrête d'envoyer en boucle une tension de 5V sur le pin 13 delay(1000); // fait une pause pendant 1000 milisecondes ( une seconde ) lcd.init(); // mise en marche du LCD lcd.printIn("Bon Appetit"); } } } } } //===============================================