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 87 88 89 90 91
|
#include <NewTone.h>
#include <NewPing.h>
#define SONAR_NUM 2 // Nombre de capteurs.
#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).
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 = 10;
int BuzzerState = 0;
int D1 = 23, D3 = 100;
long previousMillis = 0;
const unsigned long interval = 3000;
bool PasDeBeep;
bool BeepContinu;
bool BeepDemiPeriod;
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(BUZZER,OUTPUT);
NewTone(BUZZER, 1000);
delay(1000);
noNewTone(BUZZER);
Serial.begin(115200);
pingTimer[0] = millis() + 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()
{
unsigned long currentMillis = millis();
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.
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).
} // Fin du "if (millis() >= pingTimer[i])".
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
BuzzerState = !BuzzerState;
}
// Un autre code qui * N'ANALYSE PAS * les résultats de ping peut aller ici.
} // Fin du void loop.
void echoCheck() // Si un ping est reçu, définissez la distance du capteur sur la matrice.
{
if (sonar[currentSensor].check_timer())
{
cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}
}
void oneSensorCycle() // Cycle de ping du capteur terminé, faites quelque chose avec les résultats.
{
if (cm[currentSensor] <= D1 and cm[currentSensor] > 2) digitalWrite(BUZZER,HIGH);
else if (cm[currentSensor] < D3 and cm[currentSensor] > D1 )
{
BeepDemiPeriod = map(cm[currentSensor],D1,D3,interval/10,interval);
digitalWrite(BUZZER, BeepDemiPeriod);}
else digitalWrite(BUZZER,LOW);
for (uint8_t i = 0; i < SONAR_NUM; i++)
{
Serial.print(i);
Serial.print("=");
Serial.print(cm[currentSensor]);
Serial.print("cm ");
}
Serial.print(BuzzerState);
Serial.print(" - ");
Serial.print(BeepDemiPeriod);
Serial.println();
} |