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 ===== | ||