Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@19:abddc058f6d1, 2017-01-30 (annotated)
- Committer:
- marc1119
- Date:
- Mon Jan 30 17:04:20 2017 +0000
- Revision:
- 19:abddc058f6d1
- Parent:
- 18:01c6a7ee0914
- Child:
- 20:8815d51406a9
Essaie de le r?duire
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| benjaminroy | 18:01c6a7ee0914 | 1 | #include "AnalogIn.h" |
| benjaminroy | 18:01c6a7ee0914 | 2 | #include "DigitalIn.h" |
| benjaminroy | 18:01c6a7ee0914 | 3 | #include "Ticker.h" |
| benjaminroy | 18:01c6a7ee0914 | 4 | #include "Serial.h" |
| benjaminroy | 1:d37b1a61bd0b | 5 | #include "rtos.h" |
| marc1119 | 19:abddc058f6d1 | 6 | |
| marc1119 | 2:94e2eebf1524 | 7 | Thread *t1; |
| marc1119 | 2:94e2eebf1524 | 8 | Thread *t2; |
| benjaminroy | 18:01c6a7ee0914 | 9 | Mutex mutex; |
| marc1119 | 2:94e2eebf1524 | 10 | |
| benjaminroy | 3:fa3112b2216c | 11 | uint8_t compteur = 0; |
| benjaminroy | 5:79b5773e6764 | 12 | bool verifierSiStable = false; |
| benjaminroy | 6:6da143aff561 | 13 | |
| benjaminroy | 9:8549816b1cac | 14 | /* Mail */ |
| marc1119 | 7:e9f5280d47b3 | 15 | typedef struct { |
| benjaminroy | 9:8549816b1cac | 16 | char* temps; // Étampe indiquant l’heure et la date de l'occurrence |
| benjaminroy | 9:8549816b1cac | 17 | uint8_t broche; // Le numéro de la broche |
| marc1119 | 7:e9f5280d47b3 | 18 | } mail_t; |
| marc1119 | 7:e9f5280d47b3 | 19 | |
| benjaminroy | 14:3b72daf433fb | 20 | Mail<mail_t, 16> mail_box; |
| benjaminroy | 9:8549816b1cac | 21 | |
| benjaminroy | 3:fa3112b2216c | 22 | // ------------------------------------------------------- |
| benjaminroy | 3:fa3112b2216c | 23 | // ------------------------------------------------------- |
| benjaminroy | 3:fa3112b2216c | 24 | |
| benjaminroy | 18:01c6a7ee0914 | 25 | void envoyer_mail(uint8_t broche) { |
| benjaminroy | 18:01c6a7ee0914 | 26 | mutex.lock(); |
| benjaminroy | 9:8549816b1cac | 27 | time_t secondes = time(NULL); |
| benjaminroy | 18:01c6a7ee0914 | 28 | mutex.unlock(); |
| benjaminroy | 18:01c6a7ee0914 | 29 | |
| benjaminroy | 9:8549816b1cac | 30 | mail_t *mail = mail_box.alloc(); |
| benjaminroy | 9:8549816b1cac | 31 | mail->temps = ctime(&secondes); |
| benjaminroy | 9:8549816b1cac | 32 | mail->broche = broche; |
| marc1119 | 7:e9f5280d47b3 | 33 | mail_box.put(mail); |
| marc1119 | 7:e9f5280d47b3 | 34 | } |
| marc1119 | 7:e9f5280d47b3 | 35 | |
| benjaminroy | 1:d37b1a61bd0b | 36 | void lecture_analog(void const *args) { |
| benjaminroy | 9:8549816b1cac | 37 | uint8_t i = 0; |
| benjaminroy | 6:6da143aff561 | 38 | float moyenne_passee1 = -1; |
| benjaminroy | 6:6da143aff561 | 39 | float moyenne_passee2 = -1; |
| benjaminroy | 14:3b72daf433fb | 40 | float echantillons1[5]; |
| benjaminroy | 18:01c6a7ee0914 | 41 | float echantillons2[5]; |
| benjaminroy | 18:01c6a7ee0914 | 42 | float seuil = 0.125; |
| marc1119 | 19:abddc058f6d1 | 43 | AnalogIn ea_1(p19); |
| marc1119 | 19:abddc058f6d1 | 44 | AnalogIn ea_2(p20); |
| benjaminroy | 14:3b72daf433fb | 45 | |
| benjaminroy | 6:6da143aff561 | 46 | while (true) { |
| benjaminroy | 9:8549816b1cac | 47 | /*** Synchronisation sur la période d'échantillonnage ***/ |
| benjaminroy | 6:6da143aff561 | 48 | Thread::signal_wait(0x1); |
| benjaminroy | 6:6da143aff561 | 49 | |
| benjaminroy | 9:8549816b1cac | 50 | /*** Lecture des échantillons analogiques ***/ |
| benjaminroy | 6:6da143aff561 | 51 | float entreeanal_1 = ea_1.read(); |
| benjaminroy | 6:6da143aff561 | 52 | float entreeanal_2 = ea_2.read(); |
| benjaminroy | 6:6da143aff561 | 53 | |
| benjaminroy | 6:6da143aff561 | 54 | echantillons1[i] = entreeanal_1; |
| benjaminroy | 6:6da143aff561 | 55 | echantillons2[i] = entreeanal_2; |
| benjaminroy | 6:6da143aff561 | 56 | |
| benjaminroy | 6:6da143aff561 | 57 | i++; |
| benjaminroy | 6:6da143aff561 | 58 | if (i == 5) { |
| benjaminroy | 9:8549816b1cac | 59 | /*** Calcul de la moyenne courante du signal (calculée sur 5 échantillons successifs) ***/ |
| benjaminroy | 6:6da143aff561 | 60 | float moyenne_courante1 = (echantillons1[0] + echantillons1[1] + echantillons1[2] + echantillons1[3] + echantillons1[4]) / 5; |
| benjaminroy | 6:6da143aff561 | 61 | float moyenne_courante2 = (echantillons2[0] + echantillons2[1] + echantillons2[2] + echantillons2[3] + echantillons2[4]) / 5; |
| benjaminroy | 6:6da143aff561 | 62 | |
| benjaminroy | 6:6da143aff561 | 63 | if (moyenne_passee1 != -1) { |
| benjaminroy | 6:6da143aff561 | 64 | if ((std::abs(1 - (moyenne_courante1 / moyenne_passee1))) > seuil) { |
| benjaminroy | 18:01c6a7ee0914 | 65 | envoyer_mail(19); /*** Génération éventuelle d'un événement ***/ |
| benjaminroy | 6:6da143aff561 | 66 | } |
| benjaminroy | 6:6da143aff561 | 67 | } |
| benjaminroy | 6:6da143aff561 | 68 | if (moyenne_passee2 != -1) { |
| benjaminroy | 6:6da143aff561 | 69 | if ((std::abs(1 - (moyenne_courante2 / moyenne_passee2))) > seuil) { |
| benjaminroy | 18:01c6a7ee0914 | 70 | envoyer_mail(20); /*** Génération éventuelle d'un événement ***/ |
| benjaminroy | 6:6da143aff561 | 71 | } |
| benjaminroy | 6:6da143aff561 | 72 | } |
| benjaminroy | 6:6da143aff561 | 73 | moyenne_passee1 = moyenne_courante1; |
| benjaminroy | 6:6da143aff561 | 74 | moyenne_passee2 = moyenne_courante2; |
| benjaminroy | 6:6da143aff561 | 75 | i = 0; |
| benjaminroy | 6:6da143aff561 | 76 | } |
| benjaminroy | 0:4f447b02a32f | 77 | } |
| benjaminroy | 0:4f447b02a32f | 78 | } |
| marc1119 | 2:94e2eebf1524 | 79 | |
| benjaminroy | 14:3b72daf433fb | 80 | void lecture_num(void const *args) { |
| benjaminroy | 18:01c6a7ee0914 | 81 | bool valeurs[2] = {0}; |
| marc1119 | 19:abddc058f6d1 | 82 | DigitalIn en_1(p15); |
| marc1119 | 19:abddc058f6d1 | 83 | DigitalIn en_2(p16); |
| marc1119 | 19:abddc058f6d1 | 84 | |
| benjaminroy | 1:d37b1a61bd0b | 85 | while (true) { |
| benjaminroy | 9:8549816b1cac | 86 | /*** Synchronisation sur la période d'échantillonnage ***/ |
| marc1119 | 2:94e2eebf1524 | 87 | Thread::signal_wait(0x1); |
| benjaminroy | 6:6da143aff561 | 88 | |
| benjaminroy | 9:8549816b1cac | 89 | /*** Lecture des échantillons numériques ***/ |
| benjaminroy | 3:fa3112b2216c | 90 | uint8_t entreenum_1 = en_1.read(); |
| benjaminroy | 3:fa3112b2216c | 91 | uint8_t entreenum_2 = en_2.read(); |
| benjaminroy | 3:fa3112b2216c | 92 | |
| benjaminroy | 9:8549816b1cac | 93 | /*** Prise en charge du phénomène de rebond ***/ |
| benjaminroy | 18:01c6a7ee0914 | 94 | if (entreenum_1 != valeurs[0]) { |
| benjaminroy | 5:79b5773e6764 | 95 | verifierSiStable = true; |
| benjaminroy | 5:79b5773e6764 | 96 | Thread::signal_wait(0x2); |
| benjaminroy | 18:01c6a7ee0914 | 97 | valeurs[0] = entreenum_1; |
| benjaminroy | 5:79b5773e6764 | 98 | |
| benjaminroy | 13:29991a8767fe | 99 | if (entreenum_1 == en_1.read()) { |
| benjaminroy | 18:01c6a7ee0914 | 100 | envoyer_mail(15); /*** Génération d'un évènement... ***/ |
| benjaminroy | 10:200ebb491b60 | 101 | } |
| benjaminroy | 13:29991a8767fe | 102 | } |
| benjaminroy | 18:01c6a7ee0914 | 103 | if (entreenum_2 != valeurs[1]) { |
| benjaminroy | 13:29991a8767fe | 104 | verifierSiStable = true; |
| benjaminroy | 13:29991a8767fe | 105 | Thread::signal_wait(0x2); |
| benjaminroy | 18:01c6a7ee0914 | 106 | valeurs[1] = entreenum_2; |
| benjaminroy | 13:29991a8767fe | 107 | |
| benjaminroy | 13:29991a8767fe | 108 | if (entreenum_2 == en_2.read()) { |
| benjaminroy | 18:01c6a7ee0914 | 109 | envoyer_mail(16); /*** Génération d'un évènement... ***/ |
| benjaminroy | 5:79b5773e6764 | 110 | } |
| benjaminroy | 13:29991a8767fe | 111 | } |
| benjaminroy | 13:29991a8767fe | 112 | Thread::yield(); |
| benjaminroy | 1:d37b1a61bd0b | 113 | } |
| benjaminroy | 1:d37b1a61bd0b | 114 | } |
| marc1119 | 2:94e2eebf1524 | 115 | |
| benjaminroy | 1:d37b1a61bd0b | 116 | void collection(void const *args) { |
| marc1119 | 19:abddc058f6d1 | 117 | Serial pc(USBTX, USBRX); // tx, rx |
| marc1119 | 19:abddc058f6d1 | 118 | while (true) { |
| benjaminroy | 9:8549816b1cac | 119 | /*** Attente et lecture d'un événement ***/ |
| marc1119 | 7:e9f5280d47b3 | 120 | osEvent evt = mail_box.get(); |
| marc1119 | 7:e9f5280d47b3 | 121 | if (evt.status == osEventMail) { |
| marc1119 | 7:e9f5280d47b3 | 122 | mail_t *mail = (mail_t*)evt.value.p; |
| benjaminroy | 9:8549816b1cac | 123 | |
| benjaminroy | 9:8549816b1cac | 124 | /*** Écriture de l'événement en sortie (port série) ***/ |
| benjaminroy | 18:01c6a7ee0914 | 125 | pc.printf("Entree %d\nDate: %s\n", mail->broche, mail->temps); |
| marc1119 | 7:e9f5280d47b3 | 126 | mail_box.free(mail); |
| benjaminroy | 18:01c6a7ee0914 | 127 | } |
| benjaminroy | 1:d37b1a61bd0b | 128 | } |
| benjaminroy | 1:d37b1a61bd0b | 129 | } |
| marc1119 | 2:94e2eebf1524 | 130 | |
| benjaminroy | 3:fa3112b2216c | 131 | void alarm() { |
| benjaminroy | 3:fa3112b2216c | 132 | compteur++; |
| benjaminroy | 5:79b5773e6764 | 133 | |
| benjaminroy | 5:79b5773e6764 | 134 | if (verifierSiStable) { |
| benjaminroy | 5:79b5773e6764 | 135 | t1->signal_set(0x2); |
| benjaminroy | 5:79b5773e6764 | 136 | verifierSiStable = false; |
| benjaminroy | 5:79b5773e6764 | 137 | } |
| benjaminroy | 3:fa3112b2216c | 138 | |
| benjaminroy | 9:8549816b1cac | 139 | if (compteur % 2 == 0) { // Entrées numériques échantillionnées à tous les 100 ms |
| benjaminroy | 3:fa3112b2216c | 140 | t1->signal_set(0x1); |
| benjaminroy | 9:8549816b1cac | 141 | } else if (compteur % 5 == 0) { // Entrées analogiques échantillonnées à tous les 250 ms |
| benjaminroy | 6:6da143aff561 | 142 | t2->signal_set(0x1); |
| marc1119 | 2:94e2eebf1524 | 143 | } |
| benjaminroy | 3:fa3112b2216c | 144 | |
| benjaminroy | 3:fa3112b2216c | 145 | if (compteur % 10 == 0) { |
| benjaminroy | 3:fa3112b2216c | 146 | compteur = 0; |
| benjaminroy | 3:fa3112b2216c | 147 | } |
| marc1119 | 2:94e2eebf1524 | 148 | } |
| marc1119 | 2:94e2eebf1524 | 149 | |
| benjaminroy | 1:d37b1a61bd0b | 150 | int main() { |
| benjaminroy | 9:8549816b1cac | 151 | /*** Démarrage des tâches ***/ |
| marc1119 | 2:94e2eebf1524 | 152 | Thread t_lectureNum(lecture_num); |
| benjaminroy | 6:6da143aff561 | 153 | Thread t_lectureAnalog(lecture_analog); |
| marc1119 | 2:94e2eebf1524 | 154 | Thread t_collection(collection); |
| marc1119 | 2:94e2eebf1524 | 155 | |
| marc1119 | 2:94e2eebf1524 | 156 | t1 = &t_lectureNum; |
| benjaminroy | 6:6da143aff561 | 157 | t2 = &t_lectureAnalog; |
| benjaminroy | 3:fa3112b2216c | 158 | |
| benjaminroy | 9:8549816b1cac | 159 | /*** Initialisation du RTC ***/ |
| marc1119 | 19:abddc058f6d1 | 160 | Ticker ticker; |
| benjaminroy | 9:8549816b1cac | 161 | set_time(1485514920); // Set RTC time to... |
| benjaminroy | 6:6da143aff561 | 162 | ticker.attach(&alarm, 0.05); |
| benjaminroy | 5:79b5773e6764 | 163 | |
| benjaminroy | 8:56f2b8db5361 | 164 | while(1); |
| benjaminroy | 1:d37b1a61bd0b | 165 | } |