This shows you the differences between two versions of the page.
pm:prj2024:ddosaru:nadolu.alexandru [2024/05/26 19:45] robert.nadolu [Software Design] |
pm:prj2024:ddosaru:nadolu.alexandru [2024/05/26 20:19] (current) robert.nadolu [Bibliografie/Resurse] |
||
---|---|---|---|
Line 17: | Line 17: | ||
</note> | </note> | ||
+ | |||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 31: | Line 32: | ||
{{:pm:prj2024:ddosaru:schema_nadolu_alex.png?650|}} | {{:pm:prj2024:ddosaru:schema_nadolu_alex.png?650|}} | ||
</note> | </note> | ||
+ | Proiectul in beta: | ||
- | |||
{{:pm:prj2024:ddosaru:img_7174.jpg?450|}} | {{:pm:prj2024:ddosaru:img_7174.jpg?450|}} | ||
+ | |||
+ | ===== Software Design ===== | ||
+ | |||
**Descrierea aplicației (firmware):** | **Descrierea aplicației (firmware):** | ||
Line 40: | Line 44: | ||
**Cod:** | **Cod:** | ||
- | ```cpp | + | <code> |
- | #include <Wire.h> | + | #include <Wire.h> |
- | #include <LiquidCrystal_I2C.h> | + | #include <LiquidCrystal_I2C.h> |
- | LiquidCrystal_I2C lcd(0x3F, 16, 2); | + | // LCD-ul este initializat de la adresa 0x3F |
+ | LiquidCrystal_I2C lcd(0x3F, 16, 2); | ||
- | const int trigPinFront = 13; | + | // pinii pentru HC-SR04 |
- | const int echoPinFront = 12; | + | const int trigPinFront = 13; |
- | const int trigPinBack = 4; | + | const int echoPinFront = 12; |
- | const int echoPinBack = 3; | + | const int trigPinBack = 4; |
+ | const int echoPinBack = 3; | ||
- | float distanceFront, distanceBack; | + | // distantele fata de obstacolele din fata si din spatele vehiculului |
+ | float distanceFront, distanceBack; | ||
- | #define speakerPin 9 | + | // pinul pentru buzzer |
- | #define ledpin 10 | + | #define speakerPin 9 |
- | unsigned long previousMillis = 0; | + | // pinul pentru led |
- | const long interval = 1000; | + | #define ledpin 10 |
- | void setup() { | + | // variabile pentru masurarea timpului |
- | Serial.begin(9600); | + | unsigned long previousMillis = 0; |
- | pinMode(ledpin, OUTPUT); | + | const long interval = 1000; // 1s |
- | lcd.begin(); | + | |
- | lcd.backlight(); | + | |
- | lcd.setCursor(0, 0); | + | |
- | pinMode(speakerPin, OUTPUT); | + | |
- | digitalWrite(speakerPin, LOW); | + | |
- | pinMode(trigPinFront, OUTPUT); | + | |
- | pinMode(echoPinFront, INPUT); | + | |
- | pinMode(trigPinBack, OUTPUT); | + | |
- | pinMode(echoPinBack, INPUT); | + | |
- | } | + | |
- | float getDistance(int trigPin, int echoPin) { | + | void setup() { |
- | digitalWrite(trigPin, LOW); | + | Serial.begin(9600); |
- | delayMicroseconds(2); | + | |
- | digitalWrite(trigPin, HIGH); | + | // setez pinul ledului pe output |
- | delayMicroseconds(10); | + | pinMode(ledpin, OUTPUT); |
- | digitalWrite(trigPin, LOW); | + | |
- | long duration = pulseIn(echoPin, HIGH); | + | // initializez LCD-ul |
- | float distance = (duration / 2.0) * 0.0343; | + | lcd.begin(); |
- | return distance; | + | lcd.backlight(); |
- | } | + | |
+ | // setez cursorul pe prima linie | ||
+ | lcd.setCursor(0, 0); | ||
+ | |||
+ | // initializez pinul pentru buzzer si ma asigur ca e oprit la inceput | ||
+ | pinMode(speakerPin, OUTPUT); | ||
+ | digitalWrite(speakerPin, LOW); | ||
+ | |||
+ | // initializez pinii pentru senzori | ||
+ | // trigger ON = incep sa transmit ultrasunete, echo masoara durata semnalului | ||
+ | pinMode(trigPinFront, OUTPUT); | ||
+ | pinMode(echoPinFront, INPUT); | ||
+ | |||
+ | pinMode(trigPinBack, OUTPUT); | ||
+ | pinMode(echoPinBack, INPUT); | ||
+ | } | ||
+ | |||
+ | float getDistance(int trigPin, int echoPin) { | ||
+ | // trimite un impuls pe pinul trig, ma asigur inainte ca trig este in repaus | ||
+ | digitalWrite(trigPin, LOW); | ||
+ | delayMicroseconds(2); | ||
+ | |||
+ | digitalWrite(trigPin, HIGH); | ||
+ | delayMicroseconds(10); | ||
+ | digitalWrite(trigPin, LOW); | ||
+ | |||
+ | // masoara durata pe pinul echo | ||
+ | long duration = pulseIn(echoPin, HIGH); | ||
+ | |||
+ | // distanta = durata (dus - intors) * viteza de propagare a sunetului | ||
+ | float distance = (duration / 2.0) * 0.0343; | ||
+ | |||
+ | // returnez distanta | ||
+ | return distance; | ||
+ | } | ||
void loop() { | void loop() { | ||
Line 88: | Line 119: | ||
if (currentMillis - previousMillis >= interval) { | if (currentMillis - previousMillis >= interval) { | ||
previousMillis = currentMillis; | previousMillis = currentMillis; | ||
+ | |||
+ | // distanta pentru senzorul din fata | ||
distanceFront = getDistance(trigPinFront, echoPinFront); | distanceFront = getDistance(trigPinFront, echoPinFront); | ||
+ | |||
+ | // distanta pentru senzorul din spate | ||
distanceBack = getDistance(trigPinBack, echoPinBack); | distanceBack = getDistance(trigPinBack, echoPinBack); | ||
+ | |||
+ | // afisez distantele pe LCD | ||
lcd.clear(); | lcd.clear(); | ||
lcd.setCursor(0, 0); | lcd.setCursor(0, 0); | ||
Line 95: | Line 132: | ||
lcd.print(distanceFront); | lcd.print(distanceFront); | ||
lcd.print(" cm"); | lcd.print(" cm"); | ||
+ | |||
+ | // mut cursorul pe al doilea rand al ecranului | ||
lcd.setCursor(0, 1); | lcd.setCursor(0, 1); | ||
lcd.print("Back: "); | lcd.print("Back: "); | ||
Line 101: | Line 140: | ||
} | } | ||
+ | // verific care este cea mai mica distanta pana la obstacol (fata sau spate) | ||
float minDistance = min(distanceFront, distanceBack); | float minDistance = min(distanceFront, distanceBack); | ||
if (minDistance <= 20) { | if (minDistance <= 20) { | ||
+ | // calculez intensitatea led-ului in functie de distanta | ||
int ledIntensity = map(minDistance, 1.67, 20, 255, 1); | int ledIntensity = map(minDistance, 1.67, 20, 255, 1); | ||
+ | |||
+ | // emit semnale acustice | ||
int buzzerSpeed = map(minDistance, 1, 20, 100, 500); | int buzzerSpeed = map(minDistance, 1, 20, 100, 500); | ||
unsigned long beepEnd = millis() + interval; | unsigned long beepEnd = millis() + interval; | ||
+ | |||
while (millis() < beepEnd) { | while (millis() < beepEnd) { | ||
+ | // setez intensitatea LED-ului | ||
analogWrite(ledpin, ledIntensity); | analogWrite(ledpin, ledIntensity); | ||
analogWrite(speakerPin, 255); | analogWrite(speakerPin, 255); | ||
Line 113: | Line 158: | ||
analogWrite(speakerPin, 0); | analogWrite(speakerPin, 0); | ||
analogWrite(ledpin, 0); | analogWrite(ledpin, 0); | ||
+ | | ||
delay(buzzerSpeed / 2); | delay(buzzerSpeed / 2); | ||
+ | | ||
} | } | ||
} else { | } else { | ||
+ | // opresc semnalele acustice si luminoase | ||
digitalWrite(speakerPin, LOW); | digitalWrite(speakerPin, LOW); | ||
analogWrite(ledpin, 0); | analogWrite(ledpin, 0); | ||
} | } | ||
} | } | ||
- | ``` | + | |
+ | |||
+ | </code> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Un videoclip cu proiectul se poate vedea mai jos: |
+ | <html> | ||
+ | <iframe width="700" height="435" src="https://www.youtube.com/embed/RUq7kS161kw" title="Parking sensor"></iframe> | ||
+ | </html> | ||
</note> | </note> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | + | Un proiect la care am lucrat de drag, foarte challenging si frumos, de care imi voi aminti cu placere. | |
===== Download ===== | ===== Download ===== | ||
Line 147: | Line 200: | ||
<note> | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe *Resurse Software* şi *Resurse Hardware*. | + | * https://ocw.cs.pub.ro/courses/pm/lab/lab0-2023 |
+ | * https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023-2024 | ||
+ | * https://ocw.cs.pub.ro/courses/pm/lab/lab6-2023-2024 | ||
+ | * https://www.youtube.com/watch?v=0Lhgd8PQmn0 | ||
+ | * https://www.ardumotive.com/how-to-use-a-buzzer-en.html | ||
</note> | </note> | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> |