// // ######################### // # MESURE DU POULS # // ######################### // # Guy Magli 30.05.2019 # // # Guy Magli 30.09.2019 # // ######################### // # Conception, cablages # // # mises a jour, # // # contact... # // # www.magli.fr # // ######################### // // Afin d'eviter les problemes d'affichage et d'impression les signes diacritiques // ont ete retires des commentaires et des chaines de caracteres. // // ! ======================== ! // ! LIBRAIRIES ET PARAMETRES ! // ! ======================== ! // #define USE_ARDUINO_INTERRUPTS true // Interruptions autorisees #include #include // // ! ================================================= ! // ! VARIABLES GLOBALES, CONSTANTES ET INITIALISATIONS ! // ! ================================================= ! // // Parametres pour l'afficheur a LEDS // Les chiffres correspondent aux adresse 0xc0 0xc2 0xc4 0xc6 0xc8 0xca 0xcc 0xce // const int strobe = 4; // STB const int clock = 3; // CLK const int data = 2; // DIO // #define SEGMENT_A 0x01 // A #define SEGMENT_B 0x02 // --- #define SEGMENT_C 0x04 // F : : B #define SEGMENT_D 0x08 // -G- #define SEGMENT_E 0x10 // E : : C #define SEGMENT_F 0x20 // --- #define SEGMENT_G 0x40 // D const unsigned char chiffres[] = { SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F, // 0 SEGMENT_B + SEGMENT_C, // 1 SEGMENT_A + SEGMENT_B + SEGMENT_G + SEGMENT_E + SEGMENT_D, // 2 SEGMENT_A + SEGMENT_B + SEGMENT_G + SEGMENT_C + SEGMENT_D, // 3 SEGMENT_F + SEGMENT_G + SEGMENT_B + SEGMENT_C, // 4 SEGMENT_A + SEGMENT_F + SEGMENT_G + SEGMENT_C + SEGMENT_D, // 5 SEGMENT_A + SEGMENT_F + SEGMENT_G + SEGMENT_E + SEGMENT_C + SEGMENT_D, // 6 SEGMENT_A + SEGMENT_B + SEGMENT_C, // 7 SEGMENT_A + SEGMENT_F + SEGMENT_B + SEGMENT_G + SEGMENT_E + SEGMENT_C + SEGMENT_D, // 8 SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_F + SEGMENT_G + SEGMENT_D, // 9 }; const unsigned char lettreA = SEGMENT_E + SEGMENT_F + SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_G; // Comme le R const unsigned char lettreB = SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F + SEGMENT_G; const unsigned char lettreC = SEGMENT_A + SEGMENT_F + SEGMENT_E + SEGMENT_D; const unsigned char lettreD = SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F; // Comme le O et le Q const unsigned char lettreE = SEGMENT_A + SEGMENT_F + SEGMENT_G + SEGMENT_E + SEGMENT_D; const unsigned char lettreF = SEGMENT_A + SEGMENT_F + SEGMENT_E + SEGMENT_G; const unsigned char lettreG = SEGMENT_A + SEGMENT_F + SEGMENT_E + SEGMENT_D + SEGMENT_C; // Comme le N const unsigned char lettreH = SEGMENT_F + SEGMENT_E + SEGMENT_G + SEGMENT_B + SEGMENT_C; const unsigned char lettreI = SEGMENT_B + SEGMENT_C; const unsigned char lettreJ = SEGMENT_B + SEGMENT_C + SEGMENT_D; // Pas de K const unsigned char lettreL = SEGMENT_F + SEGMENT_E + SEGMENT_D; const unsigned char lettreM = SEGMENT_E + SEGMENT_F + SEGMENT_A + SEGMENT_B + SEGMENT_C; // Comme le N const unsigned char lettreN = SEGMENT_E + SEGMENT_F + SEGMENT_A + SEGMENT_B + SEGMENT_C; // Comme le M const unsigned char lettreO = SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F; // Comme le D et le Q const unsigned char lettreP = SEGMENT_E + SEGMENT_F + SEGMENT_A + SEGMENT_B + SEGMENT_G; const unsigned char lettreQ = SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F; // Comme le D et le 0 const unsigned char lettreR = SEGMENT_E + SEGMENT_F + SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_G; // Comme le A const unsigned char lettreS = SEGMENT_A + SEGMENT_F + SEGMENT_G + SEGMENT_C + SEGMENT_D; const unsigned char lettreT = SEGMENT_F + SEGMENT_E + SEGMENT_G; // en minuscule const unsigned char lettreU = SEGMENT_F + SEGMENT_E + SEGMENT_D + SEGMENT_C + SEGMENT_B; // Comme le V const unsigned char lettreV = SEGMENT_F + SEGMENT_E + SEGMENT_D + SEGMENT_C + SEGMENT_B; // Comme le U // Pas de W // Pas de X const unsigned char lettreY = SEGMENT_F + SEGMENT_G + SEGMENT_B + SEGMENT_C + SEGMENT_D; // Pas de Z // // Le capteur // const int PulseWire = 0; // Le lecteur est connecte sur la broche analogique 0. const int LED = 12; // La LED est connectee sur le connecteur numerique 12. int Threshold = 550; // Valeur a ajuster pour ignorer les lectures fausses. int iComptePulsations = 0; // Compteur de pulsations. int iTotalPulsations; // Pour le calcul de la moyenne. int iMoyennePulsations; long int iDebut = 0; // Pour reboot automatique. long int iFin = 0; // PulseSensorPlayground pulseSensor; // Cree une instance de l'objet. // // ! ===== ! // ! SETUP ! // ! ===== ! // void setup() { Serial.begin(9600); Serial.println("Debut"); // Configure la LED de sortie pinMode(LED, OUTPUT); digitalWrite(LED, LOW); // Pour l'ecran a LEDS pinMode(strobe, OUTPUT); pinMode(clock, OUTPUT); pinMode(data, OUTPUT); sendCommand(0x8f); reset(); sendCommand(0x44); // Configure le lecteur pulseSensor.analogInput(PulseWire); pulseSensor.setThreshold(Threshold); // Demarre et teste le lecteur if (pulseSensor.begin()) { Serial.println("pulseSensor.begin : Correct."); } else { Serial.println("pulseSensor.begin : Erreur."); } } // // ! ==== ! // ! LOOP ! // ! ==== ! // void loop() { // Ecrit MESURE__ digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); shiftOut(data, clock, LSBFIRST, lettreM); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc2); shiftOut(data, clock, LSBFIRST, lettreE); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc4); shiftOut(data, clock, LSBFIRST, lettreS); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc6); shiftOut(data, clock, LSBFIRST, lettreU); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc8); shiftOut(data, clock, LSBFIRST, lettreR); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xca); shiftOut(data, clock, LSBFIRST, lettreE); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xcc); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xce); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); delay(2000); effaceTout(); // Ecrit DU_POULS digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); shiftOut(data, clock, LSBFIRST, lettreD); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc2); shiftOut(data, clock, LSBFIRST, lettreU); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc4); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc6); shiftOut(data, clock, LSBFIRST, lettreP); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc8); shiftOut(data, clock, LSBFIRST, lettreO); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xca); shiftOut(data, clock, LSBFIRST, lettreU); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xcc); shiftOut(data, clock, LSBFIRST, lettreL); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xce); shiftOut(data, clock, LSBFIRST, lettreS); digitalWrite(strobe, HIGH); delay(2000); effaceTout; // On ecrit PULSE___ digitalWrite(LED, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); shiftOut(data, clock, LSBFIRST, lettreP); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc2); shiftOut(data, clock, LSBFIRST, lettreU); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc4); shiftOut(data, clock, LSBFIRST, lettreL); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc6); shiftOut(data, clock, LSBFIRST, lettreS); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc8); shiftOut(data, clock, LSBFIRST, lettreE); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xca); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xcc); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xce); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(LED, LOW); // Teste sur dix battements int iPulsation = 0; iComptePulsations = 10; iTotalPulsations = 0; iDebut = millis(); while (iComptePulsations > 0) { if (pulseSensor.sawStartOfBeat()) { iPulsation = pulseSensor.getBeatsPerMinute(); if ((iPulsation > 40) & (iPulsation < 200)) { iComptePulsations--; iTotalPulsations = iTotalPulsations + iPulsation; Serial.println(iPulsation); iPulsation = pulseSensor.getBeatsPerMinute(); // On ecrit le numero digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xce); shiftOut(data, clock, LSBFIRST, chiffres[iComptePulsations]); digitalWrite(strobe, HIGH); // On allume la LED digitalWrite(LED, HIGH); delay(20); // On eteint la LED digitalWrite(LED, LOW); } } iFin = millis(); if (iFin - iDebut > 100000) Reboot(); // La mesure a ete abandonnee. } // On calcule la moyenne iMoyennePulsations = iTotalPulsations / 10; // On ecrit MOYENNE_ digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); shiftOut(data, clock, LSBFIRST, lettreM); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc2); shiftOut(data, clock, LSBFIRST, lettreO); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc4); shiftOut(data, clock, LSBFIRST, lettreY); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc6); shiftOut(data, clock, LSBFIRST, lettreE); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc8); shiftOut(data, clock, LSBFIRST, lettreN); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xca); shiftOut(data, clock, LSBFIRST, lettreN); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xcc); shiftOut(data, clock, LSBFIRST, lettreE); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xce); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); delay(2000); effaceTout(); // On affiche le resultat int iCentaines = 0; int iMilliers = 0; int iDizaines = 0; int iUnites = 0; if (iMoyennePulsations > 1000) { iMilliers = int(iMoyennePulsations / 1000); iMoyennePulsations = iMoyennePulsations - iMilliers * 1000; } else { iMilliers = 0; } if (iMoyennePulsations > 100) { iCentaines = int(iMoyennePulsations / 100); iMoyennePulsations = iMoyennePulsations - iCentaines * 100; } else { iCentaines = 0; } if (iMoyennePulsations > 10) { iDizaines = int(iMoyennePulsations / 10); iMoyennePulsations = iMoyennePulsations - iDizaines * 10; } else { iDizaines = 0; } iUnites = iMoyennePulsations; digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); shiftOut(data, clock, LSBFIRST, chiffres[0x00]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc2); shiftOut(data, clock, LSBFIRST, chiffres[iCentaines]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc4); shiftOut(data, clock, LSBFIRST, chiffres[iDizaines]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc6); shiftOut(data, clock, LSBFIRST, chiffres[iUnites]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc8); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xca); shiftOut(data, clock, LSBFIRST, lettreB); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xcc); shiftOut(data, clock, LSBFIRST, lettreP); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xce); shiftOut(data, clock, LSBFIRST, lettreM); digitalWrite(strobe, HIGH); delay(5000); effaceTout(); } // // ! ========== ! // ! PROCEDURES ! // ! ========== ! // // : -------------------------------- : // : Efface totalement l'ecran a LEDS : // : -------------------------------- : // void effaceTout() { digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc2); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc4); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc6); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc8); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xca); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xcc); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xce); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); } // // : ------- : // : Reboote : // : ------- : // void Reboot() { // On ecrit RELANCE_ digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); shiftOut(data, clock, LSBFIRST, lettreR); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc2); shiftOut(data, clock, LSBFIRST, lettreE); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc4); shiftOut(data, clock, LSBFIRST, lettreL); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc6); shiftOut(data, clock, LSBFIRST, lettreA); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc8); shiftOut(data, clock, LSBFIRST, lettreN); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xca); shiftOut(data, clock, LSBFIRST, lettreC); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xcc); shiftOut(data, clock, LSBFIRST, lettreE); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xce); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); delay(2000); effaceTout(); wdt_enable(WDTO_15MS); while (1) { } } // // : ------------------------------------- : // : Initialisation de l'afficheur digital : // : ------------------------------------- : // void sendCommand(uint8_t value) { digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, value); digitalWrite(strobe, HIGH); } // void reset() { sendCommand(0x40); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); for (uint8_t i = 0; i < 16; i++) { shiftOut(data, clock, LSBFIRST, 0x00); } digitalWrite(strobe, HIGH); }