This shows you the differences between two versions of the page.
pm:prj2025:iotelea:bogdan.fratiman [2025/05/25 21:19] bogdan.fratiman |
pm:prj2025:iotelea:bogdan.fratiman [2025/05/26 12:08] (current) bogdan.fratiman |
||
---|---|---|---|
Line 59: | Line 59: | ||
**Surse şi funcţii implementate:** | **Surse şi funcţii implementate:** | ||
- | * ''setup()'' - Inițializează toate perifericele și configurează Timer1 în mod Fast PWM (WGM13:0 = 14) cu TOP = ICR1 = 40000, pentru a genera un semnal PWM de 50 Hz pe pinul OC1A (pin 9), cu un prescaler de 8, potrivit pentru servomotorul SG90. | + | * ''setup()'' - Inițializează toate perifericele și configurează Timer1 în mod Fast PWM (WGM13:0 = 14) cu TOP = ICR1 = 40000, pentru a genera un semnal PWM de 50 Hz pe pinul OC1A (pin 9), cu un prescaler de 8, potrivit pentru servomotorul SG90: |
- | * ''setServoAngle(int angle)'' - Primește un unghi între 0° și 180°, îl convertește într-un impuls PWM între 750 și 2300 µs, apoi setează valoarea în OCR1A. | + | <code java> |
+ | TCCR1A = (1 << WGM11); | ||
+ | TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11); | ||
+ | |||
+ | ICR1 = 40000; | ||
+ | TCCR1A |= (1 << COM1A1); | ||
+ | </code> | ||
+ | * ''setServoAngle(int angle)'' - Primește un unghi între 0° și 180°, îl convertește într-un impuls PWM între 750 și 2300 µs, apoi setează valoarea în OCR1A: | ||
+ | <code java> | ||
+ | int pulseWidth = map(angle, 0, 180, 750, 2300); | ||
+ | OCR1A = pulseWidth * 2; | ||
+ | </code> | ||
* ''handleButtonPress()'' - Activează rutina de întrerupere pentru buton setând flag-ul ''buttonPressed''. | * ''handleButtonPress()'' - Activează rutina de întrerupere pentru buton setând flag-ul ''buttonPressed''. | ||
- | * ''loop()'' - Bucla principală. | + | <code java> |
+ | attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonPress, RISING); | ||
+ | </code> | ||
+ | * ''loop()'' - Bucla principală a programului. Se ocupă de: | ||
+ | * măsurarea distanței cu senzorul HC-SR04 | ||
+ | <code java> | ||
+ | digitalWrite(trigPin, LOW); | ||
+ | delayMicroseconds(2); | ||
+ | digitalWrite(trigPin, HIGH); | ||
+ | delayMicroseconds(10); | ||
+ | digitalWrite(trigPin, LOW); | ||
+ | |||
+ | long duration = pulseIn(echoPin, HIGH); | ||
+ | float distance = duration * 0.034 / 2; | ||
+ | </code> | ||
+ | * actualizarea ecranului LCD | ||
+ | * verificarea stării butonului | ||
+ | * acționarea barierei prin apeluri la ''setServoAngle(...)'' | ||
</note> | </note> | ||
Line 70: | Line 98: | ||
Link Youtube: | Link Youtube: | ||
+ | https://youtube.com/shorts/j4JR8kcPbFc?feature=share | ||
</note> | </note> |