/**
* Program: Temperature, Pression et Niveau surveillance avec BMP280
*
* c'est programme utilise un BMP280 capteur pour mesurer temperature, pression et niveau,
* affiche les valeurs sur un ecran an SSD1306 OLED display.
*
* Connections:
* - BMP280 connected via SPI:
* - SCK: pin 13
* - MISO: pin 12
* - MOSI: pin 11
* - CS: pin 10
* - OLED connected via I2C (SDA, SCL)
*/
#include <Wire.h>
#include <U8glib.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <SPI.h>
// Constants
#define SEA_LEVEL_PRESSURE 1013.25 // Pression au niveau de l'eau dans un container hPa (standard)
#define UPDATE_DELAY 1000 // Delai entre les mises a jour (1 seconds)
// Definir SPI pins for Salama ALTIMETRE
#define BMP_SCK 13 // Horloge SPI
#define BMP_MISO 12 // MISO SPI
#define BMP_MOSI 11 // MOSI SPI
#define BMP_CS 10 // Selection de la puce
// Instance de capteur BMP280 utilisant SPI
Adafruit_BMP280 bmp_sensor(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
// Instance d'affichage OLED
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_FAST);
/**
* Initialiser l'appareil des mesure
* Renvoie vraie si le capteur marche bien
*/
bool initBMP280() {
if (!bmp_sensor.begin()) {
Serial.println("BMP280 sensor not found. Check SPI connections!");
return false;
}
// Option de la configuaration du capteur
bmp_sensor.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operation mode */
Adafruit_BMP280::SAMPLING_X2, /* Temperature oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time */
return true;
}
/**
* Initialiser l'ecran OLED
*/
void initDisplay() {
// Vente de couleur Msplay
if (u8g.getMode() == U8G_MODE_R3G3B2) {
u8g.setColorIndex(255); // Blanc
}
else if (u8g.getMode() == U8G_MODE_GRAY2BIT) {
u8g.setColorIndex(3); // intensite maximale
}
else if (u8g.getMode() == U8G_MODE_BW) {
u8g.setColorIndex(1); // pixel active
}
else if (u8g.getMode() == U8G_MODE_HICOLOR) {
u8g.setHiColorByRGB(255, 255, 255);
}
}
/**
* Dessiner l'interface sur l'ecran
*/
void drawInterface() {
// Font settings
u8g.setFont(u8g_font_8x13B);
// Dessin des cardres
u8g.drawRFrame(0, 16, 128, 48, 4); // Cadre principale
u8g.drawRFrame(0, 0, 128, 16, 4); // Titre de cadre
// Titre
u8g.drawStr(25, 13, "Salama");
// Temperature
float temperature = bmp_sensor.readTemperature();
u8g.drawStr(10, 31, "Temp: C");
u8g.drawCircle(93, 22, 2); // Degree symbole
u8g.setPrintPos(55, 31);
u8g.print(temperature, 1); // 1 decimal place
// Pression (en hPa)
float pressure = bmp_sensor.readPressure() / 100.0F; // Convert to hPa
u8g.drawStr(10, 45, "Pres: hPa");
u8g.setPrintPos(55, 45);
u8g.print(pressure, 1); // 1 decimal place
// Niveau
float Niveau = bmp_sensor.readAltitude(SEA_LEVEL_PRESSURE);
u8g.drawStr(10, 59, "Niv: L");
u8g.setPrintPos(55, 59);
u8g.print(Niveau, 1); // 1 decimal place
}
/**
* Mettre a jour l'ecran avec les information actuelless du capteur
*/
void updateDisplay() {
u8g.firstPage();
do {
drawInterface();
} while (u8g.nextPage());
}
void setup() {
// Initialiser la communication serie
Serial.begin(9600);
Serial.println("Starting MPOKASHI monitoring system via SPI");
// Initialiser la communication SPI
SPI.begin();
// Initialiser le system Salama
if (!initBMP280()) {
Serial.println("Sensor initialization failed. Check connections!");
while (1); // Arreter l'execution si le capteur n'est pas connecter
}
// Initialiser l'ecran OLED
initDisplay();
Serial.println("MPOKASHI System successfully initialized");
}
void loop() {
// Mettre a jour l'ecran avec les donnees actuelles
updateDisplay();
// Imprimer les donnnees sur un moniteur series
float temperature = bmp_sensor.readTemperature();
float pressure = bmp_sensor.readPressure() / 100.0F; // Convert to hPa
float altitude = bmp_sensor.readAltitude(SEA_LEVEL_PRESSURE);
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Pression: ");
Serial.print(pressure);
Serial.println(" hPa");
Serial.print("Approx. Niveau: ");
Serial.print(altitude);
Serial.println(" L");
Serial.println("-------------------");
// Attendre avant la prochaine mise a jour
delay(UPDATE_DELAY);
}
void Setup() {
pinMode(5, OUTPUT);
analogWrite(5, 1277);
}