Nachdem ich das Radar erstellt hatte, das Sie hier finden können: http://noscollections.ddns.net/carrerago/?p=2818, habe ich beschlossen, es ein wenig zu verbessern. Es fehlten ein paar Funktionen.
Funktionen:
- Geschwindigkeitsbegrenzungsanzeige
- Geschwindigkeitsbegrenzung einstellen (Blitzauslöser)
- Einen Blitz hinzufügen
- Schalter, der die Fahrtrichtung des Fahrzeugs anzeigt
- Schaltfläche zum Zurücksetzen der Parameter
Um dies zu erreichen, habe ich 2 Tasten hinzugefügt, eine grüne, um 5 zur Anzeige zu addieren und eine grüne, um 5 zu subtrahieren. Die rote Anzeige zeigt die zulässige Geschwindigkeitsbegrenzung in cm/s an.
Das Hauptdisplay zeigt mehrere Informationen an.
- Die letzte Durchgangsgeschwindigkeit in cm/s auf der ersten Zeile.
- Die Anzahl der absolvierten Runden und wie oft Sie geblitzt wurden (Überschreitung der autorisierten/eingestellten Geschwindigkeit)
- Die erreichten Mindest- und Höchstgeschwindigkeiten
- Der Durchschnitt der Durchgangsgeschwindigkeiten.
Der schwarze Knopf an der Seite des Radars ermöglicht das Zurücksetzen der Daten.
Material:
- LCM2004 (4-Zeilen-Bildschirm) (3,5€)
- TM1637 (Rotes Display) (1€)
- 3W Hochleistungs-LED-Modul mit PCB-Chassis (2€)
- 3 Druckknöpfe (0,2€)
- 2-Positionen-Hebelschalter (0,3 €)
- 1 Arduino Nano (3€)
- 1 Arduino-Nano-Unterstützung (2 €)
Die Nesquik-Box ist voll. Tasten und Displays stellen eine Verbindung zur Arduino Nano-Unterstützung her.
An den Schaltern habe ich Laschen verwendet. Ich schneide das Ende der Dupont-Drähte ab, um die Anschlüsse einzuführen und sie einfacher an den Schaltern befestigen zu können.
Auf der Deckelseite wurde die Hochleistungsdiode hinzugefügt, um den Radarblitz darzustellen. (rotes Element im Foto)
Video:
Hier ist der Anschlussplan aller Komponenten.
Und nun der Code zum Programmieren des Arduino.
Wenn Sie weitere Informationen zur Implementierung zum Senden des Programms an den Arduino wünschen, können Sie den folgenden Artikel lesen : 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);
}