Radar mobile V2

Après la réalisation du radar que vous pouvez retrouver ici http://noscollections.ddns.net/carrerago/?p=2818, j’ai décidé d’améliorer un peu ce dernier. Il manquait quelques fonctionnalités.

Fonctions :

  • Affichage de la vitesse limite
  • Réglage de la vitesse limite (déclanchement du flash)
  • Ajout d’un flash
  • Interrupteur indiquant le sens de passage de la voiture
  • Bouton de remise à zéro des paramètres

Pour réaliser cela, j’ai ajouté 2 boutons, un vert pour ajouter 5 à l’afficheur et un vert pour soustraire 5. L’afficheur rouge indique la vitesse limite autorisée en cm/s.

L’afficheur principal indique plusieurs informations.

  • La dernière vitesse de passage en cm/s sur la première ligne.
  • Le nombre de tours réalisés et combien de fois vous avez été flashé (dépassement de la vitesse autorisée / réglée)
  • Les vitesses minimum et maximum réalisées
  • La moyenne des vitesses de passages.

Le bouton noir, sur le coté du radar permet une remise à zéro des données.

Matériel :

  • LCM2004 (Ecran 4 lignes) (3.5€)
  • TM1637 (Afficheur rouge) (1€)
  • Module LED haute puissance 3W avec châssis PCB (2€)
  • 3 boutons poussoirs (0.2€)
  • Interrupteur à levier 2 positions (0.3€)
  • 1 arduino Nano (3€)
  • 1 support arduino nano (2€)

La boite de Nesquik s’est bien remplie. Boutons et afficheurs se connectent sur le support de l’Arduino Nano.

J’ai utilisé des cosses sur les interrupteurs. J’ai coupé l’extrémité des fils Dupont pour y insérer les cosses pour une fixation facile sur les interrupteurs.

Coté couvercle a été ajouté la diode forte luminosité pour représenter le flash du radar. (élément rouge sur la photo)

Vidéo :

Voici le schéma de liaison de l’ensemble des composants.

Et maintenant le code pour programmer l’Arduino.
Si vous souhaitez plus d’informations sur la mise en œuvre pour envoyer le programme à l’Arduino, vous pouvez consulter l’Article suivant : https://www.framboise314.fr/commencer-avec-larduino/

//Libraries 
#include <Wire.h>  
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address, if it's not working try 0x27.

int IR1 = 4;
int IR2 = 5;

      int bouton_1 = 3; // déclaration du bouton
      int bouton_2 = 2; // déclaration du bouton

int compteur1 = 1;      // variable enregistre un passage compteur 1
int compteur2 = 1;      // variable enregistre un passage compteur 2
long temps1=millis();    // Variable prise de temps pour IR 1
long temps2=millis();    // Variable prise de temps pour IR 2
long temps3 = 0;         // Variable pour le calcul du temps reel passe
float V = 0.0;            // Variable Vitesse
float TTS = 0.0;          // Variable temps passe en secondes

float V_min = 99999999;        // Vitesse min
float V_max = 0.0;        // Vitesse max
float V_moy = 0.0;        // Vitesse moy
float V_som = 0.0;        // Vitesse som

int radar_seuil = 70; // valeur vitesse demarrage



int levier_1 = 8; // déclaration du bouton
int levier_2 = 9; // déclaration du bouton
int etatlevier_1 = 0; // variable lorsque j'appuie sur le bouton
int etatlevier_2 = 0; // variable lorsque j'appuie sur le bouton

int boutonappui_1 = 0; // variable lorsque j'appuie sur le bouton
int etatbouton_1 = 0; // etat dans lequel se trouve le bouton
int bouton_pasappui_1 = 0;// variable lorsque je n'appuie pas sur le bouton

int boutonappui_2 = 0; // variable lorsque j'appuie sur le bouton
int etatbouton_2 = 0; // etat dans lequel se trouve le bouton
int bouton_pasappui_2 = 0;// variable lorsque je n'appuie pas sur le bouton

String texte="";
String txt_sens="===";
int tours=0;
int nb_flash=0;

// flash
int pin_led_flash = 13;

