Montage Sécurité profondeur de plongée
03/2013
Système de sécurité avec un Arduino Nano et un Capteur de pression
Eviter au sous marin de descendre en dessous d'une profondeur donnée
Le Materiel:
- Un PC pour programmer l'arduino (version 1.0.1 pour le prg arduino)
- Une platine Arduino Nano : 15 € sur Ebay

- Un capteur de pression BMP085: 8€ sur Ebay
|
Il faudra faire une petite modification sur le BMP085,pour pouvoir y adapter un tuyau qui sortira a l'extérieur du compartiment étanche du sous marin

|
|
Déroulement du programme
- Mise a l'eau du sous marin
- allumer l'émetteur et le récepteur
- le capteur de pression se calibre pendant les 5 premières secondes a la mise sous tension pour définir la pression atmosphérique quand le sous marin est en surface
- pendant la navigation en surface ou sous la surface de l'eau, le capteur mesure la pression, tant que la pression est inferieur à la Profondeur_Max définie dans le programme, il restitue les ordres de la télécommande
- si le capteur mesure une pression supérieur à la Profondeur_Max, il prend le pas sur la télécommande, et viendra mettre le servo dans un angle défini Angle_Servo_Vidange = XX
- XX représente l'angle du servo pour vidanger (angle servo = 90°±45 en théorie), pour moi c'est 91
- Si le sous marin repasse au dessus de la Profondeur_Max définie, le capteur de pression redonne la main a la télécommande
- si il y a une perte de signal le capteur mettra aussi le servo en position vidange (fail-safe) tant que le signal ne sera pas revenue
- Pour les signaux de la télécommande, généralement les impulsions sont comprissent entre 1000 et 2000 avec en point milieu 1500, ces valeurs sont a modifier ,car chaque émetteur est différent ,et les valeurs peuvent etre de 1100 a 2050,avec le point milieu a 1420 par exemple
|
Le branchement

|
Conclusion
Cela fonctionne parfaitement, et le capteur est tres réactif, il faut soigner les connections, et vérifier la bonne fixation du tuyau
|
Le code a entrer dans l'AtTinY 85 |
|
/* --- Programme Arduino version 1.0.5--- 22/12/2019
carte Arduino UNO + BMP85
**************************
------Branchements ---------------
GY-65 --> Arduino NANO
vcc --> Pin 5v (ou 3.3 volts)
GND --> Pin masse
SDA --> Pin A4
SLC --> Pin A5
*/
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <SoftwareSerial.h>
//----------BMP085----
Adafruit_BMP085 bmp;
long Pression_Surface; // Pression lut a la Surface par le capteur
int Pression_Relative; // Difference de Pression entre la Surface et la Pression lut
long Pression_Max = 0; // Variable pour stocker la valeur Maxi lut sur le capteur de Pression pour faire la moyenne
long Pression_Min = 0; // Variable pour stocker la valeur Mini par sur le capteur de Pression pour faire la moyenne
int Profondeur_Max = 1916; // Declare la variable (Profondeur_Max) 479=6.25cm, 958=12.5cm, 1916=25cm, 3833=50cm , 7666= 1metre , 15352= 2metres
//=================================================
void setup(){
Serial.begin(9600);//moniteur serie-----
bmp.begin(); //Initialiser BMP085----
Calibration(); //calibration BMP085----
}
//=========================================================================================================
void loop(){
//**************** Recuperer les donnees du capteur BMP085
Pression_Relative = bmp.readPressure() - Pression_Surface;
//*********Controle de la profondeur avec CAPTEUR DE Pression BMP085 (Pin A4-SDA & A5-SLC sur ARDUINO Nano)
if (Pression_Relative > Profondeur_Max) { // Si profondeur maxi depassee
Serial.println("profondeur maxi depassee ");
}else{
Serial.println("profondeur ok ");
}//----fin du programme
void Calibration(){ // Calibration du BMP085 pour definir le O Surface pendant les 10 premieres secondes
Serial.print("calibration, patientez 10 secondes !! ");
Pression_Max = bmp.readPressure(); // valeur lut par le capteur de Pression (definir une valeur Pression Max )
Pression_Min = Pression_Max; // Definir une valeur Pression Min = Pression Max
for (int i=0; i <= 10; i++) { // repeter 10 fois 1 seconde
Pression_Surface = bmp.readPressure(); //Stocker la valeur du CAPTEUR Pression dans la variable "Pression_Surface"
if (Pression_Surface > Pression_Max) { Pression_Max = Pression_Surface;} // Enregistre la valeur Max lut par le capteur de Pression
if (Pression_Surface < Pression_Min) { Pression_Min = Pression_Surface;} // Enregistre la valeur Min lut par le capteur de Pression
delay(1000); // wait 1 seconds
}
//-------------------- definir valeur moyenne du capteur de Pression
if (Pression_Max > Pression_Min) {Pression_Surface = Pression_Max-((Pression_Max-Pression_Min)/2);} // defini la Pression moyenne en Surface
if (Pression_Max == Pression_Min) {Pression_Surface = Pression_Max;} // prend la Pression max en Surface si pression min = pression max
} //---------fin calibration capteur de Pression
|
|