This shows you the differences between two versions of the page.
pm:prj2024:sseverin:ana_maria.mirza [2024/05/26 07:33] ana_maria.mirza [Implementare] |
pm:prj2024:sseverin:ana_maria.mirza [2024/05/27 15:52] (current) ana_maria.mirza [Implementare] |
||
---|---|---|---|
Line 51: | Line 51: | ||
==== Implementare ==== | ==== Implementare ==== | ||
- | Prima etapă constă în inițializarea pinilor folosiți de fiecare componentă: butoane, buzzer, senzor de proximitate, modulul gps și modulul gsm, plus crearea unor variabile pentru fluxul programului. | + | Configurare inițială constă în inițializarea pinilor pentru senzorul ultrasonic, buzzer și butoane, precum și pinii pentru gps si gsm Arduino pentru a semnaliza starea de funcționare. Pentru cele două butoane au fost setate întreruperi pentru a putea porni și opri programul și pentru a activa/dezactiva modul de alarmă. |
- | <code cpp> | + | În bucla principală a programului, dacă butonul de start a fost apăsat, LED-ul integrat se aprinde și funcția principală project() este apelată pentru a gestiona măsurătorile și alertele.Dacă programul nu este pornit, LED-ul integrat rămâne stins și se așteaptă apăsarea unui buton pentru a începe. Astfel, device-ul este în stand-by până când butonul de start este apăsat. |
- | const int trigPin = 8; | + | <code> |
- | const int echoPin = 9; | + | void loop() |
+ | { | ||
+ | if (start_program) { | ||
+ | digitalWrite(LED_BUILTIN, HIGH); | ||
+ | project(); | ||
+ | } else { | ||
+ | Serial.println("Press to start"); | ||
+ | if (button_pressed == false) { | ||
+ | noTone(buzzer); | ||
+ | } | ||
- | const int buzzer = 10; | + | // set led off |
+ | digitalWrite(LED_BUILTIN, LOW); | ||
+ | delay(300); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
- | const int button = 2; | + | === Funcția project() === |
- | const int button_start = 3; | + | |
- | // gps | + | În funcția prject() este implementată funcționalitatea device-ului. |
- | const int Rx_pin = 6; | + | |
- | const int Tx_pin = 7; | + | |
- | SoftwareSerial SerialGPS(Rx_pin, Tx_pin); | + | |
- | TinyGPSPlus gps; | + | |
- | volatile double longitude = 0; | + | <code> |
- | volatile double latitude = 0; | + | void project() { |
+ | digitalWrite(trigPin, LOW); | ||
+ | delayMicroseconds(10); | ||
+ | digitalWrite(trigPin, HIGH); | ||
+ | delayMicroseconds(10); | ||
+ | digitalWrite(trigPin, LOW); | ||
- | // gsm | + | duration = pulseIn(echoPin, HIGH); |
- | const int Rx_pin_gsm = 4; | + | long r = 3.4 * duration / 2; |
- | const int Tx_pin_gsm = 5; | + | float distance = r / 100.00; |
- | SoftwareSerial sgsm(Rx_pin_gsm, Tx_pin_gsm); | + | |
- | // variables | + | // Prints the distance on the Serial Monitor |
- | const int time_delay = 10; | + | Serial.print("Distance: "); |
- | long duration, r; | + | Serial.println(distance); |
- | float distance; | + | delay(300); |
- | volatile bool start_program = false; | + | |
- | volatile bool button_pressed = false; | + | if (distance < 10 && distance > 0) { |
+ | noTone(buzzer); | ||
+ | |||
+ | Serial.println("0 < distance < 5"); | ||
+ | } else if (distance >= 10) { | ||
+ | Serial.println("distance >= 10"); | ||
+ | |||
+ | if (button_pressed == true) | ||
+ | tone(buzzer, 10); | ||
+ | else | ||
+ | noTone(buzzer); | ||
+ | |||
+ | // send message | ||
+ | send_sms("Don't forget me!"); | ||
+ | } else { | ||
+ | noTone(buzzer); | ||
+ | } | ||
+ | |||
+ | // listen for messages | ||
+ | sgsm.listen(); | ||
+ | if (sgsm.available() > 0) { | ||
+ | String c = sgsm.readString(); | ||
+ | c.trim(); | ||
+ | |||
+ | // send sms with location on request | ||
+ | if (c.indexOf("GET-GPS") >= 0) { | ||
+ | send_location(); | ||
+ | } | ||
+ | delay(100); | ||
+ | } | ||
+ | } | ||
</code> | </code> | ||
- | Variabile ''duration'' și ''distance'' sunt folosite pentru a măsura distanța de catre senzor, iar cele două variabile boolene sunt folosite pentru a opri/porni programul din buton. Un buton va porni și va opri programul, iar al doilea, *buton_pressed* va activa/dezactvia modul alarmă, unde buzzer-ul va scoate un sunet atunci când nu mai detectează nicio persoană în apropiere. | + | Senzorul ultrasonic HC-SR04 trimite un puls și măsoară timpul de revenire pentru a calcula distanța față de obiectul monitorizat, după care distanța măsurată este afișată pe monitorul serial. Dacă distanța este mai mică de 10 cm, buzzerul este oprit pentru a semnaliza că obiectul este aproape. Dacă în schimb distanța este mai mare sau egală cu 10 cm și modul alarmă este activat, buzzerul este pornit pentru a alerta utilizatorul că se îndepărtează de obiect. De asemenea, se trimite o notificare sms că obiectul a fost uitat. Dacă modul alarmă nu este activat, buzzer-ul rămâne silențios și se trimite doar notificarea. |
+ | |||
+ | Programul de asemenea verifică regulat dacă primește o cerere SMS cu textul "GET-GPS", și trimite locația curentă prin SMS folosind coordonatele GPS obținute. Locație este transmisă sub forma unui url google maps folosind latitudinea și longitudinea de la gps. | ||
+ | |||
+ | Programul de asemenea citește de la gps locația transmisă, doar la nevoie, pentru trimite locația gps exactă a obiectului, pentru a eficientiza consumul bateriei. | ||
+ | |||
+ | <code> | ||
+ | void get_location() { | ||
+ | // Get location via gps // | ||
+ | if(SerialGPS.available() > 0) { | ||
+ | Serial.println("GPS AVAILABLE"); | ||
+ | |||
+ | if (gps.encode(SerialGPS.read())) { | ||
+ | latitude = gps.location.lat(); | ||
+ | longitude = gps.location.lng(); | ||
+ | |||
+ | Serial.print(F("- latitude: ")); | ||
+ | Serial.println(latitude); | ||
+ | |||
+ | Serial.print(F("- longitude: ")); | ||
+ | Serial.println(longitude); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | void send_location() { | ||
+ | // update location information first | ||
+ | get_location(); | ||
+ | |||
+ | //Send google maps location via text. | ||
+ | String googleMapsUrl = "https://www.google.com/maps/?q="; | ||
+ | googleMapsUrl += String(latitude, 6); | ||
+ | googleMapsUrl += ","; | ||
+ | googleMapsUrl += String(longitude, 6); | ||
+ | |||
+ | send_sms(googleMapsUrl); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | void send_sms(String text) { | ||
+ | sgsm.print("\r"); | ||
+ | delay(1000); | ||
+ | sgsm.print("AT+CMGF=1\r"); | ||
+ | delay(1000); | ||
+ | /*Replace XXXXXXXXXX to 10 digit mobile number & | ||
+ | ZZ to 2 digit country code*/ | ||
+ | sgsm.print("AT+CMGS=\"+ZZXXXXXXXXXX\"\r"); | ||
+ | delay(1000); | ||
+ | //The text of the message to be sent. | ||
+ | sgsm.print(text); | ||
+ | delay(1000); | ||
+ | sgsm.write(0x1A); | ||
+ | delay(1000); | ||
+ | } | ||
+ | </code> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | În urma testelor, rezultatele obținute sunt foarte bune pe partea de măsurare a distanței și alerta atunci când nu mai este detectat un obiect în apropiere. Modul alarmă funcționează conform așteptărilor, în schimb, gps-ul are probleme în preluarea locației de la sateliți în funcție de locul în care este și nu am putut obține decât informații cu privire la data și oră prin modulul gps. |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Deși pare ușor la prima vedere, totuși acest m-a învățat că electronica nu funcționează mereu așa cum mă aștept, conform specificațiilor, și erorile din diverse cauze își fac apariția la tot pasul. Am învățat să fac debug folosind print-uri pe serială și led-uri, și am mai învățat și că un cod funcțional și corect poate buși memoria unui microcontroler din motive nebănuite, fix când te aștepți mai puțin. | ||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | {{:pm:prj2024:sseverin:forget_me_not.zip|}} |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | ||
- | </note> | ||
- | ===== Jurnal ===== | ||
- | |||
- | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
- | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | * [[https://lastminuteengineers.com/sim800l-gsm-module-arduino-tutorial/|GSM Module Arduino Tutorial]] |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * [[https://randomnerdtutorials.com/guide-to-neo-6m-gps-module-with-arduino/|Guide to NEO6M GPS Module with Arduino]] |
- | </note> | + | * [[https://https://projecthub.arduino.cc/Isaac100/getting-started-with-the-hc-sr04-ultrasonic-sensor-7cabe1|Getting started with HC-SR04 ultrasonic sensor]] |
- | + | * [[https://https://www.bing.com/search?q=how+to+connect+buzzer+to+arduino&cvid=1c4c009867bf4e19a23c8417a664ee98&gs_lcrp=EgZjaHJvbWUqBggAEAAYQDIGCAAQABhAMgYIARBFGDkyBggCEAAYQDIGCAMQABhAMgYIBBAAGEAyBggFEAAYQDIGCAYQABhAMgYIBxAAGEAyBggIEAAYQNIBCDM1MjhqMGo0qAIAsAIA&FORM=ANAB01&DAF0=1&PC=EDGEDB/|How to use a buzzer with Arduino]] | |
- | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | * [[https://mechatrofice.com/arduino/send-gps-location-via-sms|Send GPS locatino via SMS]] |
+ | * [[https://lastminuteengineers.com/sim800l-gsm-module-arduino-tutorial/|SIM800L GPS module Arudino tutorial]] | ||
+ | * [[https://arduinogetstarted.com/tutorials/arduino-gps|Arduino GPS tutorial]] | ||
+ | * [[https://howtomechatronics.com/tutorials/arduino/ultrasonic-sensor-hc-sr04/|Ultrasonic Sensor HC-SR04]] | ||
+ | * [[https://www.instructables.com/External-Interrupt-in-arduino/|External Interrupt in Arduino]] | ||