// Station Météorologique — STM32 Nucleo C031C6
// ENICarthage 2025-2026 — Projet Tutoré Mécatronique
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_BMP085.h>
// --- Broches ---
#define PIN_LED PA5
#define PIN_BUZZER PA6
#define PIN_BUTTON PC13
#define PIN_LDR PA0
#define LDR_SEUIL 1000
// --- Objets ---
LiquidCrystal_I2C lcd(0x27, 16, 2);
Adafruit_BMP085 bmp;
// --- Variables d'état ---
volatile bool campagne_active = false;
volatile uint32_t campagne_debut = 0;
bool alarme_active = false;
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_BUTTON, INPUT_PULLUP);
digitalWrite(PIN_LED, LOW);
digitalWrite(PIN_BUZZER, LOW);
attachInterrupt(digitalPinToInterrupt(PIN_BUTTON),
ISR_Bouton, FALLING);
Wire.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Station Meteo");
lcd.setCursor(0, 1);
lcd.print("ENICarthage 2025");
delay(2000);
lcd.clear();
if (!bmp.begin()) {
lcd.setCursor(0, 0);
lcd.print("BMP180 ERREUR!");
while (1);
}
}
void loop() {
float temperature = bmp.readTemperature();
float pression = bmp.readPressure() / 100.0;
uint32_t ldr_val = analogRead(PIN_LDR);
// Vérif seuil luminosité (priorité haute)
if (ldr_val > LDR_SEUIL) {
if (!alarme_active) {
alarme_active = true;
digitalWrite(PIN_LED, HIGH);
digitalWrite(PIN_BUZZER, HIGH);
}
} else {
if (alarme_active) {
alarme_active = false;
digitalWrite(PIN_LED, LOW);
digitalWrite(PIN_BUZZER, LOW);
}
}
// Fin de campagne après 60s ?
if (campagne_active) {
if ((millis() - campagne_debut) >= 60000) {
campagne_active = false;
}
}
// Affichage LCD
char ligne1[17], ligne2[17];
if (alarme_active) {
lcd.setCursor(0,0); lcd.print("!! ALERTE LUX !!");
snprintf(ligne2,17,"LDR:%4lu ALARME!",(unsigned long)ldr_val);
lcd.setCursor(0,1); lcd.print(ligne2);
} else if (campagne_active) {
uint32_t elapsed = (millis() - campagne_debut) / 1000;
snprintf(ligne1,17,"T:%.1fC P:%.0fhP",temperature,pression);
snprintf(ligne2,17,"Camp:%2lus/60s ",(unsigned long)elapsed);
lcd.setCursor(0,0); lcd.print(ligne1);
lcd.setCursor(0,1); lcd.print(ligne2);
} else {
snprintf(ligne1,17,"Temp : %.1f C ",temperature);
snprintf(ligne2,17,"Pres : %.1f hPa",pression);
lcd.setCursor(0,0); lcd.print(ligne1);
lcd.setCursor(0,1); lcd.print(ligne2);
}
delay(500);
}
// ISR bouton — priorité MOYENNE
// Lance la campagne de mesure 60 secondes
void ISR_Bouton() {
static uint32_t last = 0;
uint32_t now = millis();
if (now - last < 300) return;
last = now;
if (!campagne_active) {
campagne_active = true;
campagne_debut = now;
}
}Loading
st-nucleo-c031c6
st-nucleo-c031c6
Loading
bmp180
bmp180