Nume si prenume: Tudor Vlad Razvan
Grupa: 10213
Anul III
Specializarea: Calculatoare
Proiect la disciplina SOC
(Structura si Organizarea
Calculatoarelor)
Detector de Cutremure
(Implementarea unui
Seizmograf)
Materialele necesare:
Placuta Arduino UNO ADXL335 Accelerometru GY-61
LCD 1602 Buzzer
Led-ul poate fi de orice culoare I2C module convertor
Consideratii teoretice:
Un seismograf și un detector de cutremure sunt dispozitive utilizate pentru a
măsura și înregistra mișcările și vibrațiile produse de cutremure în scoarța
terestră. Există unele diferențe subtile între ele si anume:
a)Seizmograf:
- Un seismograf este un instrument care măsoară și înregistrează mișcările și
undele seismice generate de cutremure.
- Seismografele sunt echipamente complexe și sensibile, utilizate în special în
domeniul științific și seismic pentru a detecta și înregistra evenimentele
seismice.
- Aceste dispozitive pot fi poziționate la suprafața pământului sau pot fi instalate
în adâncime pentru a măsura și înregistra cutremurele la diferite adâncimi ale
scoarței terestre.
b)Detectorul de cutremure:
- Termenul "detector de cutremure" poate fi folosit într-un mod mai general și
poate include orice dispozitiv sau sistem care detectează și anunță prezența unui
cutremur.
- Un detector de cutremure poate include seismografe, dar poate fi, de
asemenea, un sistem mai simplu, cum ar fi un senzor seismic care activează o
alarmă sau un sistem de monitorizare la detectarea mișcărilor semnificative ale
solului.
- Detectoarele de cutremure sunt adesea utilizate pentru a oferi avertizări
timpurii în zonele supuse cutremurelor, permițând oamenilor să se pregătească
și să reacționeze în mod corespunzător înainte de sosirea undelor principale ale
cutremurului.
O alta consideratie teoretica este realizarea unei analize mai detaliate a unui
seizmograf/detector de cutremure cum ar fi:
1)Principiul de funcționare:
Seismografele utilizează senzori pentru a detecta mișcările de sol generate de
undele seismice. Aceste senzori pot măsura accelerația, viteză sau deplasarea.
2)Senzori seismici:
Accelerometrele sunt adesea folosite pentru a măsura accelerația și sunt
esențiale pentru detectarea undelor seismice. Acestea convertește accelerația în
semnale electrice.
Geofonii sunt senzori care detectează deplasarea pământului și sunt utilizați
pentru a măsura mișcările orizontale și verticale.
3)Amplificare și filtrare:
Semnalele captate de senzori pot fi amplificate și filtrate pentru a evidenția
componentele relevante ale mișcărilor seismice și pentru a reduce zgomotul de
fond.
4)Înregistrarea datelor:
Datele măsurate de senzori sunt înregistrate în timp real sau stocate pentru
analize ulterioare. Acest proces implică adesea convertirea semnalelor analogice
în date digitale.
5)Localizarea epicentrului:
Prin utilizarea mai multor seismografe poziționate în locuri diferite, cercetătorii
pot determina locul epicentrului unui cutremur prin triangulare.
6)Avertizare timpurie:
Sistemele de detectare a cutremurelor pot utiliza informațiile colectate pentru a
emite avertizări timpurii, permițând oamenilor să se pregătească înainte de a
ajunge undele seismice.
7)Standardizarea și calibrare:
Este importantă standardizarea și calibrarea adecvată a echipamentului pentru
asigurarea preciziei măsurătorilor și pentru comparabilitatea datelor colectate.
8)Rezistența la interferențe:
Echipamentele trebuie să fie proiectate pentru a rezista la interferențe externe
sau la factori care ar putea afecta înregistrările, cum ar fi vibrațiile nedorite sau
schimbările de temperatură.
Specificațiile tehnice ale senzorilor folosiți
Senzorul folosit este accelerometrul GY-61 cu 3 axe ADXL335 de mai sus. Acest
ADXL335 este un accelerometru triaxial care măsoară accelerația pe cele trei axe
spațiale si anume X,Y,Z. ADXL335 oferă date despre mișcarea și accelerația
obiectului pe care este montat și este frecvent utilizat în aplicații care implică
măsurarea și monitorizarea accelerației, cum ar fi în dispozitivele mobile,
roboți, sisteme de navigație,detectoare simple in arduino și altele .
Principalele caracteristici ale ADXL335 includ:
Gamă de măsurare: ±3g (accelerație de până la ±3 ori accelerația
gravitațională standard).
Sensibilitate : 300 mV/g.
Ieșire analogică: Generează semnale analogice proporționale cu
accelerația pe cele trei axe.
Tensiune de alimentare: Funcționează la o tensiune de alimentare
cuprinsă între 1.8V și 3.6V.
Interfață: Ieșire analogică.
Dimensiuni: Compact și ușor de integrat în diferite proiecte.
Înclinare și unghi de înclinare: Potențialul de utilizare pentru
măsurarea unghiurilor de înclinare sau pentru detectarea mișcărilor
bruște.
Cateva poze pe care le voi posta mai jos:
Diagrama piniilor
O sa postez urmatoarele diagrame inclusiv si diagrama unde am LCD-ul si
modulul I2C
In cele 3 diagrame de mai sus avem diagrama pinilor pentru LCD-ul impreuna
cu modulul I2C si avem in felul urmator:
Acest modul I2C are 4 pini:GND,VCC,SDA,SCL
In cazul meu am conectat GND la GND,VCC la 5V,SDA in A4 si SCL in A5 si acum
o sa explic fiecare pin ce face:
SDA (Serial Data Line): Aceasta este linia de date a protocolului I2C.
Informația este transmisă pe această linie.
SCL (Serial Clock Line): Aceasta este linia de ceas a protocolului I2C.
Semnalele sunt sincronizate cu tranzițiile pe această linie.
VCC: Se conecteaza la o sursa de 5V respectiv Vin daca folosim un Arduino
UNO respectiv Nano.
GND: Conectam la masa sistemului unde vedem GND pe placuta Arduino.
Denumirile pinilor la LCD:
pin 1: VSS(Similar cu GND)
pin 2: VDD(Similar cu VCC)
pin 3: V0 - contrast LCD (între VSS și VDD)
pin 4: RS(Register Select)
pin 5: R/W(Read/Write)
pin 6: E - enable
pin 7 - 14: DB0 – DB7 (Data Bus)
pin 15: A-Anod
pin 16: K-Catod
Pentru accelerometrul ADXL335 GY-61 cu 3 axe:
Cei 5 pini pe care o sa-i explic sunt:VCC,X_OUT,Y_OUT,Z_OUT,GND
VCC este asemanator ca in cazul cu LCD-ul ce are in spate lipit modulul I2C si
anume se conecteaza la o sursa de alimentare de 5V si cu GND se procedeaza
la fel conectandu-l la GND.
X_OUT,Y_OUT,Z_OUT sunt ieșiri analogice care reprezintă accelerația pe cele
trei axe si se conecteaza deobicei in ordine crescatoare ca sa functioneze si
anume:in diagrama de mai sus X este conectat in A1, Y in A2, Z in A3
Hardware:
In cele 2 poze avem schema circuitului facuta practic cu arduino
UNO,breadboard,LCD etc.
O sa postez urmatoarele diagrame:
Diagrama completa unde folosim Arduino UNO si breadboard
In cele 6 diagrame de mai sus avem functionarea LCD-ului unde vedem afisarea
textului si apoi cele 3 axe/variabile declarate pe prima coloana si valorile pe a
doua coloana.
Aici putem seta acceleratia,rotatia si temperatura pentru fiecare in
parte(atunci cand folosim site-ul WOKWI pentru a creea diagrama circuitului)
Software:
Vom avea urmatorele surse de cod respectiv graficul si anume:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#define buzzer 12 //pinul pentru buzzer//
#define led 13 //pinul pentru led//
#define x A0 //pinul pentru x_out
#define y A1 //pinul pentru y_out
#define z A2 //pinul pentru z_out
//variabile//
int xsample = 0;
int ysample = 0;
int zsample = 0;
long start;
int buz = 0;
#define samples 25
#define maxVal 15 //limita maxima//
#define minVal –15 //limita minima//
#define buzTime 2000 //limita timp buzzer/
void setup()
{
[Link](16, 2); //initializam lcd-ul//
[Link](9600); //initializam serialul//
delay(1000);
[Link]("Cutremur ");
[Link](0, 1);
[Link]("Detector ");
delay(2000);
[Link]();
[Link]("Calibrare");
[Link](0, 1);
[Link]("Va rog,asteptati...");
pinMode(buzzer, OUTPUT);
pinMode(led, OUTPUT);
buz = 0;
digitalWrite(buzzer, buz);
digitalWrite(led, buz);
for (int i = 0; i < samples; i++) //prelevarea de eșantioane pentru
calibrare//
xsample += analogRead(x);
ysample += analogRead(y);
zsample += analogRead(z);
xsample /= samples;
ysample /= samples;
zsample /= samples;
delay(3000);
[Link]();
[Link]("Calibrat");
delay(1000);
[Link]();
[Link]("Este gata");
delay(1000);
[Link]();
[Link](" X Y Z ");
void loop()
int value1 = analogRead(x); //citim x_out //
int value2 = analogRead(y); //citim y_out //
int value3 = analogRead(z); //citim z_out //
int xValue = xsample - value1; //incearca sa gaseasca schimbari in x//
int yValue = ysample - value2; //incearca sa gaseasca schimbari in y//
int zValue = zsample - value3; //incearca sa gaseasca schimbari in z//
//Afiseaza modificari valorilor axelor x, y și z pe LCD
[Link](0, 1);
[Link](xValue);
[Link](5, 1);
[Link](" "); // spațiu pentru a șterge valorile anterioare
[Link](5, 1);
[Link](yValue);
[Link](10, 1);
[Link](" "); // spațiu pentru a șterge valorile anterioare
[Link](10, 1);
[Link](zValue);
delay(100);
//Comparam modificări cu limite predefinite//
if (xValue < minVal || xValue > maxVal || yValue < minVal || yValue > maxVal
|| zValue < minVal || zValue > maxVal)
if (buz == 0)
start = millis(); //da start la timer//
buz = 1; // fanionul ledului este activat//
else if (buz == 1) //fanionul sonerie este activat, apoi alertarea
cutremurului//
[Link](0, 0);
[Link]("Alerta Cutremur ");
if (millis() >= start + buzTime)
buz = 0;
else
[Link]();
[Link](" X Y Z ");
digitalWrite(buzzer, buz); //comanda pentru aprinderea si oprirea
buzzerului//
digitalWrite(led, buz); //comanda pentru aprinderea si oprirea ledului//
//trimitem valori la procesare pentru reprezentarea grafică//
[Link]("x=");
[Link](xValue);
[Link]("y=");
[Link](yValue);
[Link]("z=");
[Link](zValue);
[Link](" $");
}
Acest cod sursa este facut in programul Arduino IDE
import [Link].*;
PFont f6,f8,f12,f10;
PFont f24;
Serial myPort; // Portul serial
int xPos = 0; // Pozitia orizontala a graficului
float y1=0;
float y2=0;
float y3=0;
void setup ()
{
// Setarile ferestrei si dimensiunea fontului
f6 = createFont("Arial",6,true);
f8 = createFont("Arial",8,true);
f10 = createFont("Arial",10,true);
f12 = createFont("Arial",12,true);
f24 = createFont("Arial",24,true);
size(1200, 700);
// Lista cu toate porturile seriale disponibile
println([Link]());
myPort = new Serial(this, "COM3", 9600); //Setam portul serial
println(myPort);
[Link]('\n');
background(80);
}
void draw ()
{
serial ();
}
void serial()
{
String inString = [Link]('$'); // Citirea datelor de la portul serial
if (inString != null)
{
// extragerea valorilor necesare pentru cele 3 axe:
int l1=[Link]("x=")+2;
String temp1=[Link](l1,l1+3);
l1=[Link]("y=")+2;
String temp2=[Link](l1,l1+3);
l1=[Link]("z=")+2;
String temp3=[Link](l1,l1+3);
//mapeaza valorile x,y si z in dimensiunile graficului
float inByte1 = float(temp1+(char)9);
inByte1 = map(inByte1, -80,80, 0, height-80);
float inByte2 = float(temp2+(char)9);
inByte2 = map(inByte2,-80,80, 0, height-80);
float inByte3 = float(temp3+(char)9);
inByte3 = map(inByte3,-80,80, 0, height-80);
float x=map(xPos,0,1120,40,width-40);
//Deseneaza fereastra si unitatea graficului
strokeWeight(2);
stroke(175);
Line(0,0,0,100);
textFont(f24);
fill(0,00,255);
textAlign(RIGHT);
xmargin("Graf pentru Cutremur (SEIZMOGRAF)",200,100);
fill(100);
strokeWeight(100);
line(1050,80,1200,80);
strokeWeight(1);
textAlign(RIGHT);
fill(0,0,255);
String temp="X:"+temp1;
Text(temp,100,95);
fill(0,255,0);
temp="Y:"+temp2;
Text(temp,100,92);
fill(255,0,0);;
temp="Z:"+temp3;
Text(temp,100,89);
//Deseneaza valorile x,y si z pe grafic
strokeWeight(2);
int shift=40;
stroke(0,0,255);
if(y1 == 0)
y1=height-inByte1-shift;
line(x, y1, x+2, height-inByte1-shift) ;
y1=height-inByte1-shift;
stroke(0,255,0);
if(y2 == 0)
y2=height-inByte2-shift;
line(x, y2, x+2, height-inByte2-shift) ;
y2=height-inByte2-shift;
stroke(255,0,0);
if(y2 == 0)
y3=height-inByte3-shift;
line(x, y3, x+2, height-inByte3-shift) ;
y3=height-inByte3-shift;
xPos+=1;
if (x >= width-30) // Inapoi la inceput
{
xPos = 0;
background(80);
}
}
}
void Line(int x1, int y1, int x2, int y2)
{
float xx1=map(x1,0,100,40,width-40);
float xx2=map(x2,0,100,40,width-40);
float yy1=map(y1,0,100,height-40,40);
float yy2=map(y2,0,100,height-40,40);
line(xx1,yy1,xx2,yy2);
xx2=map(100,0,100,40,width-40);
yy2=map(0,0,100,height-40,40);
line(xx1,yy1,xx2,yy2);
strokeWeight(1);
for(int i=1;i<21;i++)
{
yy2=map(i*10,0,200,height-40,40);
yy1=yy2;
line(xx1,yy1,xx2,yy2);
}
yy2=map(100,0,100,height-40,40);
yy1=map(0,0,100,height-40,40);
for(int i=1;i<41;i++)
{
xx1=map(i*5,0,200,40,width-40);
xx2=map(i*5,0,200,40,width-40);
line(xx1,yy1,xx2,yy2);
}
textAlign(RIGHT); // 100 de grade
// result+=yy1;
fill(255);
strokeWeight(1);
textFont(f12);
for(int i=-10;i<11;i++)
{
String result="";
result+=5*i;
ymargin(result, x1,y1);
y1+=5;
}
x1=0;
y1=0;
strokeWeight(1);
textFont(f10);
for(int i=0;i<41;i++)
{
String result="";
result+=28*3*i;
xmargin(result, x1,y1);
x1+=5;
}
textAlign(RIGHT);
textAlign(RIGHT);
}
void ymargin(String value, int x1, int y1)
{
float xx1=map(x1,0,100,40,width-40);
float yy1=map(y1,0,100,height-40,40);
text(value,xx1-5,yy1+5);
}
void xmargin(String value, int x1, int y1)
{
float xx1=map(x1,0,200,40,width-40);
float yy1=map(y1,0,100,height-25,25);
text(value,xx1+7,yy1);
}
void Text(String value, int x1, int y1)
{
float xx1=map(x1,0,100,40,width-40);
float yy1=map(y1,0,100,height-25,25);
text(value,xx1,yy1);
}
Acest cod sursa de mai sus este facut in programul Processing IDE unde avem
si urmatoarele capturi de ecran pentru graficul realizat:
O descriere detaliata a graficului:
1)Interfata grafica care are o fereastra cu dimensiuni de 1200x700 pixeli si
fonturile pentru text care sunt diferite pentru anumite
dimensiuni(f6,f8,f10,f12,f24).Aceste fonturi sunt obiecte de tip PFont utilizate
pentru a seta dimensiunile textului afisat pe [Link] font are o
dimensiune diferita,iar aceste dimensiuni sunt utilizate pentru a stiliza textul in
functie de importanta sau rolul informatiilor [Link] fiecarui font:
f6:are dimensiunea de minim 6 puncte si este utilizat pentru a afisa texte cu
detalii fine cum ar fi indicatoarele sau etichete.
f8 : Are dimensiunea de 8 puncte si este potrivit pentru afișarea textelor cu o
dimensiune medie, precum indicații sau informații secundare.
f10 :Are dimensiunea de 10 puncte si poate fi utilizat pentru texte ușor mai
mari, cum ar fi indicatoare sau etichete mai vizibile.
f12:Are dimensiunea de 12 puncte si este potrivit pentru a afișa texte mai mari,
precum etichetele principale sau informații importante.
f24:Are dimensiunea maximă de 24 de puncte si este utilizat pentru a afișa texte
mari, cum ar fi titluri sau informații de primă importanță, pentru a atrage atenția
asupra lor.
2)Comunicare serială:
Se utilizează biblioteca [Link] pentru a comunica cu un dispozitiv
extern prin portul serial si este foarte important sa specificam
ce port trebuie sa utilizam (ex:”COM 3”,”COM10”,”COM21”, etc.)
3)Desenarea graficului:
Fiecare cadru este desenat în funcția draw() care apelează funcția serial().
Funcția serial() citește datele de la portul serial, le prelucrează și le utilizează
pentru a desena graficul.
4) Datele de la senzor:
Datele sunt citite sub forma unui șir (String) până la caracterul '$'.
Se extrag valorile pentru axele X, Y și Z din șir.
5)Maparea valorilor pe dimensiunile ecranului:
Valorile pentru axele X, Y și Z sunt mapate în intervalul 0 - înălțimea ferestrei
(minus o marjă de 80 pixeli).
Valorile sunt ajustate pentru a se încadra în intervalul specificat.
6)Desenarea elementelor grafice:
Desenează un cadru pentru grafic și o linie orizontală pentru referință.
Afișează informații despre grafic și valorile curente ale axelor X, Y și Z în
partea de sus a ferestrei.
7)Desenarea liniilor pentru valorile X, Y și Z:
Folosim line() pentru a desena liniile pentru valorile X, Y și Z pe grafic.
Valorile anterioare sunt păstrate pentru a conecta liniile și a crea un aspect
continuu.
8)Animarea graficului:
Graficul se mișcă într-un mod continuu spre dreapta, iar odată ce atinge
marginea dreaptă a ferestrei, se resetează și începe din nou de la început.
9)Indicații textuale:
Afișează indicații textuale pentru a identifica axele X, Y și Z.
Valorile pentru fiecare axă sunt afișate în partea stângă a ferestrei.
10)Unități de măsură și marje:
Sunt desenate unități de măsură pentru a ajuta la înțelegerea valorilor afișate. Se
afișează marjele cu valorile aferente pentru a face mai ușor de citit graficul.
a)Stil Grafic:
Sunt utilizate diferite culori și grosimi de linii pentru a face distincția între axele
X, Y și Z.
b)Animare Continuă:
Graficul este actualizat continuu pentru a reflecta datele primite de la
dispozitivul conectat prin portul serial.
Propuneri pentru dezvoltare:
Utilizarea senzorilor seismici avansați:
Explorează utilizarea senzorilor seismici avansați, precum accelerometrele
MEMS sau dispozitivele inerțiale, pentru a obține măsurători mai precise ale
mișcărilor pământului.
Comunicarea wireless:
Implementează o opțiune pentru transmiterea datelor fără fir către un sistem
central sau un server online. Acest lucru poate implica utilizarea tehnologiilor
precum Wi-Fi sau Bluetooth.
Sisteme de alertare timpurie:
Adaugă un sistem de alertare timpurie pentru a notifica oamenii înainte de a lovi
unda principală a cutremurului. Acest lucru ar putea implica comunicarea cu o
rețea regională de detectare a cutremurelor.
Analiză avansată a datelor:
Dezvoltă algoritmi avansați pentru analiza datelor și identificarea modelelor
specifice care ar putea indica un cutremur iminent. Poți utiliza tehnici de
învățare automată sau analiză spectrală.
Integrare cu dispozitive Smart Home:
Permite integrarea detectorului de cutremure cu dispozitivele smart home, cum
ar fi sistemele de alarmă, pentru a automatiza anumite acțiuni la detectarea unui
cutremur.
Harta interactivă a cutremurelor:
Dezvoltă o aplicație sau un serviciu online care să ofere o hartă interactivă a
cutremurelor și să afișeze locațiile și magnitudinile acestor a.
Monitorizare la Nivel Global:
Extinde sistemul pentru a monitoriza cutremurele la nivel global, poate
colaborând cu organizații sau rețele internaționale de detectare a cutremurelor.
Bibliografie:
1)”Introduction to Seismology" - Peter M. Shearer; O carte comprehensivă
și accesibilă care introduce principiile fundamentale ale seismologiei publicata
in 2019; Editura Cambridge University Press
Introduction to Seismology | Higher Education from Cambridge
2) “An Introduction to Seismology, Earthquakes, and Earth
Structure” - Seth Stein,Michael Wysession; Introducere în
seismologie și rolul său în științele pământului și este scrisă pentru
studenții avansați și începători publicata in 1991;Editura Wiley-Blackwell
An Introduction to Seismology, Earthquakes, and Earth Structure |
Wiley
3) "Introduction to Seismology and Earthquake Engineering" - Atilla
Ansal; O resursă excelentă pentru înțelegerea fenomenelor seismice și
tehnologiilor asociate publicata in 2015; Editura Springer
Geotechnical, Geological and Earthquake Engineering | Book series home
([Link])
Alte resurse online si site-uri pentru seizmografe respectiv detectoare de
cutremure:
EMSC - European-Mediterranean Seismological Centre ([Link])
SAGE ([Link])
Earthquake Hazards Program | U.S. Geological Survey ([Link])
4) Processing IDE link: Welcome to Processing! / [Link]