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.

