Plant Monitoring Project

Dependencies:   mbed SHT21_ncleee WakeUp SSD1306 DHT Adafruit_TCS34725 DS1820

Committer:
ludollaoo
Date:
Tue Nov 19 14:22:34 2019 +0000
Revision:
20:79f4ef29eafd
Parent:
19:d6236253bf5f
Child:
21:4a18c9f1eb5e
comme l'ancien mais verbeux

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jufray 0:e030be8f0310 1 #include "mbed.h"
Germaint 1:3fc11a745984 2 #include "DS1820.h"
Germaint 1:3fc11a745984 3 #include "SHT21_ncleee.h"
Germaint 1:3fc11a745984 4 #include "Adafruit_TCS34725.h"
Germaint 1:3fc11a745984 5 #include "ssd1306.h"
jufray 0:e030be8f0310 6
ludollaoo 20:79f4ef29eafd 7 #define DUREE_MESURE 4 // Durée en seconde entre deux mesures
Germaint 19:d6236253bf5f 8 #define DUREE_ECRAN_ON 5 // Durée en seconde d'éveil de l'écran
Germaint 19:d6236253bf5f 9
Germaint 19:d6236253bf5f 10 #define I2C_SDA D4
Germaint 19:d6236253bf5f 11 #define I2C_SCL D5
Germaint 18:d30cd2967da4 12
Germaint 18:d30cd2967da4 13 Ticker timeScreen;
Germaint 18:d30cd2967da4 14
Germaint 19:d6236253bf5f 15
Germaint 2:0bfe25431e8e 16 //Serial pc(SERIAL_TX, SERIAL_RX);
Germaint 1:3fc11a745984 17 Serial nucleo(D1,D0);
Germaint 2:0bfe25431e8e 18
Germaint 19:d6236253bf5f 19 I2C i2c(I2C_SDA, I2C_SCL); // Pour les deux capteurs i2c
Germaint 19:d6236253bf5f 20 SSD1306 oled(I2C_SDA, I2C_SCL);
jufray 0:e030be8f0310 21
Germaint 1:3fc11a745984 22 // capteur temperature sol
Germaint 1:3fc11a745984 23 DS1820 DS(D3);
jufray 0:e030be8f0310 24
Germaint 1:3fc11a745984 25 // capteur humidité sol
Germaint 1:3fc11a745984 26 AnalogIn capteur_humidity_sol(A0);
jufray 0:e030be8f0310 27
Germaint 1:3fc11a745984 28 // capteur humidité + température air
jufray 0:e030be8f0310 29 SHT21 sht(&i2c);
jufray 0:e030be8f0310 30
Germaint 1:3fc11a745984 31 // capteur RGB
ludollaoo 5:256a143ab0c2 32 Adafruit_TCS34725 RGBsens = Adafruit_TCS34725(&i2c, TCS34725_INTEGRATIONTIME_154MS, TCS34725_GAIN_1X);
jufray 0:e030be8f0310 33
Germaint 18:d30cd2967da4 34 //Interruption Bouton
Germaint 18:d30cd2967da4 35 InterruptIn bouton(D10);
Germaint 18:d30cd2967da4 36
Germaint 18:d30cd2967da4 37 // Flag OLED state
Germaint 18:d30cd2967da4 38 bool oled_on = 0;
jufray 0:e030be8f0310 39
Germaint 1:3fc11a745984 40 // Définition de fonctions
Germaint 1:3fc11a745984 41 float temp_sol(void);
Germaint 1:3fc11a745984 42 int fct_humidity_sol(void);
Germaint 18:d30cd2967da4 43 void fct_RGB(void);
Germaint 16:13364798fce6 44 void sendDataSigfox(void);
Germaint 2:0bfe25431e8e 45 void oledData(void);
Germaint 16:13364798fce6 46 void readData(void);
Germaint 18:d30cd2967da4 47 void interruption_bouton(void);
Germaint 18:d30cd2967da4 48 void turnOffScreen(void);
ludollaoo 20:79f4ef29eafd 49 void enter_Standby(void);
Germaint 1:3fc11a745984 50
Germaint 16:13364798fce6 51 float temperature_sol;
Germaint 18:d30cd2967da4 52 unsigned char humidity_sol;
Germaint 16:13364798fce6 53 float temperature_air;
Germaint 16:13364798fce6 54 unsigned char humidity_air;
Germaint 16:13364798fce6 55 unsigned char pr, pg, pb;
Germaint 16:13364798fce6 56 unsigned short lum;
jufray 0:e030be8f0310 57
jufray 0:e030be8f0310 58
Germaint 1:3fc11a745984 59 int main() {
Germaint 18:d30cd2967da4 60 //Initialisation de l'interruption
ludollaoo 20:79f4ef29eafd 61 bouton.rise(interruption_bouton);
Germaint 18:d30cd2967da4 62
Germaint 19:d6236253bf5f 63 // Affichage logo pour initialisation
Germaint 19:d6236253bf5f 64 oled.wake();
Germaint 16:13364798fce6 65 oled.init();
Germaint 16:13364798fce6 66 oled.cls(0,1);
Germaint 19:d6236253bf5f 67 oled.locate(4,4);
Germaint 19:d6236253bf5f 68 oled.printf("2PA2S");
Germaint 19:d6236253bf5f 69 oled.redraw();
Germaint 19:d6236253bf5f 70 wait(1);
Germaint 19:d6236253bf5f 71 oled.cls(0,1);
Germaint 18:d30cd2967da4 72 oled.sleep();
Germaint 1:3fc11a745984 73
jufray 0:e030be8f0310 74 while(1) {
Germaint 16:13364798fce6 75 readData();
ludollaoo 20:79f4ef29eafd 76 enter_Standby();
jufray 0:e030be8f0310 77 }
jufray 0:e030be8f0310 78 }
jufray 0:e030be8f0310 79
jufray 0:e030be8f0310 80
jufray 0:e030be8f0310 81 float temp_sol()
jufray 0:e030be8f0310 82 {
jufray 0:e030be8f0310 83 DS.convertTemperature(true, DS1820::all_devices);
jufray 0:e030be8f0310 84 if (DS.unassignedProbe(D3)){
ludollaoo 20:79f4ef29eafd 85 printf( "D3 not assigned\n\r");
jufray 0:e030be8f0310 86 }
ludollaoo 20:79f4ef29eafd 87 printf("temp sol: %.1f\n\r", DS.temperature());
jufray 0:e030be8f0310 88 return DS.temperature();
jufray 0:e030be8f0310 89 }
jufray 0:e030be8f0310 90
Germaint 1:3fc11a745984 91 int fct_humidity_sol(void)
jufray 0:e030be8f0310 92 {
jufray 0:e030be8f0310 93 float val_min = 0.377;
jufray 0:e030be8f0310 94 float val_max = 0.772;
jufray 0:e030be8f0310 95 float mesure, mesure_etalonnee;
Germaint 1:3fc11a745984 96 mesure = capteur_humidity_sol.read();
jufray 0:e030be8f0310 97 mesure_etalonnee = (1-((mesure - val_min)/(val_max - val_min)))*100;
ludollaoo 20:79f4ef29eafd 98 printf("hum sol: %d\n\r", (int) mesure_etalonnee);
jufray 0:e030be8f0310 99 return (int) mesure_etalonnee;
jufray 0:e030be8f0310 100 }
jufray 0:e030be8f0310 101
Germaint 18:d30cd2967da4 102 void fct_RGB(void)
jufray 0:e030be8f0310 103 {
jufray 0:e030be8f0310 104 int somme;
jufray 0:e030be8f0310 105 uint16_t clear, red, green, blue;
jufray 0:e030be8f0310 106 if (!RGBsens.begin())
jufray 0:e030be8f0310 107 {
Germaint 2:0bfe25431e8e 108 //pc.printf("No TCS34725 found ... check your connections");
Germaint 15:c73d0d180cc4 109 //while (1); // halt!
jufray 0:e030be8f0310 110 }
jufray 0:e030be8f0310 111 RGBsens.getRawData(&red, &green, &blue, &clear);
jufray 0:e030be8f0310 112 somme = red + green + blue;
Germaint 18:d30cd2967da4 113 pr = red*100/somme;
Germaint 18:d30cd2967da4 114 pg = green*100/somme;
Germaint 18:d30cd2967da4 115 pb = blue*100/somme;
Germaint 18:d30cd2967da4 116 lum = clear;
ludollaoo 20:79f4ef29eafd 117 printf("luminosité : %d \n\r", lum);
ludollaoo 20:79f4ef29eafd 118 printf("rouge:%d vert:%d bleu:%d \n\r", pr, pg, pb);
jufray 0:e030be8f0310 119 }
jufray 0:e030be8f0310 120
Germaint 16:13364798fce6 121 void sendDataSigfox(void){
Germaint 16:13364798fce6 122 short tempSol_short, tempAir_short;
Germaint 16:13364798fce6 123 tempSol_short = (short)(temperature_sol*10);
Germaint 16:13364798fce6 124 tempAir_short = (short)(temperature_air*10);
jufray 0:e030be8f0310 125
Germaint 16:13364798fce6 126 nucleo.printf("AT$SF=%04x%02x%04x%02x%04x%02x%02x%02x\r\n",tempSol_short, humidity_sol, tempAir_short, humidity_air, lum, pr, pg, pb);
Germaint 16:13364798fce6 127 }
Germaint 2:0bfe25431e8e 128
Germaint 2:0bfe25431e8e 129 void oledData(void){
Germaint 18:d30cd2967da4 130 if(!oled_on){
Germaint 18:d30cd2967da4 131 oled.wake();
Germaint 18:d30cd2967da4 132 //oled.speed (SSD1306::Medium);
Germaint 18:d30cd2967da4 133 //oled.init();
Germaint 18:d30cd2967da4 134 //oled.set_contrast(200);
Germaint 18:d30cd2967da4 135 oled_on = 1;
Germaint 18:d30cd2967da4 136 }
Germaint 16:13364798fce6 137 oled.cls(0,1);
Germaint 2:0bfe25431e8e 138 oled.locate(0,0);
Germaint 2:0bfe25431e8e 139 oled.printf("AIR T : %.1f", temperature_air);
Germaint 2:0bfe25431e8e 140 oled.locate(1,0);
Germaint 2:0bfe25431e8e 141 oled.printf("AIR H : %d", humidity_air);
Germaint 2:0bfe25431e8e 142 oled.locate(3,0);
Germaint 2:0bfe25431e8e 143 oled.printf("FLOOR T : %.1f", temperature_sol);
Germaint 2:0bfe25431e8e 144 oled.locate(4,0);
Germaint 2:0bfe25431e8e 145 oled.printf("FLOOR H : %d", humidity_sol);
Germaint 2:0bfe25431e8e 146 oled.locate(6,0);
Germaint 2:0bfe25431e8e 147 oled.printf("Light : %d", lum);
Germaint 2:0bfe25431e8e 148 oled.locate(7,0);
Germaint 2:0bfe25431e8e 149 oled.printf("R %d G %d B %d", pr, pg, pb);
Germaint 2:0bfe25431e8e 150 oled.redraw();
Germaint 2:0bfe25431e8e 151 }
jufray 0:e030be8f0310 152
Germaint 16:13364798fce6 153 void readData(void){
Germaint 16:13364798fce6 154 temperature_sol = temp_sol();
Germaint 16:13364798fce6 155 humidity_sol = fct_humidity_sol();
ludollaoo 20:79f4ef29eafd 156 temperature_air = sht.readTemp();
ludollaoo 20:79f4ef29eafd 157 printf("temp air: %.1f\n\r", temperature_air);
ludollaoo 20:79f4ef29eafd 158 humidity_air = sht.readHumidity();
ludollaoo 20:79f4ef29eafd 159 printf("hum air: %d\n\r", humidity_air);
Germaint 18:d30cd2967da4 160 fct_RGB();
ludollaoo 20:79f4ef29eafd 161 printf("\n\r");
Germaint 16:13364798fce6 162 sendDataSigfox();
Germaint 18:d30cd2967da4 163 if(oled_on)
Germaint 18:d30cd2967da4 164 oledData();
Germaint 16:13364798fce6 165 }
jufray 0:e030be8f0310 166
Germaint 18:d30cd2967da4 167 void interruption_bouton(){
Germaint 18:d30cd2967da4 168 bouton.disable_irq();
Germaint 18:d30cd2967da4 169 if(!oled_on){
Germaint 18:d30cd2967da4 170 oledData();
Germaint 18:d30cd2967da4 171 timeScreen.attach(&turnOffScreen,DUREE_ECRAN_ON);
Germaint 18:d30cd2967da4 172 }
Germaint 19:d6236253bf5f 173
Germaint 18:d30cd2967da4 174 bouton.enable_irq();
Germaint 18:d30cd2967da4 175 }
Germaint 16:13364798fce6 176
Germaint 18:d30cd2967da4 177 void turnOffScreen(void){
Germaint 18:d30cd2967da4 178 timeScreen.detach();
Germaint 18:d30cd2967da4 179 oled_on = 0;
Germaint 18:d30cd2967da4 180 oled.sleep();
Germaint 18:d30cd2967da4 181 }
ludollaoo 20:79f4ef29eafd 182
ludollaoo 20:79f4ef29eafd 183 void enter_Standby( void )
ludollaoo 20:79f4ef29eafd 184 {
ludollaoo 20:79f4ef29eafd 185 /* Enable Clocks */
ludollaoo 20:79f4ef29eafd 186 RCC->APB1ENR |= RCC_APB1ENR_PWREN;
ludollaoo 20:79f4ef29eafd 187
ludollaoo 20:79f4ef29eafd 188 /* Prepare for Standby */
ludollaoo 20:79f4ef29eafd 189 // if WKUP pins are already high, the WUF bit will be set
ludollaoo 20:79f4ef29eafd 190 PWR->CSR |= PWR_CSR_EWUP1 | PWR_CSR_EWUP2;
ludollaoo 20:79f4ef29eafd 191
ludollaoo 20:79f4ef29eafd 192 PWR->CR |= PWR_CR_CWUF; // clear the WUF flag after 2 clock cycles
ludollaoo 20:79f4ef29eafd 193 PWR->CR |= PWR_CR_ULP; // V_{REFINT} is off in low-power mode
ludollaoo 20:79f4ef29eafd 194 PWR->CR |= PWR_CR_PDDS; // Enter Standby mode when the CPU enters deepsleep
ludollaoo 20:79f4ef29eafd 195
ludollaoo 20:79f4ef29eafd 196 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; // low-power mode = stop mode
ludollaoo 20:79f4ef29eafd 197 printf("Enter standby mode\n\r");
ludollaoo 20:79f4ef29eafd 198 __WFE(); // enter low-power mode
ludollaoo 20:79f4ef29eafd 199 }