Creation d'un multi detecteur

Bonjour,

Je suis néophyte en code C et en arduino. J'aimerais des réponses claires et ludique et non des redirection vers les cours de base Merci.

Je souhaite réaliser un appareil portatif pour nous aider en spéléo.

L'appareil contiendra les capteurs suivants:

-Temperature
-Hygrometrie
-Magnetometre
-Monoxyde de carbone

et sera équipé des elements suivants:

-Ecran 4x20
-Vibreur
-Laser
-Buzzer
-Bouton rotatif
-Led rgb

L'appareil servira a présenter a l'utilisateur la temperature, le taux d'humidité et de monoxyde de carbone et l'angle en degrès.
Le laser servira a pointer l'appareil entre les différentes bases pour faire des relevé de topographie.

Pour la sécurité je compte aussi ajouter un detecteur d'oxygène quand j'aurais tout fini.
Actuellement l'appareil devra vibrer et sonnera partir d'un taux de 25ppm de Co.

Pour le moment j'ai reçu et essayé les capteurs d'humidité/temperature et magnetometre. J'arrive a ressortir les données clairement sur le moniteur.

Je décide donc d'essayer l'alarme sur la temperature (devra sonner lors de 30°) mais je bloque sur le fait que l'arduino bloque sur l'alarme. Il décide de faire une boucle que dessus et si je l'insère apres mon relevé il sonne a chaque passage de la boucle. Est-il possible de creer une boucle juste pour cela ?

#include <dht11.h>  
dht11 DHT11;        //Instancier un capteur de type dht11
#define DHT11PIN 2  //Branché sur pin2 digital
int alarm =7;
#include <Wire.h>   //Librairie Wire pour la communication I2C
#define HMC5803L_Address 0x1E  //Adresse I2C du module
#define X 3  //Adresses de registres pour les données X Y et Z
#define Y 7
#define Z 5
double Xmagnetic;
double Ymagnetic;
double Zmagnetic;
double Module_magnetic;
double angle;
void setup() 
{
  Serial.begin(9600);
  Wire.begin();         //Initialisation de la livrairie Wire
  Init_HMC5803L();    //Initialiser le module boussole
  pinMode(alarm,OUTPUT);
}

// Boucle de mesures de champ magnétique
void loop() 
{ 
  int chk = DHT11.read(DHT11PIN);  //Tester le capteur
  //Hygrométrie %
  Serial.print("Humidite = ");
  Serial.print((float)DHT11.humidity, 2);
  Serial.print(" %  ");
  
  //Température °C
  Serial.print("Temp = ");
  Serial.print((float)DHT11.temperature, 2);
  Serial.print(" C  ");
  if (DHT11.temperature >28) {
    unsigned char i, j ;// define variables
    {
    for (i = 0; i <80; i++) // Wen a frequency sound
    {
      digitalWrite (7, HIGH) ;// send voice
      delay (1) ;// Delay 1ms
      digitalWrite (7, LOW) ;// do not send voice
      delay (1) ;// delay ms
    }
    for (i = 0; i <10; i++) // Wen Qie out another frequency sound
    {
      digitalWrite (7, HIGH) ;// send voice
      delay (2) ;// delay 2ms
      digitalWrite (7, LOW) ;// do not send voice
      delay (2) ;// delay 2ms
    }
  }
  } else {
    digitalWrite(7,LOW);
  }
  Xmagnetic = HMC5803L_Read(X);  //lecture sur 3 axes et sortie sur le port sériel
  Ymagnetic = HMC5803L_Read(Y);
  Zmagnetic = HMC5803L_Read(Z);
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic;
  Module_magnetic = sqrt(Module_magnetic);
  //Calculer l'angle de la boussole à partir de X et Y (à plat)
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres
  if (angle<0) {angle=angle+360;}
  Serial.print("  ");  
  Serial.print("Angle  ");  //en degres
  Serial.println(angle);
 delay(10); 
}  


// === Fonction qui initialise le module boussole (à lancer une seule fois)
void Init_HMC5803L(void)
{
  /* Set the module to 8x averaging and 15Hz measurement rate */
  Wire.beginTransmission(HMC5803L_Address);
  Wire.write(0x00);
  Wire.write(0x70);
         
  Wire.write(0x01);
  Wire.write(0xA0);   //Règle un gain de 5
  Wire.endTransmission();
}

// === Fonction qui lit le module boussole (registre d'un des 3 axes, retourne 16 bits)
int HMC5803L_Read(byte Axis)
{
  int Result;
   /* Initiate a single measurement */
  Wire.beginTransmission(HMC5803L_Address);
  Wire.write(0x02);
  Wire.write(0x01);
  Wire.endTransmission();
  delay(6);
  
  /* Move modules the resiger pointer to one of the axis data registers */
  Wire.beginTransmission(HMC5803L_Address);
  Wire.write(Axis);
  Wire.endTransmission();
   
  /* Read the data from registers (there are two 8 bit registers for each axis) */  
  Wire.requestFrom(HMC5803L_Address, 2);
  Result = Wire.read() << 8;
  Result |= Wire.read();

  return Result;  
}

bonjour,
déjà le dht11 n'est pas fiable à mon sens, mais bon.

lorsque l'on bute sur un truc, on fait ressortir dans la console serie les données pour vérification.
dans le setup, tu rajoutes Serial.begin(9600);

et dans le loop, tu rajoutes les données que tu veux ressortir
par exemple
Serial.println(DHT11.temperature);

et dans ton if, un truc du genre
Serial.println("boucle if");

au moins, tu sauras sur quel pieds danser.

de plus, lorsque l'on bute, on prend juste le module qui intéresse et on fait les tests, ca évite les erreurs en mélangeant le tout.

J'aimerais des réponses claires et ludique et non des redirection vers les cours de base Merci.

par contre, tu seras obligé d'y passer pour apprendre, on aide volontier, mais on ne fait pas le code pour toi :wink:

si c'est un projet exam, autant le dire de suite :slight_smile:

Merci de ta réponse,

Le capteur temperature n'a pas besoin d'être precis.
Je vais essayer d'isoler le code juste pour la temperature et alarme avec la boucle comme tu me dit.
Je ne demande pas de code je demande juste comment isoler la boucle alarme pendant que le reste du code suit son cours.

Non c'est un projet personnel que je vais essayer d'améliorer au fur du temps. A la base il nous fallait une boussol decimale pour faire de la topographie et au fur et a mesure j'ajoute des trucs utiles.