Programme du controleur d'humidité
Dependencies: DS3231 TextLCD ds3231 mbed
main.cpp@2:2aeef1e3e010, 2018-06-15 (annotated)
- Committer:
- TheoR
- Date:
- Fri Jun 15 12:17:02 2018 +0000
- Revision:
- 2:2aeef1e3e010
- Parent:
- 1:fa823064f03c
m
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TheoR | 0:f22ffbae6bef | 1 | #include "mbed.h" |
TheoR | 0:f22ffbae6bef | 2 | #include "stdlib.h" |
TheoR | 0:f22ffbae6bef | 3 | #include "TextLCD.h" |
TheoR | 0:f22ffbae6bef | 4 | #include "stdio.h" |
TheoR | 0:f22ffbae6bef | 5 | |
TheoR | 0:f22ffbae6bef | 6 | Serial pc(USBTX, USBRX); // tx, rx |
TheoR | 0:f22ffbae6bef | 7 | TextLCD lcd(PA_10,PB_3,PB_5,PB_4,PB_10,PA_8); // rs, e, d4-d7 |
TheoR | 0:f22ffbae6bef | 8 | AnalogIn capteur(PA_5); |
TheoR | 0:f22ffbae6bef | 9 | DigitalIn bouton(USER_BUTTON); |
TheoR | 0:f22ffbae6bef | 10 | DigitalOut myled(LED1); |
TheoR | 0:f22ffbae6bef | 11 | DigitalOut alarme(D9); |
TheoR | 0:f22ffbae6bef | 12 | DigitalOut ledverte(PB_9); |
TheoR | 0:f22ffbae6bef | 13 | |
TheoR | 0:f22ffbae6bef | 14 | I2C i2c(PC_1, PC_0); |
TheoR | 0:f22ffbae6bef | 15 | const int DS3231_ADDR = 0xd0; |
TheoR | 0:f22ffbae6bef | 16 | |
TheoR | 0:f22ffbae6bef | 17 | FILE *fp; |
TheoR | 0:f22ffbae6bef | 18 | char a='%'; |
TheoR | 0:f22ffbae6bef | 19 | void affichageinf (double valhum); |
TheoR | 0:f22ffbae6bef | 20 | void affichagesup (double valhum, double tpsdepa); |
TheoR | 0:f22ffbae6bef | 21 | void affichageini (void); |
TheoR | 0:f22ffbae6bef | 22 | double valhum; |
TheoR | 0:f22ffbae6bef | 23 | int delaimesure=2; //le delais en seconde entre deux mesures. |
TheoR | 0:f22ffbae6bef | 24 | int tpscritique = 10*60; // le temps critique de dépassement du taux d'humidité en seconde |
TheoR | 0:f22ffbae6bef | 25 | int tpssave=600; //le delais en seconde entre deux sauvegardes de données dans la carte SD. |
TheoR | 0:f22ffbae6bef | 26 | |
TheoR | 0:f22ffbae6bef | 27 | |
TheoR | 0:f22ffbae6bef | 28 | void ecritureSD(double valhum) |
TheoR | 0:f22ffbae6bef | 29 | { |
TheoR | 0:f22ffbae6bef | 30 | fp =fopen ("/sd/test.txt","a"); |
TheoR | 0:f22ffbae6bef | 31 | if (fp == NULL) { // Si on n'arrive pas a ouvrir le fichier dans la carte SD |
TheoR | 0:f22ffbae6bef | 32 | lcd.cls(); |
TheoR | 0:f22ffbae6bef | 33 | lcd.printf("Erreur carte SD"); // On affiche sur l'ecran LCD qu'il y a une erreur |
TheoR | 0:f22ffbae6bef | 34 | } else { |
TheoR | 0:f22ffbae6bef | 35 | // int ret; Car on en a pas besoin |
TheoR | 0:f22ffbae6bef | 36 | // int sec, Car on en a pas besoin |
TheoR | 0:f22ffbae6bef | 37 | int min, hour, day, date, month, year; |
TheoR | 0:f22ffbae6bef | 38 | char data_write[2]; |
TheoR | 0:f22ffbae6bef | 39 | char data_read[8]; |
TheoR | 0:f22ffbae6bef | 40 | data_write[0] = 0; |
TheoR | 0:f22ffbae6bef | 41 | i2c.write(DS3231_ADDR, data_write, 1, 0); |
TheoR | 0:f22ffbae6bef | 42 | |
TheoR | 0:f22ffbae6bef | 43 | // ret = i2c.read(DS3231_ADDR, data_read, 7, 0); |
TheoR | 0:f22ffbae6bef | 44 | // sec = (data_read[0] >> 4) * 10 + (data_read[0] & 0x0f); |
TheoR | 0:f22ffbae6bef | 45 | min = (data_read[1] >> 4) * 10 + (data_read[1] & 0x0f); |
TheoR | 0:f22ffbae6bef | 46 | hour = (data_read[2] >> 5 & 0x01) * 20 + (data_read[2] >> 4 & 0x01) * 10 + (data_read[2] & 0x0f); |
TheoR | 0:f22ffbae6bef | 47 | |
TheoR | 0:f22ffbae6bef | 48 | day = data_read[3] & 0x07; |
TheoR | 0:f22ffbae6bef | 49 | |
TheoR | 0:f22ffbae6bef | 50 | date = (data_read[4] >> 4) * 10 + (data_read[4] & 0x0f); |
TheoR | 0:f22ffbae6bef | 51 | month = (data_read[5] >> 4 & 0x01) * 10 + (data_read[5] & 0x0f); |
TheoR | 0:f22ffbae6bef | 52 | year = 2000 + (data_read[6] >> 4) * 10 + (data_read[6] & 0x0f); |
TheoR | 0:f22ffbae6bef | 53 | fprintf(fp,"%d-%02d-%02d %d %02d:%02d %.2f\n\r", year, month, date, day, hour, min, valhum); // Date = lundi, mardi, mercredi,... ? |
TheoR | 0:f22ffbae6bef | 54 | fclose(fp); |
TheoR | 0:f22ffbae6bef | 55 | } |
TheoR | 0:f22ffbae6bef | 56 | } |
TheoR | 0:f22ffbae6bef | 57 | |
TheoR | 0:f22ffbae6bef | 58 | void affichageini (void) |
TheoR | 0:f22ffbae6bef | 59 | { |
TheoR | 2:2aeef1e3e010 | 60 | //On affiche sur LCD le message d'initialisation |
TheoR | 2:2aeef1e3e010 | 61 | lcd.cls(); //utile pour signler qu'un reset manuel (bouton) a été effectué |
TheoR | 2:2aeef1e3e010 | 62 | lcd.printf("INITIALISATION"); |
TheoR | 0:f22ffbae6bef | 63 | lcd.locate(0,1); |
TheoR | 0:f22ffbae6bef | 64 | lcd.printf("DU SYSTEME ."); |
TheoR | 0:f22ffbae6bef | 65 | wait(1); |
TheoR | 0:f22ffbae6bef | 66 | lcd.locate(0,0); |
TheoR | 0:f22ffbae6bef | 67 | lcd.printf("INITIALISATION"); |
TheoR | 0:f22ffbae6bef | 68 | lcd.locate(0,1); |
TheoR | 0:f22ffbae6bef | 69 | lcd.printf("DU SYSTEME .."); |
TheoR | 0:f22ffbae6bef | 70 | wait(1); |
TheoR | 0:f22ffbae6bef | 71 | lcd.locate(0,0); |
TheoR | 0:f22ffbae6bef | 72 | lcd.printf("INITIALISATION"); |
TheoR | 0:f22ffbae6bef | 73 | lcd.locate(0,1); |
TheoR | 0:f22ffbae6bef | 74 | lcd.printf("DU SYSTEME ..."); |
TheoR | 0:f22ffbae6bef | 75 | wait(1); |
TheoR | 0:f22ffbae6bef | 76 | } |
TheoR | 0:f22ffbae6bef | 77 | |
TheoR | 0:f22ffbae6bef | 78 | void affichagesup (double valhum, int tpsdepa) |
TheoR | 0:f22ffbae6bef | 79 | { |
TheoR | 2:2aeef1e3e010 | 80 | //On affiche sur le LCD le message lié au taux supérieur à 5%Hr |
TheoR | 2:2aeef1e3e010 | 81 | int min = tpsdepa/60;//On récupère le nombre des dizaines du temps |
TheoR | 2:2aeef1e3e010 | 82 | int rs = tpsdepa%60; //On récupère le nombre des unités du temps |
TheoR | 0:f22ffbae6bef | 83 | lcd.cls(); |
TheoR | 0:f22ffbae6bef | 84 | lcd.locate(0,0); |
TheoR | 0:f22ffbae6bef | 85 | lcd.printf("HUM = %.2f",valhum); |
TheoR | 0:f22ffbae6bef | 86 | lcd.locate(12,0); |
TheoR | 0:f22ffbae6bef | 87 | lcd.printf("%cHR",a); |
TheoR | 0:f22ffbae6bef | 88 | lcd.locate(0,1); |
TheoR | 0:f22ffbae6bef | 89 | lcd.printf("TPS+5%c %dmin %ds",a,min,rs); |
TheoR | 0:f22ffbae6bef | 90 | } |
TheoR | 0:f22ffbae6bef | 91 | |
TheoR | 0:f22ffbae6bef | 92 | void affichageinf (double valhum) |
TheoR | 0:f22ffbae6bef | 93 | { |
TheoR | 2:2aeef1e3e010 | 94 | //On affiche sur le LCD le message lié aux taux ingérieur à 5%Hr |
TheoR | 2:2aeef1e3e010 | 95 | lcd.cls(); |
TheoR | 0:f22ffbae6bef | 96 | lcd.locate(0,0); |
TheoR | 0:f22ffbae6bef | 97 | lcd.printf("HUMIDITE MESUREE"); |
TheoR | 0:f22ffbae6bef | 98 | lcd.locate(0,1); |
TheoR | 0:f22ffbae6bef | 99 | lcd.printf("EST DE"); |
TheoR | 0:f22ffbae6bef | 100 | lcd.locate(8,1); |
TheoR | 0:f22ffbae6bef | 101 | lcd.printf("%.2f",valhum); |
TheoR | 0:f22ffbae6bef | 102 | lcd.locate(12,1); |
TheoR | 0:f22ffbae6bef | 103 | lcd.printf("%cHR",a); |
TheoR | 0:f22ffbae6bef | 104 | |
TheoR | 0:f22ffbae6bef | 105 | } |
TheoR | 0:f22ffbae6bef | 106 | |
TheoR | 0:f22ffbae6bef | 107 | int main() |
TheoR | 0:f22ffbae6bef | 108 | { |
TheoR | 0:f22ffbae6bef | 109 | int tpsdepa = 0; |
TheoR | 0:f22ffbae6bef | 110 | int compteur=0; |
TheoR | 0:f22ffbae6bef | 111 | alarme =0; |
TheoR | 0:f22ffbae6bef | 112 | ledverte=0; |
TheoR | 0:f22ffbae6bef | 113 | |
TheoR | 0:f22ffbae6bef | 114 | int compteursave=0; |
TheoR | 0:f22ffbae6bef | 115 | while(1) { |
TheoR | 0:f22ffbae6bef | 116 | ledverte=1; // On allume la led verte pour signaler que le système fonctionne |
TheoR | 0:f22ffbae6bef | 117 | affichageini(); // On affiche sur l'ecran LCD le message d'initialisation |
TheoR | 0:f22ffbae6bef | 118 | |
TheoR | 0:f22ffbae6bef | 119 | while(1) { // Boucle infini |
TheoR | 0:f22ffbae6bef | 120 | double valcapteur = capteur.read()*3.3f; //Récupération de la tension d'entrée du capteur, |
TheoR | 0:f22ffbae6bef | 121 | // qui est multipliée par la tension d'alimentation. Car la tension relevée est un pourcentage de |
TheoR | 0:f22ffbae6bef | 122 | // la tension d'alimentation (vout est comprise entre 0 et 1). |
TheoR | 0:f22ffbae6bef | 123 | double valhum = (valcapteur-3.3*0.1515)/(0.00636*3.3); // Conversion de la tension en taux d'humidité |
TheoR | 0:f22ffbae6bef | 124 | if (valhum < 5.0) { // Si le taux d'humidité est inférieur à 5% Hr |
TheoR | 0:f22ffbae6bef | 125 | affichageinf (valhum); // On affiche sur le LCD le message lié au taux est inférieur à 5% Hr |
TheoR | 0:f22ffbae6bef | 126 | compteur = compteur +1; // Incrémentation du compteur |
TheoR | 0:f22ffbae6bef | 127 | if (compteur == 5) { // remise a zéro du compteur et éxtinction de l'alarme à partir de |
TheoR | 0:f22ffbae6bef | 128 | tpsdepa=0; // 5 mesures consécutives en dessous de 5% |
TheoR | 0:f22ffbae6bef | 129 | compteur =0; |
TheoR | 0:f22ffbae6bef | 130 | alarme =0; |
TheoR | 0:f22ffbae6bef | 131 | } |
TheoR | 0:f22ffbae6bef | 132 | } |
TheoR | 0:f22ffbae6bef | 133 | if (valhum >= 5.0) {// Si la valeur est supérieur ou égale à 5% Hr |
TheoR | 0:f22ffbae6bef | 134 | compteur =0; // Reset du compteur |
TheoR | 0:f22ffbae6bef | 135 | affichagesup (valhum,tpsdepa); // On affiche sur le LCD le message lié au taux supérieur à 5% Hr |
TheoR | 0:f22ffbae6bef | 136 | tpsdepa = tpsdepa+delaimesure; // Incrémentation du temps de dépassement |
TheoR | 0:f22ffbae6bef | 137 | if (tpsdepa > 300) { // Si le temps de dépassement est supérieur au temps critique, |
TheoR | 0:f22ffbae6bef | 138 | alarme=1; // on déclenche l'alarme |
TheoR | 0:f22ffbae6bef | 139 | } |
TheoR | 0:f22ffbae6bef | 140 | if (compteursave>=tpssave) { |
TheoR | 0:f22ffbae6bef | 141 | compteursave=0; |
TheoR | 0:f22ffbae6bef | 142 | ecritureSD(valhum); |
TheoR | 0:f22ffbae6bef | 143 | } |
TheoR | 0:f22ffbae6bef | 144 | compteursave = compteursave + delaimesure; |
TheoR | 0:f22ffbae6bef | 145 | wait(delaimesure); |
TheoR | 0:f22ffbae6bef | 146 | |
TheoR | 0:f22ffbae6bef | 147 | } |
TheoR | 0:f22ffbae6bef | 148 | } |
TheoR | 0:f22ffbae6bef | 149 | } |
TheoR | 0:f22ffbae6bef | 150 | } |
TheoR | 0:f22ffbae6bef | 151 | |
TheoR | 0:f22ffbae6bef | 152 | |
TheoR | 0:f22ffbae6bef | 153 |