Capteur sonore, capteur d'inclinaison et moteur vibreur, projet étudiant

Bonjour à tous, j'espère que vous allez bien! Tout d'abord ne me jugez pas trop sévèrement s'il vous plaît je suis nouveau dans le monde de l'arduino et du code et je m'y connais pas trop.

Je suis étudiant et dans le cadre de mon diplôme je travaille sur 2 petit objets qui permettent de prévenir et de sensibiliser contre les dangers du bruit sur les chantiers. Le premier objet est le "module principale", il a un moteur vibreur et un capteur sonore et le second un capteur d'inclinaison.

L'idée est qu'ils sont connectés ensemble via bluetooth (je n'en aurais pas besoin pour le proto) et préviennent l'ouvrier lorsqu'il rentre dans une zone où le son dépasse les 85dB, il recevrait alors une série de vibration via le module principale qui est placé dans le harnais de son casque pour le prévenir de se protéger, puis lorsqu'il mettra ses PICB (protecteurs contre le bruit) qui sont attachés sur les cotés de son casque, avec le capteur d'inclinaison fixé dessus (mouvement de 180° à 90° environ), "l'alerte" s'arrêtera, et inversement lorsqu'il sortira de la zone "dangereuse" avec une vibration différentes pour lui dire qu'il peut retirer ses PICB.

J'aurais besoin d'aide parce que je m'y connais pas assez, mais j'ai fais des recherches pour comprendre un peu comment tout ça fonctionne mais j'aurais quelques questions.

Tout d'abords les composants que j'ai pour mener à bien ce projet sont : 2 Arduino nano (1 par module), des batteries lithiums de 3.7V, un petit moteur vibreur (de Gerui je crois) , un capteur d'inclinaison Sw-520 A, un microphone KY-038 (que je vais certainement changer parce que de ce que j'ai compris il ne capte pas suffisamment le bruit et est interféré par les sons parasites).

J'ai fais une simulation sur tinkercad en avance pour travailler sur le code et sur le placement des composants. Sur le papier tout fonctionne plus ou moins bien (j'ai quelques motifs a faire mais je pense que ça va le faire).

Est ce que mon plan tinkecad vous parait bon? Il y aurait t'il des choses à modifier?

Avez vous des remarquent par rapport aux composants que j'ai cité? Est ce que ce sont les bons pour ce projet? Est ce qu'ils m'en manquent?

Et voila mon code sur tinkercad travaillé avec chatgpt et un projet tinkercad que j'ai récupéré sur la communauté de tinkercad (parce que je sais pas coder). Il peut être tellement plus simplifier je pense mais je m'y connais pas assez et dès que je modifie des lignes ça foire en grande partie. Sur tinkercad il n'y a pas de capteur sonore donc j'ai utilisé un capteur de distance pour que ça fonctionne plus ou moins pareil en théorie.

Qu'est ce qui pourrait être modifié dessus? Ou simplifié?

#include <LiquidCrystal.h>

LiquidCrystal lcdGas(7, 6, 5, 4, 3, 2);
LiquidCrystal lcdSound(A1, 8, A2, A3, A4, A5);

const int pingPin = 9;
const int tiltPin = 2;

int soundThreshold = 85;

const int vibrationPin = 13;

unsigned long previousMillis = 0;
const long interval = 800;

bool vibrationState = false;

unsigned long lastHighTime = 0;
const long holdTime = 0;

// 🔧 AJOUT : mémoire d'état pour détecter transition
bool wasAlert = false;

void setup() {
  pinMode(vibrationPin, OUTPUT);
  pinMode(pingPin, OUTPUT);
  pinMode(tiltPin, INPUT_PULLUP);

  lcdSound.begin(16, 2);
  Serial.begin(9600);

  lcdSound.print("Sound Monitor");
  delay(1500);
  lcdSound.clear();
}

