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
|
#include <NewPing.h>
#define SONAR_NUM 3 // nombre de sensors
#define MAX_DISTANCE 150 // maximum distance in cm
#define PING_INTERVAL 33 // millisecondes entre les pings des sensors
/* Creation des variables pour les capteurs */
unsigned long pingTimer[SONAR_NUM];
unsigned int cm[SONAR_NUM]; // range les distances de chaque ping
uint8_t currentSensor = 0; // permet de determiner quel sensor est actif
NewPing sonar[SONAR_NUM] = { NewPing( 48, 49, MAX_DISTANCE), NewPing( 46, 47, MAX_DISTANCE), NewPing( 44, 45, MAX_DISTANCE) }; // trigger pin, echo pin, distance maximale pour déclencher un ping
/* Creation des variables pour les leds */
#define LED_NUM 3 // nombre de leds
const int LED[LED_NUM] = { 3, 5, 6 } ; // on déclare un tableau contenant les constantes des broches
int etat_led[LED_NUM];
// variable qui peut changer
/* variables pour le temps de pause des LEDs*/
unsigned long previousMillis[LED_NUM];
unsigned long delaiAleatoire;
void setup() {
Serial.begin(9600); // bauds
// delai et random
delaiAleatoire = random(1000, 8000);
// leds
for (uint8_t i = 0 ; i <= LED_NUM ; i++) {
pinMode(LED[i], OUTPUT);
}
pingTimer[0] = millis() + 75; // premier ping a 75millisecondes (millis est le temps depuis lequel le programme est lancé.)
for (uint8_t i = 1; i < SONAR_NUM; i++) {
/* mise en place pour lancer chaque sensor. index i du sensor : sa valeur par défaut est de 1,
on contrôle qu'elle soit inferieure au nombre de sensors et puis on veut l'incrementer */
pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL; // on détermine le moment auquel chaque capteur enverra un ping
}
}
void loop() {
for (uint8_t i = 0; i < SONAR_NUM; i++) { // créer la boucle pour tous les sensors
if (millis () >= pingTimer[i]) { // le moment ou pas de lancer un ping pour le sensor en question
pingTimer[i] += PING_INTERVAL * SONAR_NUM; //mise en place du prochain moment ou le sensor enverra un ping
if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle();
sonar[currentSensor].timer_stop();
currentSensor = i;
cm[currentSensor] = 0;
sonar[currentSensor].ping_timer(echoCheck);
}
}
}
void echoCheck() {
if (sonar[currentSensor].check_timer()) {
cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM; /* US_ROUNDTRIP_CM = 340 */
}
}
void oneSensorCycle() { // j'extrais les résultats après un cycle de ping complet et en fait quelque chose
unsigned long currentMillis = millis();
for (uint8_t i = 0 ; i < SONAR_NUM ; i++) {
if (etat_led[i] < 256 && cm[i] < 30 && cm[i] > 5) {
etat_led[i] = etat_led[i] + 1;
}
else if (etat_led[i] > 0 && (currentMillis - previousMillis[i] >= delaiAleatoire)) {
previousMillis[i] = currentMillis;
etat_led[i] = etat_led[i] - 1;
}
analogWrite (LED[i], etat_led[i]);
}
} |
Partager