// Inclue la librairie ecran rouge:
#include <TM1637Display.h>
// Define the connections pins:
#define CLK 6
#define DIO 7
// Create display object of type TM1637Display:
TM1637Display display = TM1637Display(CLK, DIO);
// Create array that turns all segments on:
const uint8_t data[] = {0xff, 0xff, 0xff, 0xff};
// Create array that turns all segments off:
const uint8_t blank[] = {0x00, 0x00, 0x00, 0x00};

const uint8_t done[] = {
  SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,           // d
  SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O
  SEG_C | SEG_E | SEG_G,                           // n
  SEG_A | SEG_D | SEG_E | SEG_F | SEG_G            // E
};

const uint8_t pts[] = {
  SEG_B | SEG_C | SEG_F | SEG_G ,           // d
  SEG_A | SEG_B | SEG_E | SEG_F | SEG_G ,   // O
  SEG_D | SEG_E | SEG_F | SEG_G ,           // n
  SEG_A | SEG_F | SEG_D | SEG_C | SEG_G     // E
};

void setup(){
  
  // Boutons
  pinMode(bouton_1, INPUT_PULLUP);// déclaration du bouton en entrée avec la résistance pullup
  pinMode(bouton_2, INPUT_PULLUP);// déclaration du bouton en entrée avec la résistance pullup
  
  pinMode(levier_1, INPUT_PULLUP);// déclaration du bouton en entrée avec la résistance pullup
  pinMode(levier_2, INPUT_PULLUP);// déclaration du bouton en entrée avec la résistance pullup

    etatlevier_1 = digitalRead(levier_1);//etatbouton est égale à la lecture du bouton
    etatlevier_2 = digitalRead(levier_2);//etatbouton est égale à la lecture du bouton
    
    if (etatlevier_1 == 1) {// si etatbouton est différent de bouton pas_appui, simplement si j'appuie sur le bouton
      IR1 = 5;
      IR2 = 4;
      txt_sens="<<<<<";
    }
    if (etatlevier_2 == 1) {// si etatbouton est différent de bouton pas_appui, simplement si j'appuie sur le bouton
      IR1 = 4;
      IR2 = 5;
      txt_sens=">>>>>";
    }

  
  lcd.begin(20,4);   // iInit the LCD for 16 chars 2 lines
  lcd.backlight();   // Turn on the backligt (try lcd.noBaklight() to turn it off)
  lcd.setCursor(0,0); //First line
  lcd.print(txt_sens+" attente  "+txt_sens);
  lcd.setCursor(0,1); //Second line
  lcd.print(txt_sens+" vehicule "+txt_sens);
  lcd.setCursor(0,2); //3eme line
  lcd.print(txt_sens+"   SLOT   "+txt_sens);
  lcd.setCursor(0,3); //4eme line
  lcd.print(txt_sens+"  RACING  "+txt_sens);
  // capteurs
  pinMode(IR1,INPUT);
  pinMode(IR2,INPUT);
  //Serial.begin(9600);

  // Clear the display:
  display.clear();
  delay(100);
  // Set the brightness:
  display.setBrightness(7);
  // All segments on:
  display.setSegments(data);
  display.clear();
  display.showNumberDec(radar_seuil, false, 4, 0);


  // Flash
  pinMode(pin_led_flash, OUTPUT);
    //digitalWrite(pin_led_flash, HIGH);
    //delay(200);
    digitalWrite(pin_led_flash, LOW);
}

