Code APP6

Dependencies:   mbed mbed-rtos

Committer:
GaiSensei
Date:
Tue Apr 04 19:55:17 2017 +0000
Revision:
1:b868d04610be
Parent:
0:4101acb9ab42
GG

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GaiSensei 1:b868d04610be 1 /////////////////////////////////////////////////////////////
GaiSensei 1:b868d04610be 2 // APP 6: Propriétés des matériaux et capteurs //
GaiSensei 1:b868d04610be 3 // //
GaiSensei 1:b868d04610be 4 // Université de Sherbrooke //
GaiSensei 1:b868d04610be 5 // Génie informatique //
GaiSensei 1:b868d04610be 6 // Session 5, Hiver 2017 //
GaiSensei 1:b868d04610be 7 // //
GaiSensei 1:b868d04610be 8 // Date: 5 avril 2017 //
GaiSensei 1:b868d04610be 9 // //
GaiSensei 1:b868d04610be 10 // Auteurs: Maxime Dupuis, dupm2216 //
GaiSensei 1:b868d04610be 11 // Bruno Allaire-Lemay, allb2701 //
GaiSensei 1:b868d04610be 12 /////////////////////////////////////////////////////////////
GaiSensei 1:b868d04610be 13
GaiSensei 0:4101acb9ab42 14 #include "mbed.h"
GaiSensei 1:b868d04610be 15 #include "rtos.h"
GaiSensei 0:4101acb9ab42 16 #include <cmath>
GaiSensei 1:b868d04610be 17
GaiSensei 0:4101acb9ab42 18 const float coefficients[6] = {4.7378, -9.0288, 14.136, -10.126, 3.2801, -0.3927};
GaiSensei 0:4101acb9ab42 19 AnalogIn input(p15);
GaiSensei 0:4101acb9ab42 20
GaiSensei 1:b868d04610be 21 //Lit la tension sur la pin 15 et effectue la conversion analogue à digitale sur 16 bits. Retourne la tension lue en volts.
GaiSensei 0:4101acb9ab42 22 float read_voltage()
GaiSensei 0:4101acb9ab42 23 {
GaiSensei 0:4101acb9ab42 24 const float ratio = 19859.4;
GaiSensei 0:4101acb9ab42 25 float voltage = (float) input.read_u16();
GaiSensei 0:4101acb9ab42 26 return voltage / ratio;
GaiSensei 0:4101acb9ab42 27 }
GaiSensei 0:4101acb9ab42 28
GaiSensei 1:b868d04610be 29 //Calcul le niveau du liquide à partir des coefficients de la courbe de régression et de la tension lue.
GaiSensei 0:4101acb9ab42 30 float get_liquid_level_cm(const float* coefficients, const int number_of_coefficients, const float hall_sensor_voltage)
GaiSensei 0:4101acb9ab42 31 {
GaiSensei 0:4101acb9ab42 32 float liquid_level_cm = 54;
GaiSensei 0:4101acb9ab42 33 for(int i=0; i<number_of_coefficients; i++)
GaiSensei 0:4101acb9ab42 34 {
GaiSensei 0:4101acb9ab42 35 liquid_level_cm -= pow(hall_sensor_voltage, (float)i) * coefficients[i];
GaiSensei 0:4101acb9ab42 36 }
GaiSensei 0:4101acb9ab42 37 return liquid_level_cm;
GaiSensei 0:4101acb9ab42 38 }
GaiSensei 0:4101acb9ab42 39
GaiSensei 1:b868d04610be 40 //Appel les fonctions de lecture et de calcul du niveau. Affiche le niveau.
GaiSensei 1:b868d04610be 41 void read_and_display_level_cm(void const *args)
GaiSensei 0:4101acb9ab42 42 {
GaiSensei 0:4101acb9ab42 43 float voltage;
GaiSensei 0:4101acb9ab42 44 float liquid_level_cm;
GaiSensei 1:b868d04610be 45 voltage = read_voltage();
GaiSensei 1:b868d04610be 46 liquid_level_cm = get_liquid_level_cm(coefficients, 6, voltage);
GaiSensei 1:b868d04610be 47 printf("Niveau du liquide (cm) : %f\r\n", liquid_level_cm);
GaiSensei 1:b868d04610be 48 }
GaiSensei 1:b868d04610be 49
GaiSensei 1:b868d04610be 50 //Lit, calcul et affiche le niveau du liquide à toutes les 50 millisecondes.
GaiSensei 1:b868d04610be 51 int main()
GaiSensei 1:b868d04610be 52 {
GaiSensei 1:b868d04610be 53 RtosTimer timer(read_and_display_level_cm, osTimerPeriodic);
GaiSensei 1:b868d04610be 54 timer.start(50);
GaiSensei 0:4101acb9ab42 55
GaiSensei 0:4101acb9ab42 56 while(1)
GaiSensei 0:4101acb9ab42 57 {
GaiSensei 0:4101acb9ab42 58 }
GaiSensei 1:b868d04610be 59 }