Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 =====
  
pm/prj2023/avaduva/earthquake_sensor.1683396903.txt.gz · Last modified: 2023/05/06 21:15 by rares.manole
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