void loop(){
  
  int valIR1 = digitalRead(IR1);  
  // Lecture de broche A2 et mise du resultat dans la variable valIR1
  int valIR2 = digitalRead(IR2);   
  // Lecture de broche A3 et mise du resultat dans la variable valIR2
 
   if(valIR1 == LOW && compteur1 == 1 && compteur2 == 1) {  
   // Si passage devant IR1 ET compteur1 = 1 alors ....
   temps1=micros();       // enregistrement dans temps1 de la valeur millis
   compteur1 = compteur1 + 1;   
  // On rajoute +1 a compteur1 ce qui empeche le remplacement de la valeur de temps1   
   } 
 
   if(valIR2 == LOW && compteur2 == 1 && compteur1 == 2) {   
   // Si passage devant IR2 ET compteur2 = 1 alors .... 
   temps2=micros();      // enregistrement dans temps1 de la valeur millis    
   compteur2 = compteur2 + 1; 
  // On rajoute +1 a compteur2 ce qui empeche le remplacement de la valeur de temps2    

   }

   if(compteur1 > 1 && compteur2 > 1) {   
       // Si les valeurs de Compteur1 ET de compteur2 sont differente de 1 alors le calcul peut debuter
      tours=tours+1;
       temps3 = (temps2 - temps1);       
       // temps en millisecondes passez entre les deux capteurs

       TTS = ((float)temps3 / 1000000.0);          
       // conversion milisecondes en secondes
     
       V = (0.05 / (float)TTS)*100;               
       // calcul de d/t, ma distance est ici de 5 cm, soit 0,05 m
       // en cm/s
      V_som =V_som+V;
      V_moy=V_som/tours;
      if(V < V_min) {
        V_min=V;
      }
      if(V > V_max) {
        V_max=V;
      }
      //texte=String(V)+"cm/s -"+String(tours)+"    ";
      
      if(V > radar_seuil) {
        nb_flash=nb_flash+1;
        affichage(String(V),String(tours),String(V_min),String(V_max),String(V_moy));
        over_speed();
      } else {
        affichage(String(V),String(tours),String(V_min),String(V_max),String(V_moy));
        delay(500);  // delais avant reprise du programme 
      }
        // Pour permettre la liberation de la zone IR
     
        compteur1=1;  // Variable remise a 1
        compteur2=1;  // Variable remise a 1
        temps1 = 0;   // Variable remise a 0
        temps2= 0;    // Variable remise a 0
   }
 
  //delay(10);

  // #### BOUTONS 
    etatbouton_1 = digitalRead(bouton_1);//etatbouton est égale à la lecture du bouton
    etatbouton_2 = digitalRead(bouton_2);//etatbouton est égale à la lecture du bouton
    
    if (etatbouton_1 != bouton_pasappui_1) {// si etatbouton est différent de bouton pas_appui, simplement si j'appuie sur le bouton
      push_bt_1();
    }
    bouton_pasappui_1 = etatbouton_1;
    
    if (etatbouton_2 != bouton_pasappui_2) {// si etatbouton est différent de bouton pas_appui, simplement si j'appuie sur le bouton
      push_bt_2();
    }
    bouton_pasappui_2 = etatbouton_2;
  
}

void  affichage(String vitesse,String tours,String V_min, String V_max ,String V_moy) {

  lcd.backlight(); 
  //lcd.noBacklight();
  lcd.clear();
  lcd.setCursor(0,0); //First line
  lcd.print(vitesse+"cm/s");
  lcd.setCursor(0,1); //Second line
  lcd.print(tours+" tours "+String(nb_flash)+" flashs");
  lcd.setCursor(0,2); //3eme line
  lcd.print(V_min+" a "+V_max);
  lcd.setCursor(0,3); //4eme line
  lcd.print("Moy. "+V_moy);
}



void push_bt_1(){
    if (etatbouton_1 == LOW) {// et que la position du bouton est à LOW (inversé avec la résistance de PULLUP)
    //Serial.println("+1");
    radar_seuil=radar_seuil+5;
    Serial.println(radar_seuil);
    display.clear();
    display.showNumberDec(radar_seuil, false, 4, 0);
    } 
    delay(50);
}

void push_bt_2(){
    if (etatbouton_2 == LOW) {// et que la position du bouton est à LOW (inversé avec la résistance de PULLUP)
    //Serial.println("-1");
    radar_seuil=radar_seuil-5;
    Serial.println(radar_seuil);
    display.clear();
    display.showNumberDec(radar_seuil, false, 4, 0);
    } 
    delay(50);
}

void over_speed(){
  //display.setSegments(pts);
  lcd.noBacklight();
  display.showNumberDec(int(V), false, 4, 0);
  digitalWrite(pin_led_flash, HIGH);
  delay(20);
  digitalWrite(pin_led_flash, LOW);
  delay(50);
  digitalWrite(pin_led_flash, HIGH);
  delay(50);
  digitalWrite(pin_led_flash, LOW);
  lcd.backlight(); 
  delay(800);
  display.clear();
  display.showNumberDec(radar_seuil, false, 4, 0);
}