Phase 2 2021/22
In diesem Buch sind die Teamergebnisse der FST21 in Phase 2 dokumentiert.
Im Merge wurden alle Programmabschnitte in einem Programmcode zusammengeführt:
//Infrarotsensor
#include <IRremoteESP8266.h> // Bibliothek zum Empfang von Infrarotsignalen
#include <IRrecv.h> // Bibliothek zum Empfang von Infrarotsignalen
#include <IRutils.h> // Bibliothek für Funktionen nach Infrarotempfang
#define RECV_PIN 34 // Pin, an dem der Pin des IR-Empfängers angeschlossen ist
IRrecv irrecv(RECV_PIN); // Eingangsbestimmung für den Infrarot-Datenstrom
decode_results results; // Dekodierung in Datei schreiben
// Angabe von '0x' vor dem eigentlichen Hexcode
// Bezeichnung HEX-Code
int button_Power = 0xECDF8084; // zurücksetzen auf den ursprungszustand
int button_Down = 0x7F984248; // keine Zuordnung in diesem Programm
int button_Up = 0xC5F76D04; // keine Zuordnung in diesem Programm
//int button_01 = 0x3138F3E0; // keine Zuordnung in diesem Programm
//int button_02 = 0xBF33DC80; // keine Zuordnung in diesem Programm
//int button_03 = 0xABB78D20; // keine Zuordnung in diesem Programm
//int button_04 = 0x4A86A8C0; // keine Zuordnung in diesem Programm
int button_05 = 0xC0134580; // Modus PDC optische akustische Signale
//int button_06 = 0xBA1256C4; // keine Zuordnung in diesem Programm
//int button_07 = 0x52A2DA24; // keine Zuordnung in diesem Programm
//int button_08 = 0xB74C8420; // keine Zuordnung in diesem Programm
//int button_09 = 0xE3172C20; // keine Zuordnung in diesem Programm
//int button_VolumePlus = 0xF62981E4; // keine Zuordnung in diesem Programm
//int button_00 = 0x2F9EF384; // keine Zuordnung in diesem Programm
int button_ChannelPlus = 0x9C7C29E0; // Änderung Wertebereich für optische akustische Signale nach oben; Fahrzeug in Positionierung nach vorne verfahren
//int button_VolumeMinus = 0x973C68E0; // keine Zuordnung in diesem Programm
//int button_Enter = 0x3C1BB180; // keine Zuordnung in diesem Programm
int button_ChannelMinus = 0x1B433B24; // Änderung Wertebereich für optische akustische Signale nach unten; Fahrzeug in Positionierung nach hinten verfahren
int IRcode = 0x00000000; // variable für den Empfangenen Tastencode
int merker_Power = 0;
int merker_Down = 0;
int merker_Up = 0;
//int merker_01 = 0;
//int merker_02 = 0;
//int merker_03 = 0;
//int merker_04 = 0;
int merker_05 = 0;
//int merker_06 = 0;
//int merker_07 = 0;
//int merker_08 = 0;
//int merker_09 = 0;
//int merker_VolumePlus = 0;
//int merker_00 = 0;
int merker_ChannelPlus = 0;
//int merker_VolumeMinus = 0;
//int merker_Enter = 0;
int merker_ChannelMinus = 0;
//Ultraschallsensor
#define echo 15 //Anschluss ECHO vom HC-SR04 wurde für PIN 15 festgelegt
#define trig 18 //Anschluss TRIG vom HC-SR04 wurde für PIN 18 festgelegt
//Display mit Controller
#include <TM1637TinyDisplay.h> // Bibliothek für die 7- Segment Anzeige
#define CLK 21 //Anschluss CLK von der 7- Segment Anzeige wurde für PIN 21 festgelegt
#define DIO 19 //Anschluss DIO von der 7- Segment Anzeige wurde für PIN 19 festgelegt
TM1637TinyDisplay display(CLK, DIO);
const uint8_t SEG_PDC_NORMAL[] = {0x39, 0x00, 0x00, 0x00,};
const uint8_t SEG_PDC_VOR[] = {0x3f, 0x39, 0x00, 0x00,};
const uint8_t SEG_PDC_END[] = {0x3f, 0x3f, 0x39, 0x00,};
const uint8_t SEG_PDC_NOT[] = {0x3f, 0x3f, 0x3f, 0x39,};
const uint8_t SEG_PDC_STOP[] = {0x7f, 0x7f, 0x7f, 0x7f,};
const uint8_t SEG_Modus_MS[] = {0x54, 0x44, 0x52, 0x6d,};
const uint8_t SEG_Modus_kmh[] = {0x78, 0x54, 0x44, 0x74,};
const uint8_t SEG_VEH_STOP[] = {0x6d, 0x78, 0x3f, 0x73,};
const uint8_t SEG_VEH_VPlus[] = {0x1c, 0x46, 0x40, 0x00,};
const uint8_t SEG_VEH_VMinus[] = {0x1c, 0x40, 0x40, 0x00,};
//Pins der Soundmodule
#define Sound1 12
#define Sound2 13
#define Sound3 14
#define Sound4 27
// Motortreiber L298N
#define MotV 27
#define MotR 26
#define MotEna 12
//PWM Motortreiber
int Freq = 30000;
int Res = 8;
int PwmChannelMotEna = 2;
int DutyCycleMotEna = 0; // MaximalWert: 250; Minimalwet 160;
int DutyCycleNull = 0;
//allgemeine Variablen, die in verschiedenen Programmabläufen aufgerufen werden
int merker_PdcMode = 2; //Wertespeicher für den PDC Modus. Ursprung ist mit 2 = normal
int distanz1 =0; //erste errechnete Distanz zum Ultraschallsensor. Für die Geschwindigkeitserrechnung
int zeitx1 = 0; //Deklaration der Variablen "zeitx"
int vResNull_230 = 0; //Merker für die Geschwindigkeitsreduzierung
int vResNull_220 = 0;
int vResNull_210 = 0;
int vResNull_200 = 0;
int vResNull_190 = 0;
int vResNull_180 = 0;
int vResNull_170 = 0;
int vResNull_160 = 0;
int merker_positionierungsmodi = 0;
int merker_Verfahrweg = 0;
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 1: Errechnung der ersten Distanz zum Objekt
int EntfernungsMessung1 (){
long distanz1 = 0; //Deklaration der Variablen "distanz1"
long zeitx1 = 0; //Deklaration der Variablen "zeitx"
digitalWrite (trig, LOW); //setzt den Zustand von trig auf LOW
delayMicroseconds(3); //setzt eine Pause/Unterbrechung von 3 Mikrosekunden
noInterrupts(); //verhindert eine Unterbrechung des Vorgangs
digitalWrite(trig, HIGH); //setzt den Zustand von trig auf HIGH
delayMicroseconds(10); //setzt eine Pause/Unterbrechung von 10 Mikrosekunden
digitalWrite(trig, LOW); //setzt den Zustand von trig auf LOW
zeitx1 = pulseIn(echo, HIGH);
interrupts(); //lässt Vorgangsunterbrechungen erneut zu
// Serial.print("Zeitx1 PulseIn:");
// Serial.print(zeitx1);
// Serial.println("");
zeitx1 = (((zeitx1 * 344)/1000)/2); //vererrechnet den Wert der Zeit mit der Schallgeschwindigkeit nach der Raumtemperaur,
//dem Faktor für die Kommastelle und halbiert diesen wegen der doppelten strecke (hin+zurück)
distanz1 = zeitx1;
// Serial.print("distanz1 Wert01:"); //Ausgabe des Wertes über den seriellen Monitor
// Serial.print(distanz1);
// Serial.println("");
return (distanz1); //Ausgabe des Wertes für die Entfernung
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 2: Erfassen eines Infrarotsignals
int IRCodeAuslesen (){
if (irrecv.decode(&results)) //Wenn ein IR-Signal empfangen wurde
{
IRcode = (results.value); //Das Empfangsignal in der Variable speichern
Serial.print(IRcode, HEX); //Gebe empfangenen Code hexadezimal im seriellen Monitor aus
Serial.println("");
irrecv.resume(); //IR-Empfänger für den nächsten Wert bereit machen.
if(IRcode == 0xFFFFFFFF)
{
IRcode = 0x00000000;
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 3: Programmcode PDC mit Wertebereichanpassung
int PdcMode (){
if (merker_05 == 0 ) //einmalige Anzeige des Modus
{
Serial.println ("Modus: Optische akustische Signale (Park Distance Control)"); //Ausgabe des Modus über den seriellen Monitor
}
merker_05 = 1; //Aktivierung des Merkers für den Programmabschnitt, damit er automatisch wiederholt wird
merker_Up = 0; // Nullsetzung der anderen Modusmerker
merker_Down = 0;
if(IRcode == button_05)
{
IRcode = 0x00000000; //Zurücksetzen des IR-Codespeichers
Serial.println ("IrCode gelöscht");
}
if (IRcode == button_ChannelPlus && merker_PdcMode <= 2) //Anpassung des Abstandes über Taster
{
merker_PdcMode ++; //erhöhen des Abstandes
Serial.print("Merker PDC-Mode:");
Serial.print(merker_PdcMode); //Ausabe des aktuellen Abstandsmodus über den seriellen Monitor
Serial.println("");
IRcode = 0x00000000; //Zurücksetzen des IR-Codespeichers
}
if (IRcode == button_ChannelMinus && merker_PdcMode >= 2) //Anpassung des Abstandes über Taster
{
merker_PdcMode --; //verringern des Abstandes
Serial.print("Merker PDC-Mode:");
Serial.print(merker_PdcMode); //Ausabe des aktuellen Abstandsmodus über den seriellen Monitor
Serial.println("");
IRcode = 0x00000000; //Zurücksetzen des IR-Codespeichers
}
distanz1 = EntfernungsMessung1 (); //errechnen der Distanz
distanz1 = distanz1 / 10;
// Serial.print("Distanz 1 PDC ");
// Serial.print(distanz1);
// Serial.print("cm");
// Serial.println ("");
if (merker_05 == 1 && merker_PdcMode == 1) //Abfrage nach dem Distanzbereich 1 (nah)
{
PDC1 ();
}
if (merker_05 == 1 && merker_PdcMode == 2) //Abfrage nach dem Distanzbereich 2 (mittel)
{
PDC2 ();
}
if (merker_05 == 1 && merker_PdcMode == 3) //Abfrage nach dem Distanzbereich 3 (weit)
{
PDC3 ();
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 4: PDC Nah
int PDC1 ()
{
if ((distanz1 <= 20) && (distanz1 >= 15)) // Abstandsbedingungen für Abstandsberech 1
{
display.setSegments(SEG_PDC_VOR); // Anzeige des Abstandes über das Display
digitalWrite(Sound1, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.1
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound1, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else if ((distanz1 <= 15) && (distanz1 >= 10)) // Abstandsbedingung für Abstandsbereich 2
{
display.setSegments(SEG_PDC_END); // Anzeige des Abstandes über das Display
digitalWrite(Sound2, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.2
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound2, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else if ((distanz1 <= 10) && (distanz1 >= 6)) // Abstandsbedingungen für Abstandsberech 3
{
display.setSegments(SEG_PDC_NOT); // Anzeige des Abstandes über das Display
digitalWrite(Sound3, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.3
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound3, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else if (distanz1 <= 5) // Abstandsbedingungen für Abstandsberech 4
{
display.setSegments(SEG_PDC_STOP); // Anzeige des Abstandes über das Display
digitalWrite(Sound4, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.4
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound4, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else // Abstandsbedingungen für Abstandsberech 0
{
display.setSegments(SEG_PDC_NORMAL); // Anzeige des Abstandes über das Display
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 5: PDC Mittel
int PDC2 ()
{
if ((distanz1 <= 55) && (distanz1 >= 51)) // Abstandsbedingungen für Abstandsberech 1
{
display.setSegments(SEG_PDC_VOR); // Anzeige des Abstandes über das Display
digitalWrite(Sound1, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.1
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound1, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else if ((distanz1 <= 50) && (distanz1 >= 46)) // Abstandsbedingungen für Abstandsberech 2
{
display.setSegments(SEG_PDC_END); // Anzeige des Abstandes über das Display
digitalWrite(Sound2, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.2
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound2, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else if ((distanz1 <= 45) && (distanz1 >= 41)) // Abstandsbedingungen für Abstandsberech 3
{
display.setSegments(SEG_PDC_NOT); // Anzeige des Abstandes über das Display
digitalWrite(Sound3, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.3
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound3, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else if (distanz1 <= 40) // Abstandsbedingungen für Abstandsberech 4
{
display.setSegments(SEG_PDC_STOP); // Anzeige des Abstandes über das Display
digitalWrite(Sound4, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.4
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound4, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else // Abstandsbedingungen für Abstandsberech 0
{
display.setSegments(SEG_PDC_NORMAL); // Anzeige des Abstandes über das Display
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 6: PDC Weit
int PDC3 ()
{
if ((distanz1 <= 85) && (distanz1 >= 81)) // Abstandsbedingungen für Abstandsberech 1
{
display.setSegments(SEG_PDC_VOR); // Anzeige des Abstandes über das Display
digitalWrite(Sound1, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.1
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound1, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else if ((distanz1 <= 80) && (distanz1 >= 76)) // Abstandsbedingungen für Abstandsberech 2
{
display.setSegments(SEG_PDC_END); // Anzeige des Abstandes über das Display
digitalWrite(Sound2, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.2
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound2, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else if ((distanz1 <= 75) && (distanz1 >= 71)) // Abstandsbedingungen für Abstandsberech 3
{
display.setSegments(SEG_PDC_NOT); // Anzeige des Abstandes über das Display
digitalWrite(Sound3, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.3
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound3, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else if (distanz1 <= 70) // Abstandsbedingungen für Abstandsberech 4
{
display.setSegments(SEG_PDC_STOP); // Anzeige des Abstandes über das Display
digitalWrite(Sound4, HIGH); // Wiedergabetrigger des Sounds aus Soundmodul Nr.4
delay (2); // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
digitalWrite(Sound4, LOW); // zurücksetzen des Wiedergabetrigger des Soundmoduls
}
else // Abstandsbedingungen für Abstandsberech 0
{
display.setSegments(SEG_PDC_NORMAL); // Anzeige des Abstandes über das Display
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 7: Fahrzeugstopp
int StopMode (){
merker_Up = 0; // Zurücksetzen der Modusmerker
merker_Down = 0;
merker_05 = 0;
Serial.println ("Power Button gedrückt, Fahrzeugfunktionen Stopp"); // Ausgabe über den seriellen Monitor
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
DutyCycleMotEna = 200;
ledcWrite (PwmChannelMotEna, DutyCycleNull); // Nullsetzen des PWM-Ausgangs
digitalWrite (MotV , LOW ); // Nullsetzen der Motordrehrichtung
digitalWrite (MotR , LOW );
display.setSegments (SEG_VEH_STOP);
vResNull_230 = 0; // Merker für die Geschwindigkeitsreduzierung
vResNull_220 = 0;
vResNull_210 = 0;
vResNull_200 = 0;
vResNull_190 = 0;
vResNull_180 = 0;
vResNull_170 = 0;
vResNull_160 = 0;
merker_positionierungsmodi = 0;
merker_ChannelPlus = 0;
merker_ChannelMinus = 0;
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt vorwärts
int FahrzeugVorwaerts (){
if (merker_Up == 0 ) // einmalige Anzeige des Modus
{
Serial.println ("Modus: Fahrzeug fährt vorwärts"); // Ausgabe des Modus über den seriellen Monitor
// Festlegen des Startwerts, Mitte zwischen Minimum und Maximum
DutyCycleMotEna = 200; // Minimal 160, maximal 255 bei DutyCycleMotEna
digitalWrite (MotV , HIGH); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , LOW );
display.setSegments (SEG_VEH_VPlus);
delay(500);
display.clear();
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
merker_Up = 1; // Aktivierung des Merkers für den Programmabschnitt, damit er automatisch wiederholt wird
merker_Down = 0; // Nullsetzung der anderen Modusmerker
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
distanz1 = EntfernungsMessung1 (); // errechnen der Distanz
distanz1 = distanz1 / 10; // Umformen der Distanz zu Cm
// Serial.print("Distanz zu Objekt "); // Ausgabe der Distanz über den seriellen Monitor
// Serial.print(distanz1);
// Serial.print("cm");
// Serial.println ("");
display.showNumber (distanz1); // Ausgabe des Wertes der Distanz auf dem Display mit Decoder
if (IRcode == button_Up && DutyCycleMotEna < 241 && distanz1 >= 50) // Bedingungen für die Geschwindigkeitserhöhung
{
DutyCycleMotEna = DutyCycleMotEna +10; // Erhöhung der Geschwindigkeit über den Wert des DutyCycles
Serial.print ("DutyCycleMotEna Anhebung auf:"); // Ausgabe über den seriellen Monitor
Serial.print (DutyCycleMotEna);
Serial.println("");
vResNull_230 = 0; //Merker für die Geschwindigkeitsreduzierung
vResNull_220 = 0;
vResNull_210 = 0;
vResNull_200 = 0;
vResNull_190 = 0;
vResNull_180 = 0;
vResNull_170 = 0;
vResNull_160 = 0;
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (IRcode == button_Down && DutyCycleMotEna >169) // Bedingung für die Geschwindigkeitsverringerung
{
DutyCycleMotEna = DutyCycleMotEna -10; // Verringerung der Geschwindigkeit über den Wert des DutyCycles
Serial.print ("DutyCycleMotEna Senkung auf:"); // Ausgabe über den seriellen Monitor
Serial.print (DutyCycleMotEna);
Serial.println("");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (IRcode == button_Down && DutyCycleMotEna == 160) // Stoppen des Fahrzeugs bei minimalem Geschwindigkeitswert
{
IRcode = button_Power; // Ansteuern des Stoppmodus
}
//Abschnitt Geschwindigkeitsreduzierung bei Objekterkennung
if (distanz1 < 50 && DutyCycleMotEna > 230&& vResNull_230 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 230; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V230"); // Ausgabe über den seriellen Monitor
vResNull_230 = 1;
}
if (distanz1 < 47 && DutyCycleMotEna > 220 && vResNull_220 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 220; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V220"); // Ausgabe über den seriellen Monitor
vResNull_220 = 1;
}
if (distanz1 < 44 && DutyCycleMotEna > 210 && vResNull_210 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 210; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V210"); // Ausgabe über den seriellen Monitor
vResNull_210 = 1;
}
if (distanz1 < 41 && DutyCycleMotEna > 200 && vResNull_200 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 200; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V200"); // Ausgabe über den seriellen Monitor
vResNull_200 = 1;
}
if (distanz1 < 38 && DutyCycleMotEna > 190 && vResNull_190 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 190; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V190"); // Ausgabe über den seriellen Monitor
vResNull_190 = 1;
}
if (distanz1 < 35 && DutyCycleMotEna > 180 && vResNull_180 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 180; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V180"); // Ausgabe über den seriellen Monitor
vResNull_180 = 1;
}
if (distanz1 < 32 && DutyCycleMotEna > 170 && vResNull_170 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 170; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V170"); // Ausgabe über den seriellen Monitor
vResNull_170 = 1;
}
if (distanz1 < 29 && DutyCycleMotEna > 160 && vResNull_160 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 160; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V160"); // Ausgabe über den seriellen Monitor
vResNull_160 = 1;
}
if (distanz1 < 26 && DutyCycleMotEna == 160 && vResNull_160 == 1 && merker_positionierungsmodi == 0)
{ // Bis zum Stillstand vor dem Objekt und dem Wechsel in den Abstandsmodus
DutyCycleMotEna = 0; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleNull); // Schreiben des DutyCycles in den Ausgang
delay(1000);
digitalWrite (MotV , LOW ); // zurücksetzen der Drehrichtung des Motors
digitalWrite (MotR , LOW );
merker_positionierungsmodi = 1; // Aktivieren des Merkers für die Positionierung
merker_Verfahrweg = distanz1;
Serial.println("Fahrzeug gestoppt, Positioniermodus aktiviert"); // Ausgabe über den seriellen Monitor
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Positionierung vor Objekt stehend
int Positionierung (){
distanz1 = EntfernungsMessung1 (); // errechnen der Distanz
distanz1 = distanz1 / 10; // Umrechnen des Wertes in Cm
display.showNumber (distanz1); // Ausgabe des wertes auf dem Display mit Decoder
if (IRcode == button_ChannelPlus || merker_ChannelPlus ==1) // Bedingung für das Verfahren nach vorne
{
if (merker_ChannelPlus == 0) // Einmal Ausführung des Schreibens der Motorwerte
{
digitalWrite (MotV , HIGH ); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , LOW );
DutyCycleMotEna = 200; // Starten mit einem initialwert, damit der motor sich dreht
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
delay(20);
DutyCycleMotEna = 180; // Schrittweises Absenken der Drehgeschwindigkeit
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
delay(20);
DutyCycleMotEna = 160; // Bis zur Minimalfrequenz
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
merker_ChannelPlus = 1;
merker_Verfahrweg = distanz1;
merker_Verfahrweg = merker_Verfahrweg -5;
Serial.print ("Distanz 1 ");
Serial.println (distanz1);
Serial.print ("merker_Verfahrweg ");
Serial.println (merker_Verfahrweg);
Serial.println ("ChannelPlus betätigt, Anpassung nach vorne angefordert");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (distanz1 < merker_Verfahrweg)
{
digitalWrite (MotV , LOW ); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , LOW );
DutyCycleMotEna = 0;
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
merker_ChannelPlus = 0;
Serial.println ("ChannelPlus betätigt, Anpassung nach vorne wurde abgeschlossen");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
}
if (IRcode == button_ChannelMinus || merker_ChannelMinus ==1)
{
if (merker_ChannelMinus == 0)
{
digitalWrite (MotV , LOW ); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , HIGH );
DutyCycleMotEna = 200;
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
delay(20);
DutyCycleMotEna = 180;
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
delay(20);
DutyCycleMotEna = 160;
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
merker_ChannelMinus = 1;
merker_Verfahrweg = merker_Verfahrweg +5;
Serial.print ("ChannelPlus betätigt, Anpassung nach hinten angefordert");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (distanz1 > merker_Verfahrweg)
{
digitalWrite (MotV , LOW ); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , LOW );
DutyCycleMotEna = 0;
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
merker_ChannelMinus = 0;
Serial.print ("ChannelPlus betätigt, Anpassung nach hinten wurde abgeschlossen");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt Rückwärts
int FahrzeugRueckwaerts()
{
distanz1 = EntfernungsMessung1 (); // errechnen der Distanz
distanz1 = distanz1 / 10;
display.showNumber (distanz1); // Ausgabe des Wertes der Distanz auf dem Display mit Decoder
if (merker_Down == 0 ) // einmalige Anzeige des Modus
{
Serial.println ("Modus: Fahrzeug fährt Rückwärts"); // Ausgabe des Modus über den seriellen Monitor
// Festlegen des Startwerts, Mitte zwischen Minimum und Maximum
DutyCycleMotEna = 200; // Minimal 160, maximal 255 bei DutyCycleMotEna
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
digitalWrite (MotV , LOW ); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , HIGH );
display.setSegments (SEG_VEH_VMinus);
delay(500);
display.clear();
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
merker_Down = 1; // Aktivierung des Merkers für den Programmabschnitt, damit er automatisch wiederholt wird
merker_Up = 0; // Nullsetzung der anderen Modusmerker
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
if (IRcode == button_Down && DutyCycleMotEna < 241) // Bedingungen für die Geschwindigkeitserhöhung
{
DutyCycleMotEna = DutyCycleMotEna +10; // Erhöhung der Geschwindigkeit
Serial.print ("DutyCycleMotEna Anhebung auf:"); // Ausgabe über den seriellen Monitor
Serial.print (DutyCycleMotEna);
Serial.println("");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (IRcode == button_Up && DutyCycleMotEna > 169) // Bedingung für die Geschwindigkeitsverringerung
{
DutyCycleMotEna = DutyCycleMotEna -10; // Verringerung der Geschwindigkeit
Serial.print ("DutyCycleMotEna Senkung auf:"); // Ausgabe über den seriellen Monitor
Serial.print (DutyCycleMotEna);
Serial.println("");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (IRcode == button_Up && DutyCycleMotEna == 160) // Stoppen des Fahrzeugs bei minimalem Geschwindigkeitswert
{
IRcode = button_Power; // Ansteuern des Stoppmodus
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void setup() {
//Infrarotempfänger
irrecv.enableIRIn(); // Empfänger wird ausgeführt
//Display TM1637
display.setBrightness(7);
//Ultraschallsensor
pinMode (echo , INPUT ); //festlegen des Pins am Ultraschallsensor als Eingang
pinMode (trig , OUTPUT); //festlegen des Pins am Ultraschallsensor als Ausgang
//Soundmodule
pinMode (Sound1 , OUTPUT); // festlegen der Pins der Soundmodule als Ausgänge
pinMode (Sound2 , OUTPUT);
pinMode (Sound3 , OUTPUT);
pinMode (Sound4 , OUTPUT);
//L298N
pinMode (MotV , OUTPUT); // festlegen des Pins am L298N als Ausgang
pinMode (MotR , OUTPUT); // festlegen des Pins am L298N als Ausgang
pinMode (MotEna , OUTPUT); // festlegen des Pins am L298N als Ausgang
//PWM
ledcSetup (PwmChannelMotEna, Freq, Res); // PWM-Kanal Einstellung
ledcAttachPin (MotEna, PwmChannelMotEna); // Definition des PWM-Kanals auf den Pin
Serial.begin(115200); //Seriellen Monitor mit einer Baudrate von 115200 starten
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void loop() {
//EntfernungsMessung1 ();
IRCodeAuslesen ();
//PdcMode ();
//PDC1 ();
//PDC2 ();
//PDC3 ();
//StopMode ();
//FahrzeugVorwaerts ();
//FahrzeugRueckwaerts ();
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Modus: PDC mit veränderbarem Abstandsbereich
if (IRcode == button_05 || merker_05 == 1) //Modus: PDC mit veränderbarem Abstandsbereich
{
PdcMode ();
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt vorwärts + Objekterkennung und Stoppbereichanpassung
// Bedingungen für Modus: Fahrzeug fährt vorwärts
if ((IRcode == button_Up && merker_Down == 0)|| merker_Up == 1 && merker_positionierungsmodi == 0)
{
FahrzeugVorwaerts();
}
if (merker_positionierungsmodi == 1)
{
Positionierung ();
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt rückwärts
// Bedingungen für Modus: Fahrzeug fährt rückwärts
if ((IRcode == button_Down && merker_Up == 0)|| merker_Down == 1 && merker_positionierungsmodi == 0)
{
FahrzeugRueckwaerts();
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Modus: allgemeiner Funktionsstopp
if (IRcode == button_Power) // Bedingung für Funktion: Allgemeiner Fahrzeugstopp
{
StopMode ();
}
}