void loop() {

  int tiltState = digitalRead(tiltPin);

  long duration, distance;

  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);

  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);
  distance = duration / 58;

  lcdSound.setCursor(0, 0);
  lcdSound.print("Sound LVL: ");
  lcdSound.print(distance);
  lcdSound.print("Db   ");

  lcdSound.setCursor(0, 1);

  unsigned long currentMillis = millis();

  // =========================
  // PROTECTION (inchangé)
  // =========================
  if (tiltState == LOW) {
    lcdSound.print("PROTECTED   ");
    digitalWrite(vibrationPin, LOW);
    vibrationState = false;
    wasAlert = false; // reset état
    return;
  }

  // =========================
  // gestion seuil
  // =========================
  if (distance >= soundThreshold) {
    lastHighTime = currentMillis;
  }

  bool isAlert = (distance >= soundThreshold || (currentMillis - lastHighTime <= holdTime));

  // =========================
  // ALERT STATE
  // =========================
  if (isAlert) {

    lcdSound.print("Sound: ALERT");

    wasAlert = true; // mémorise qu'on est en alerte

    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      vibrationState = !vibrationState;
      digitalWrite(vibrationPin, vibrationState);
    }

  }

  // =========================
  // LOW STATE + SAFE EVENT
  // =========================
  else {

    lcdSound.print("Sound: LOW  ");
    digitalWrite(vibrationPin, LOW);
    vibrationState = false;

    // 🔧 SAFE uniquement sur transition ALERT → LOW
    if (wasAlert == true) {

      wasAlert = false;

      digitalWrite(vibrationPin, HIGH);
      delay(120);
      digitalWrite(vibrationPin, LOW);
      delay(120);
      digitalWrite(vibrationPin, HIGH);
      delay(120);
      digitalWrite(vibrationPin, LOW);
    }
  }

  delay(50);
}

Merci Beaucoup d'avoir pris de votre temps pour moi!! Je suis à l'écoute de ce que vous me direz et je suis ouvert à n'importe quel modifications à faire.

pas de souci, on a tous commencé en n'y connaissant rien. Cela dit, il y a un petit minimum à faire de votre côté, c'est de lire et appliquer les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

(en commençant par poster dans la bonne catégorie - ici ce sont les projets finis, pas pour les questions)

➜ je déplace votre message au bon endroit pour cette fois.

Je ne comprends pas très bien l'intérêt d'avoir 2 appareils si ce n'est d'ajouter de la complexité, une consommation plus importante et augmenter le risque de panne avec une liaison Bluetooth entre les deux.

Bonjour peplto

N'aurais tu pas intérêt a utiliser un composant un peu plus "moderne" comme le M5StickC Plus:
image

Qui a déjà presque tout ce dont tu as besoin.

Cordialement
jpbbricole

Comme ca oui, cela semble être cohérent sur le principe de base.

Pour un projet de diplôme, je pense qu'il faut être un minimum précis et donc ne pas d'utiliser d'approximation.
Tu pars si je ne me trompe pas de dB(µPa avec un filtre A).
Donc même si je ne pourrais pas d'aider, aussi bien que je voudrais, la bonne question est si ton composant tu donnera soit directement un dB(A), ou un voltage par µPa.

Pour le KY-038, je ne le connais pas, donc je ne saurais dire si il est sensible au interférence(les quelles d'ailleurs?).
Pour le bruit cela ne veut pas vraiment dire grand chose.
Si mes informations sont bonnes, le KY-038 capture de 100 à 10KHz, donc manque 10KHz à 20 KHz.
mais en même temps le filtre A atténue les fréquences au dessus de 10KHz.
Après je ne sais pas vraiment le profil du bruit sur un chantier, mais il me semble qu'il est plutôt inférieur à 10KHz?

Mais effectivement si tu veux que ton appareil, soit adapté à n'importe quel cas, il faudrait plutôt un capteur sur la plage 10-20KHz, il me semble.

Après moi avec le KY-038, ce qui m'inquièterait, c'est comment tu va le calibrer, surtout sachant qu'il a un gain réglable avec un potentiomètre?
Mais même pour les autres capteurs comment compte tu les calibrer, si ceux-ci te donne un voltage, alors qu'il te faut des µPa ?
As tu aussi une idée de la justesse que tu veux atteindre ?

@terwal
Bonnes précisions auxquelles j’ajoute les miennes.

Les dB A,B et C trouvent leur origine dans les travaux de Fletcher et Manson.

A faible niveau sonore, l’oreille humaine entend mal les fréquences basses et les fréquences hautes. Le maximum de sensibilité est vers 800 Hz.

A fort niveau sonore la courbe de réponse de l’oreille humaine est proche d’une droite.

On a donc normalisé des filtres (censés représenter l’oreille humaine ) pour trois zones A, B et C.
A pour faibles niveaux, B pour niveaux intermédiaires et C pour forts niveaux.

Les dBA sont les plus employés dans la vie ordinaire.
Quid de l’activité présente où il s’agit de protéger contre des bruits intenses, donc pouvant relever des dBC ?

C’est travail universitaire, je ne pense pas qu’un appareil de classe commerciale soit exigé . Par contre je pense que ce qui est exigé c’est de monter que l’on est capable d’analyser un sujet.

Tout à fait.
Je parles effectivement un peu vite de filtre A, mais je ne sais pas si c'est le plus adapté.