1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#include <NewTone.h>
#include <NewPing.h>
#define SONAR_NUM 2 // Nombre de capteurs (4 au final).
#define MAX_DISTANCE 120 // Distance maximale (en cm) de ping.
#define PING_INTERVAL 35 // Millisecondes entre les pings du capteur (29 ms est environ la minute pour éviter l'écho croisé du capteur).
#define FREQUENCE_BIP 1000 // fréquence 1000 hertz
#define DUREE_BIP 300 // Temps en miliseconde
#define DISTANCE_BIP_CONTINU 25 // distance ou le bip continu se déclenche (20 cm est le minimume pour les capteurs JSN-SR04T.(étanches)
unsigned long DELAI = 1000; // temps de pulsation
unsigned long HeureDernierBip;
unsigned long pingTimer[SONAR_NUM]; // Contient les heures auxquelles le prochain ping doit se produire pour chaque capteur.
unsigned int cm[SONAR_NUM]; // Où les distances de ping sont stockées.
uint8_t currentSensor = 0; // Enregistre le capteur actif.
const int BUZZER = 3; // définition de la borne de l'arduino pour le buzzer
NewPing sonar[SONAR_NUM] = // Réseau d'objets de capteur.
{
NewPing(9, 8, MAX_DISTANCE), // La broche de déclenchement, la broche d'écho et la distance maximale de chaque capteur pour le ping.
NewPing(12, 11, MAX_DISTANCE),};
//NewPing(3, 2, MAX_DISTANCE),
//NewPing(5, 4, MAX_DISTANCE),
void setup() {
pinMode(3,OUTPUT); // Définition de la borne du buzer comme une sortie
digitalWrite(BUZZER,HIGH); // Bip de démarrage du système 1s (1000 millisecondes)
delay(1000);
digitalWrite(BUZZER,LOW);
HeureDernierBip = 0;
Serial.begin(115200);
pingTimer[0] = millis() + 75; // 75 Le premier ping commence à 75 ms, donne le temps à l'Arduino de se refroidir avant de commencer.
for (uint8_t i = 1; i < SONAR_NUM; i++) // Réglez l'heure de démarrage de chaque capteur.
pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
}
void loop() {
for (uint8_t i = 0; i < SONAR_NUM; i++) { // Parcourir tous les capteurs.
if (millis() >= pingTimer[i]) { // Est-il temps pour ce capteur de faire un ping.
pingTimer[i] += PING_INTERVAL * SONAR_NUM; // Réglez la prochaine fois que ce capteur recevra un ping.
if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Cycle de ping du capteur terminé, faites quelque chose avec les résultats.
sonar[currentSensor].timer_stop(); // Assurez-vous que la minuterie précédente est annulée avant de commencer un nouveau ping (assurance).
currentSensor = i; // Capteur en cours d'accès.
cm[currentSensor] = 0; // Rendre la distance nulle au cas où il n'y aurait pas d'écho ping pour ce capteur.
sonar[currentSensor].ping_timer(echoCheck); // Faites le ping (le traitement continue, l'interruption appellera echoCheck pour rechercher un écho).
}
}
// Un autre code qui * N'ANALYSE PAS * les résultats de ping peut aller ici.
}
void echoCheck() // Si un ping est reçu, définissez la distance du capteur sur la matrice et le son associé.
{
if (sonar[currentSensor].check_timer())
{
cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}
if (cm[currentSensor] == 0) // lorsque le capteur ne détectre rien il est à 0 donc on bloque le son pour le 0.
{
DELAI=5000;
}
else if (cm[currentSensor] < DISTANCE_BIP_CONTINU) // Si le capteur détecte un obstacle en dessous de la distance mini (25cm) il sonne en continu
{
DELAI=10;
}
else // On fait varier la cadance du bip en fonction de la distance comprise entre la distance maxi et la distance mini.
{
DELAI = (float)(cm[currentSensor]) * (float)(1000 - DUREE_BIP)/(float)(MAX_DISTANCE - DISTANCE_BIP_CONTINU) + DUREE_BIP;
}
if (millis() > HeureDernierBip + DELAI)
{
HeureDernierBip = millis();
NewTone(BUZZER, FREQUENCE_BIP,DUREE_BIP);
}
}
void oneSensorCycle() {
for (uint8_t i = 0; i < SONAR_NUM; i++)
{
Serial.print(i);
Serial.print("=");
Serial.print(cm[i]);
Serial.print("cm ");
}
Serial.println();
} |
Partager