//AlarmeSonoreTemperature130420 //Ce système active une Led (+ buzzer en option) //dès que l'aiguille du cadran dépasse la valeur d'étalonnage //Adaptable à tout cadran: pression d'huile, température d'huile... //La tension de batterie variant entre 10V et 15V, aucune influence sur l'alarme //**************** IMPORTANT********************** //Les sondes detempérature sont en general de type CTN (Coefficient de Température Negatif) //On le verifie soit à l'ohmètre Rfroid > Rchaud soit au voltmètre sur la sonde Vfroid > Vchaud //Si on est dans le cas contraire (CTPositif), changer la valeur de CTN ci dessous de 1 à 0 //Pour etalonner la valeur d'alarme //Connecter le +12V après contact, la masse, et le fil vers la sonde //En general le plus simple est de connecter ces 3 fils à l'arrière du cadran //Positionner le cavalier pour mettre le potard en circuit //Garder appuyé le Bouton Poussoir (BP) AVANT de mettre le contact //Contact mis, attendre 3s pour relacher le BP: la Led s'allume //Ajuster le potard pour que l'aiguille du cadran indique la valeur d'alarme //Pousser le BP pour enregistrer la valeur d'alarme et le relacher //La Led clignote en permanance, l'enregistrement a été effectué //Couper le contact ET NE PAS OUBLIER D'ENLEVER LE CAVALIER DU POTARD #include #define BP 6//Bouton poussoir entre D6 et masse #define Vbat A0//Batterie sur A0 après diviseur de tension #define Vsonde A2//Sonde sur A2 après diviseur de tension #define Buzzer 2 #define Led 4 //************************************************************* int CTN = 1; //A changer pour 0 en cas de CTP //************************************************************* float k = 0; //Ratio Rsonde/(Rsonde+Rcadran) stocké en EEp après etalonnage int Vb = 0; //V batterie reduit int Vs = 0; //Vsonde reduit int eepC = 0; // pointeur à l'EEPROM int stoRe = 0; //Valeur sur 16bits à ecrire en EEPROM int fromEep = 0; //Valeur sur 16bits relue de l'EEPROM int hiB = 0; //MSB lu de l'EEPROM 8 bits Most Significant Byte int loB = 0; //LSB lu de l'EEPROM 8 bits Least Significant Byte //********************Fonctions********************** void Etalonnage()/////////////////////// { // Enregistre Vb et Vs d'alarme en Eep Serial.println("Etalonnage"); WaitBPoff();// Revient si BP relaché après mise du contact digitalWrite(Led, 1);//OK pour ajuster le potard pour aiguille sur alarme delay(500); while (digitalRead(BP) == 1); //Attendre tant que BP non poussé //PB poussé digitalWrite(Led, 0); stoRe = analogRead(Vbat); //Lire Vbat sur 10 bits eepC = 0; //pointer en debut d'EPprom WriteEep16();//Vb en 0,1 stoRe = analogRead(Vsonde); //Lire Vsonde WriteEep16();//Vs en 2,3 while (1)LedBuz(); //On y reste en clignotant } void LedBuz()/////////////////////////// { digitalWrite(Led, 1); digitalWrite(Buzzer, 1); delay(1000);//Une seconde On digitalWrite(Led, 0); digitalWrite(Buzzer, 0); delay(1000);//Une seconde Off } void Lire_k()/////////////////////////////// { // Calcul k d'après l'Eep eepC = 0;// Début d'Eep ReadEep16(); //Lire Vb Vb = fromEep; ReadEep16(); //Lire Vs Vs = fromEep; if (Vs == 0)LedBuz(); //Erreur on bloque k = float(Vs ) / Vb; //Calcul de k Serial.print("k = "); Serial.println(k); } void ReadEep16()///////////////////////////////// { hiB = EEPROM.read(eepC); Serial.print("hiB__"); Serial.println(hiB); // Lecture de 8 bits MSByte eepC++; loB = EEPROM.read(eepC); Serial.print("loB__"); Serial.println(loB); // Lecture de 8 bits LSByte eepC++; //preparer prochaine adresse fromEep = (hiB << 8) + loB; // Regeneration des 16 bits, shift 8 fois à gauche du MSB et addition du LSB } void WaitBPoff()/////////////////////////////////// { while (digitalRead(BP) == 0)delay(300); // Tant que BP poussé delay(300); } void WriteEep16() ///////////////////////////////////// { Serial.print("Write_eepC__stoRe_"); Serial.println(eepC); Serial.println(stoRe); //while (1){} // Noter l'utilisation des fonctions highByte() et lowByte() pour extraire MSB et LSB EEPROM.write(eepC, highByte (stoRe)); //MSByte eepC ++; //preparer prochaine adresse EEPROM.write(eepC, lowByte (stoRe)); //LSByte eepC ++; } ///////////////////////////////////////////////////////////////////////////////////// void setup() { Serial.begin (9600); pinMode(BP, INPUT_PULLUP); //BP pour etalonnage pinMode(Led, OUTPUT); pinMode(Buzzer, OUTPUT); Serial.println(digitalRead(BP)); if (digitalRead(BP) == 0)Etalonnage(); //BP poussé on part étalonner Lire_k(); } //////////////////////////////////////////////////// void loop() { Vb = analogRead(Vbat); Vs = analogRead(Vsonde); Serial.print("Vb= "); Serial.print(Vb); Serial.print(" Vs= "); Serial.print(Vs); Serial.print(" Vs/Vb= "); Serial.println((float)Vs / Vb); delay(1000); switch (CTN) { case 0: if ((float)Vs / Vb > k)LedBuz(); break; // CTP Alarme si > k case 1: if ((float)Vs / Vb < k)LedBuz(); break; // CTN Alarme si < k } }