This shows you the differences between two versions of the page.
|
pm:prj2023:avaduva:earthquake_sensor [2023/05/06 21:15] rares.manole |
pm:prj2023:avaduva:earthquake_sensor [2023/05/29 21:11] (current) rares.manole |
||
|---|---|---|---|
| Line 6: | Line 6: | ||
| Dispozitivul este facut in asa fel incat sa detecteze miscarile seismice. Cand acestea sunt resimtite, el porneste alarma audio-vizuala din dotare. Aceasta se opreste dupa 10 secunde de la ultima unda. Ulterior, este afisata magnitudinea seismului resimtit. | Dispozitivul este facut in asa fel incat sa detecteze miscarile seismice. Cand acestea sunt resimtite, el porneste alarma audio-vizuala din dotare. Aceasta se opreste dupa 10 secunde de la ultima unda. Ulterior, este afisata magnitudinea seismului resimtit. | ||
| - | Acest dispozitiv este util intrucat ne permite sa intelegem mai bine seismele printr-un mod atractiv, putand sa le simulam acest fenomen cand dorim. | + | Acest dispozitiv este util intrucat ne permite sa intelegem mai bine seismele printr-un mod atractiv, putand sa simulam acest fenomen cand dorim. |
| </note> | </note> | ||
| Line 26: | Line 26: | ||
| \\ *Buzzer | \\ *Buzzer | ||
| \\ *LCD Screen | \\ *LCD Screen | ||
| + | \\ *Breadboard | ||
| </note> | </note> | ||
| + | {{:pm:prj2023:avaduva:pozacirc.jpeg?500|}} | ||
| + | {{:pm:prj2023:avaduva:schemacirc.jpeg?675|}} | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | <note> | ||
| + | |||
| + | Din libraria pentru accelerometru, am folosit un exemplu prestabilit care afisa valorile x,y,z a senzorului. Pe baza acestuia s-a bazat codul, facand modificarile aferente cerintei. | ||
| - | <note tip> | ||
| - | Descrierea codului aplicaţiei (firmware): | ||
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | ||
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | ||
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | ||
| - | * (etapa 3) surse şi funcţii implementate | ||
| </note> | </note> | ||
| + | |||
| + | <code> | ||
| + | //librariile folosite | ||
| + | |||
| + | #include "Wire.h" | ||
| + | #include "MPU6050.h" | ||
| + | #include <LiquidCrystal_I2C.h> | ||
| + | |||
| + | |||
| + | |||
| + | LiquidCrystal_I2C lcd(0x27,20,4); | ||
| + | |||
| + | MPU6050 mpu; | ||
| + | int16_t ax, ay, az; | ||
| + | int16_t gx, gy, gz; | ||
| + | |||
| + | struct MyData { | ||
| + | byte X; | ||
| + | byte Y; | ||
| + | byte Z; | ||
| + | }; | ||
| + | |||
| + | //valorile de referinta folosite pentru determinarea magnitudinii | ||
| + | |||
| + | float iX=0; | ||
| + | float iY=0; | ||
| + | float iZ=0; | ||
| + | |||
| + | //pragul magnitudinii de unde incepe alarma | ||
| + | |||
| + | float noiseTreshold=2.5; | ||
| + | |||
| + | bool alarmActive=false; | ||
| + | |||
| + | const int ledPin=13; | ||
| + | const int buzzerPin=12; | ||
| + | |||
| + | MyData data; | ||
| + | |||
| + | float magnitude = 0.0; | ||
| + | float prev_magnitude = 0.0; | ||
| + | |||
| + | unsigned long lastMagnitude = 0; | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | Serial.begin(9600); | ||
| + | Wire.begin(); | ||
| + | mpu.initialize(); | ||
| + | |||
| + | pinMode(ledPin,OUTPUT); | ||
| + | pinMode(buzzerPin,OUTPUT); | ||
| + | |||
| + | lcd.begin(16,2); | ||
| + | lcd.backlight(); | ||
| + | lcd.setCursor(0, 0); | ||
| + | lcd.print("Waiting..."); | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); | ||
| + | |||
| + | // se calculeaza magnitudinea in baza datelor precedente | ||
| + | float acc_x = ax - iX; | ||
| + | float acc_y = ay - iY; | ||
| + | float acc_z = az - iZ; | ||
| + | |||
| + | float acc_total = sqrt(acc_x * acc_x + acc_y * acc_y + acc_z * acc_z); | ||
| + | |||
| + | //avand in vedere "acuratetea" accelerometrului folosit, am calibrat formula | ||
| + | |||
| + | magnitude = log10(acc_total) *4.25 -8 ; | ||
| + | |||
| + | // updatarea datelor ce vor deveni de referinta pentru calculele viitoare | ||
| + | prev_magnitude = magnitude; | ||
| + | iX=ax; | ||
| + | iY=ay; | ||
| + | iZ=az; | ||
| + | |||
| + | data.X = map(ax, -17000, 17000, 0, 255); // axa x | ||
| + | data.Y = map(ay, -17000, 17000, 0, 255); // axa Y | ||
| + | data.Z = map(az, -17000, 17000, 0, 255); // axa Z | ||
| + | |||
| + | lcd.setCursor(0, 1); | ||
| + | |||
| + | //activarea alarmei in urma depasirii treshold-ului | ||
| + | |||
| + | if(magnitude>noiseTreshold){ | ||
| + | digitalWrite(ledPin, HIGH); | ||
| + | tone(buzzerPin, 1000); | ||
| + | |||
| + | lcd.print("Earthquake! "); | ||
| + | lcd.setCursor(0, 2); | ||
| + | lcd.print(""); | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | lastMagnitude=millis(); | ||
| + | |||
| + | alarmActive=true; | ||
| + | }else{ | ||
| + | |||
| + | // oprirea ei | ||
| + | digitalWrite(ledPin,LOW); | ||
| + | noTone(buzzerPin); | ||
| + | lcd.print("Nothing detected"); | ||
| + | |||
| + | if (alarmActive && (millis() - lastMagnitude >= 10000)) { | ||
| + | // Reset the alarm state | ||
| + | alarmActive = false; | ||
| + | | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | delay(500); | ||
| + | |||
| + | //printarea in serial monitor valorile axelor X-Y-Z si magnitudinea resimtita | ||
| + | |||
| + | Serial.print("Axis X = "); | ||
| + | Serial.print(data.X); | ||
| + | Serial.print(" "); | ||
| + | Serial.print("Axis Y = "); | ||
| + | Serial.print(data.Y); | ||
| + | Serial.print(" "); | ||
| + | Serial.print("Axis Z = "); | ||
| + | Serial.print(data.Z); | ||
| + | Serial.print(" "); | ||
| + | Serial.print("Magnitude = "); | ||
| + | Serial.println(magnitude, 2); | ||
| + | } | ||
| + | |||
| + | </code> | ||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| <note tip> | <note tip> | ||
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | ||
| </note> | </note> | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | <note tip> | ||
| + | M-am familiarizat mai mult cu partea de hardware si sa trec peste anumite dificultati din acest punct de vedere. De asemenea, a fost folositor sa imbin programarea cu partea de matematica/fizica, fiind necesar sa ma interesez cum se calculeaza magnitudinea unui seism in scara Richter (de asemenea sa imi dau seama de amplaorea unui cutremur: de exemplu, un cutremur cu magnitudiea 7 e de 10 ori mai putenric decat unul cu magnitudinea 6 sau de 100 de ori decat unul cu magnitudinea 5, ca intensitate). Din pacate nu am putut sa fac proiectul cum mi-am dorit initial, intrucat accelerometrul are destul de mult "noise" si nu are o acuratete asa buna. Totusi, sunt multumit de rezultatul final. | ||
| + | </note> | ||
| ===== Download ===== | ===== Download ===== | ||