Forget Me Not Device

Introducere

Forget Me Not Device este un dispozitiv inovator conceput pentru a ajuta utilizatorii să își gestioneze și să își monitorizeze obiectele personale în mod eficient. Într-o lume în care timpul este prețios și agitația zilnică poate duce la uitarea obiectelor esențiale, precum umbrela, bagajul sau chiar bicicleta, acest dispozitiv devine un aliat de nădejde. Cu ajutorul tehnologiei avansate de localizare și monitorizare, Forget Me Not Device oferă utilizatorilor siguranța de a ști că obiectele lor valoroase sunt întotdeauna în siguranță și la îndemână.

Atunci când utilizatorul se îndepărtează prea mult de obiect, dispozitivul activează o alarmă prin intermediul unui buzzer integrat, atrăgând atenția asupra faptului că se îndepărtează de obiectul lor. În plus față de alarmă, dispozitivul este echipat și cu un receptor GPS și un modul GSM, care îi permite să își transmită constant locația utilizatorului. În cazul în care obiectul este uitat sau pierdut, utilizatorul poate să primească prin SMS locația GPS a dispozitivului, facilitând recuperarea acestuia într-un mod eficient și convenabil.

Descriere generală

Ideea proiectului este de a utiliza un senzor ultrasonic, precum HC-SR04, conectat la o plăcuță Arduino pentru a măsura constant distanța între dispozitiv și un anumit obiect. Acest senzor detectează modificările în distanță și declanșează un semnal către un buzzer integrat atunci când utilizatorul se îndepărtează prea mult de obiect. În plus față de funcția de alarmare, dispozitivul este echipat cu un modul GSM și GPS, permițându-i utilizatorului să solicite informații despre locația obiectului și să primească un SMS cu coordonatele GPS atunci când acesta este pierdut sau uitat.

Hardware Design

Piese:

  • Arduino UNO
  • 1 x HC-SR04 Ultrasonic Sensor
  • 1 x Breadboard
  • 2 x Button
  • 1 x Buzzer
  • 1 x Modul GSM
  • 1 x Modul GPS, GY-NEO6MV2
  • 1 x 1200mAh Lithium Polymer Battery
  • 3 x Resistor 10k
  • 1 x Resistor 100k
  • 1 x 9V Battery

Design circuit:


Implementarea modulului gsm a necesitat un divizor de tensiune pentru a conecta Rx-ul modulului gsm cu Tx-ul plăcuței arduino, deoarece modulul gsm comunică la 3V3, iar Arduino la 5V. Pentru aceasta am folosit o rezistență 10K între pin-ul SIM800L Rx și pin-ul Tx de la Arduino și două rezistențe 10K în serie (ce simulează o rezistență 20K) între SIM800L Rx și GND. Am inclus și o baterie 1200mAh Li-Po pentru alimentarea modulului. Design-ul acestui circuit arată în felul următor:


Circuit fizic:

ana_maria.mirza_circuit_fizic.jpg

Software Design

  • Mediu de dezvoltare: Arduino IDE, versiunea 2.3.3
  • Librării folosite:
    • TinyGPS++.h - utilizat pentru comunicarea cu gps-ul
    • SoftwareSerial.h - utilizat pentru comunicație pe serială

Implementare

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ă.

Î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.

void loop()
{
  if (start_program) {
    digitalWrite(LED_BUILTIN, HIGH);
    project();
  } else {
    Serial.println("Press to start");
    if (button_pressed == false) {
      noTone(buzzer);
    }

    // set led off
    digitalWrite(LED_BUILTIN, LOW);
    delay(300);
  }
}

Funcția project()

În funcția prject() este implementată funcționalitatea device-ului.

void project() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(10);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  long r = 3.4 * duration / 2;     
  float distance = r / 100.00;

  // Prints the distance on the Serial Monitor
  Serial.print("Distance: ");
  Serial.println(distance);
  delay(300);
 
  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);
  }
}

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.

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);
    }
  }
}
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);
}
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);
}

Rezultate Obţinute

Î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.

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

Bibliografie/Resurse

pm/prj2024/sseverin/ana_maria.mirza.txt · Last modified: 2024/05/27 15:52 by ana_maria.mirza
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0