Programme du controleur d'humidité
Dependencies: DS3231 TextLCD ds3231 mbed
main.cpp
- Committer:
- TheoR
- Date:
- 2018-06-15
- Revision:
- 2:2aeef1e3e010
- Parent:
- 1:fa823064f03c
File content as of revision 2:2aeef1e3e010:
#include "mbed.h" #include "stdlib.h" #include "TextLCD.h" #include "stdio.h" Serial pc(USBTX, USBRX); // tx, rx TextLCD lcd(PA_10,PB_3,PB_5,PB_4,PB_10,PA_8); // rs, e, d4-d7 AnalogIn capteur(PA_5); DigitalIn bouton(USER_BUTTON); DigitalOut myled(LED1); DigitalOut alarme(D9); DigitalOut ledverte(PB_9); I2C i2c(PC_1, PC_0); const int DS3231_ADDR = 0xd0; FILE *fp; char a='%'; void affichageinf (double valhum); void affichagesup (double valhum, double tpsdepa); void affichageini (void); double valhum; int delaimesure=2; //le delais en seconde entre deux mesures. int tpscritique = 10*60; // le temps critique de dépassement du taux d'humidité en seconde int tpssave=600; //le delais en seconde entre deux sauvegardes de données dans la carte SD. void ecritureSD(double valhum) { fp =fopen ("/sd/test.txt","a"); if (fp == NULL) { // Si on n'arrive pas a ouvrir le fichier dans la carte SD lcd.cls(); lcd.printf("Erreur carte SD"); // On affiche sur l'ecran LCD qu'il y a une erreur } else { // int ret; Car on en a pas besoin // int sec, Car on en a pas besoin int min, hour, day, date, month, year; char data_write[2]; char data_read[8]; data_write[0] = 0; i2c.write(DS3231_ADDR, data_write, 1, 0); // ret = i2c.read(DS3231_ADDR, data_read, 7, 0); // sec = (data_read[0] >> 4) * 10 + (data_read[0] & 0x0f); min = (data_read[1] >> 4) * 10 + (data_read[1] & 0x0f); hour = (data_read[2] >> 5 & 0x01) * 20 + (data_read[2] >> 4 & 0x01) * 10 + (data_read[2] & 0x0f); day = data_read[3] & 0x07; date = (data_read[4] >> 4) * 10 + (data_read[4] & 0x0f); month = (data_read[5] >> 4 & 0x01) * 10 + (data_read[5] & 0x0f); year = 2000 + (data_read[6] >> 4) * 10 + (data_read[6] & 0x0f); fprintf(fp,"%d-%02d-%02d %d %02d:%02d %.2f\n\r", year, month, date, day, hour, min, valhum); // Date = lundi, mardi, mercredi,... ? fclose(fp); } } void affichageini (void) { //On affiche sur LCD le message d'initialisation lcd.cls(); //utile pour signler qu'un reset manuel (bouton) a été effectué lcd.printf("INITIALISATION"); lcd.locate(0,1); lcd.printf("DU SYSTEME ."); wait(1); lcd.locate(0,0); lcd.printf("INITIALISATION"); lcd.locate(0,1); lcd.printf("DU SYSTEME .."); wait(1); lcd.locate(0,0); lcd.printf("INITIALISATION"); lcd.locate(0,1); lcd.printf("DU SYSTEME ..."); wait(1); } void affichagesup (double valhum, int tpsdepa) { //On affiche sur le LCD le message lié au taux supérieur à 5%Hr int min = tpsdepa/60;//On récupère le nombre des dizaines du temps int rs = tpsdepa%60; //On récupère le nombre des unités du temps lcd.cls(); lcd.locate(0,0); lcd.printf("HUM = %.2f",valhum); lcd.locate(12,0); lcd.printf("%cHR",a); lcd.locate(0,1); lcd.printf("TPS+5%c %dmin %ds",a,min,rs); } void affichageinf (double valhum) { //On affiche sur le LCD le message lié aux taux ingérieur à 5%Hr lcd.cls(); lcd.locate(0,0); lcd.printf("HUMIDITE MESUREE"); lcd.locate(0,1); lcd.printf("EST DE"); lcd.locate(8,1); lcd.printf("%.2f",valhum); lcd.locate(12,1); lcd.printf("%cHR",a); } int main() { int tpsdepa = 0; int compteur=0; alarme =0; ledverte=0; int compteursave=0; while(1) { ledverte=1; // On allume la led verte pour signaler que le système fonctionne affichageini(); // On affiche sur l'ecran LCD le message d'initialisation while(1) { // Boucle infini double valcapteur = capteur.read()*3.3f; //Récupération de la tension d'entrée du capteur, // qui est multipliée par la tension d'alimentation. Car la tension relevée est un pourcentage de // la tension d'alimentation (vout est comprise entre 0 et 1). double valhum = (valcapteur-3.3*0.1515)/(0.00636*3.3); // Conversion de la tension en taux d'humidité if (valhum < 5.0) { // Si le taux d'humidité est inférieur à 5% Hr affichageinf (valhum); // On affiche sur le LCD le message lié au taux est inférieur à 5% Hr compteur = compteur +1; // Incrémentation du compteur if (compteur == 5) { // remise a zéro du compteur et éxtinction de l'alarme à partir de tpsdepa=0; // 5 mesures consécutives en dessous de 5% compteur =0; alarme =0; } } if (valhum >= 5.0) {// Si la valeur est supérieur ou égale à 5% Hr compteur =0; // Reset du compteur affichagesup (valhum,tpsdepa); // On affiche sur le LCD le message lié au taux supérieur à 5% Hr tpsdepa = tpsdepa+delaimesure; // Incrémentation du temps de dépassement if (tpsdepa > 300) { // Si le temps de dépassement est supérieur au temps critique, alarme=1; // on déclenche l'alarme } if (compteursave>=tpssave) { compteursave=0; ecritureSD(valhum); } compteursave = compteursave + delaimesure; wait(delaimesure); } } } }