### 4.3.5 Allarme per il rilevamento dei terremoti
#### 4.3.5.1 Panoramica

Un allarme per il rilevamento dei terremoti è un dispositivo che attiva un allarme acustico e visivo rilevando onde sismiche o vibrazioni meccaniche. Viene utilizzato principalmente per la segnalazione precoce dei rischi sismici.
In questo progetto, il display OLED mostrerà in tempo reale i valori rilevati dall'accelerometro di micro:bit. Quando viene rilevata un'inclinazione o una lieve scossa, l'altoparlante suonerà e la matrice LED 5×5 mostrerà un pattern di allarme per avvertire e richiamare l'attenzione.
Questi dispositivi (riferendosi specificamente ai terminali riceventi di allerta precoce per i terremoti) sono ampiamente utilizzati nelle scuole, nelle famiglie, nei luoghi pubblici e nelle aree di monitoraggio dei disastri geologici. Il loro valore centrale risiede nel «correre contro il tempo».

#### 4.3.5.2 Conoscenze sui componenti

**Accelerometro del micro:bit**

L'SLM303AGR è un accelerometro ad alte prestazioni e ultra-basso consumo integrato nella scheda micro:bit, ed è utilizzato principalmente per il rilevamento del movimento tridimensionale (asse X, Y, Z). Integra un accelerometro lineare digitale e un magnetometro per ottenere una misurazione precisa dell'assetto. Le caratteristiche principali di questo sensore includono:
Interfaccia di comunicazione: supporta l'interfaccia bus seriale I2C (compatibile con standard, fast mode, fast mode plus e high-speed mode, con velocità massime fino a 100kHz, 400kHz, 1MHz e 3.4MHz) e l'interfaccia seriale standard SPI, facilitando la connessione con microcontrollori o altre periferiche.
Risoluzione: può essere configurato con uscite a 8 bit, 10 bit o 12 bit, a seconda della modalità di funzionamento (ad esempio: 8 bit in modalità a basso consumo e 12 bit in modalità ad alta risoluzione).
Impostazione dell'intervallo: l'intervallo di accelerazione può essere programmato in ±2g, ±4g, ±8g o ±16g, soddisfacendo i requisiti di sensibilità di diversi scenari applicativi.
Le direzioni X, Y e Z corrispondenti all'accelerometro sono mostrate di seguito:


#### 4.3.5.3 Componenti richiesti
| || |
| :--: | :--: | :--: |
| scheda principale micro:bit V2 ×1 | shield per micro:bit ×1 | display OLED ×1 |
| |||
| cavo micro USB ×1 | cavo a 4 pin ×1 | portabatterie ×1 |
|| | |
|Batterie AA (**autopreparate**) ×6| | |
#### 4.3.5.4 Schema di collegamento
⚠️ **Quando si eseguono i collegamenti, fare attenzione al colore dei fili.**
| Display OLED | colore filo | pin shield micro:bit | pin scheda micro:bit |
| :----------: | :--------: | :------------------: | :-----------------: |
| GND | nero | G | G |
| VCC | rosso | V2 | V |
| SDA | blu | 20 | P20 |
| SCL | verde | 19 | P19 |

#### 4.3.5.5 Flusso del codice

#### 4.3.5.6 Codice di test
⚠️ **Suggerimento 1: Prima di scaricare il codice sulla scheda micro:bit, importare il file di libreria “oled_ssd1306\.py” facendo riferimento a** “[Importare la libreria su MU](https://docs.keyestudio.com/projects/KS4050/en/latest/docs/MicroPython/MU_development_environment.html#import-library-on-mu)” .

⚠️ **Suggerimento 2: le soglie 900 e 1200 nella condizione if() possono essere modificate in base alla situazione effettiva.**
**Codice completo:**
```Python
'''
Theme: Earthquake detection alarm
Function: OLED displays information related to earthquake intensity and the microbit accelerometer controls a 5×5 dot matrix and speaker.
Compiling IDE: MU 1.2.0
Author: https://docs.keyestudio.com
'''
# importa le librerie correlate
from microbit import *
from oled_ssd1306 import *
import music
# inizializza e pulisci l'OLED
initialize() # initialize oled
clear_oled() # clear oled
def get_acceleration_strength():
"""
Read the combined acceleration intensity of the accelerometer
Return the magnitude of the total acceleration rate (unit: mg, milli-g)
"""
# Legge i valori di accelerazione sui tre assi
x = accelerometer.get_x()
y = accelerometer.get_y()
z = accelerometer.get_z()
# Calcola l'accelerazione risultante (modulo del vettore)
strength = (x**2 + y**2 + z**2) ** 0.5
return strength
while True:
strenght = get_acceleration_strength() # Legge l'intensità rilevata dall'accelerometro sulla scheda micro:bit
if strenght < 900 or strenght > 1200: # Quando l'intensità rilevata dall'accelerometro è inferiore a 900 o superiore a 1200
clear_oled() # pulisce l'OLED
add_text(0, 0, 'Earthquake Warning') # Visualizza la stringa nella posizione corrispondente dell'OLED
add_text(0, 2, 'Earthquake Level: ') # Visualizza la stringa nella posizione corrispondente dell'OLED
add_text(0, 4, str(int(strenght))) # Visualizza il valore di strength nella posizione corrispondente dell'OLED
music.play("C4:1") # l'altoparlante suona la nota C4
display.show(Image.GHOST) # la matrice LED mostra un pattern a forma di fantasma
else: # altrimenti
clear_oled() # pulisce l'OLED
display.clear() # Imposta la luminosità di tutti i LED a 0 (spento)
music.reset() # nessun suono
sleep(500)
```

**Breve spiegazione:**
① Importare le librerie microbit, oled_ssd1306 e music.
```Python
# importa le librerie microbit, oled_ssd1306 e music.
from microbit import *
from oled_ssd1306 import *
import music
```
② Inizializzare i pixel dell'OLED, cancellare l'OLED.
```Python
# inizializza l'OLED
initialize() # initialize oled
# pulisce l'OLED
clear_oled() # clear oled
```
③ Definire la sottofunzione per il valore di accelerazione rilevato dall'accelerometro del micro:bit.
```Python
def get_acceleration_strength():
"""
Read the combined acceleration intensity of the accelerometer
Return the magnitude of the total acceleration rate (unit: mg, milli-g)
"""
# Legge i valori di accelerazione sui tre assi
x = accelerometer.get_x()
y = accelerometer.get_y()
z = accelerometer.get_z()
# Calcola l'accelerazione risultante (modulo del vettore)
strength = (x**2 + y**2 + z**2) ** 0.5
return strength
```
④ Assegnare il valore di accelerazione letto alla variabile strength.
```Python
strenght = get_acceleration_strength() # Legge l'intensità rilevata dall'accelerometro sulla scheda micro:bit
```
⑤ Istruzione di controllo: if()...else...
Quando il valore di accelerazione rilevato è inferiore a 900 o superiore a 1200, l'OLED visualizza la stringa e il valore di accelerazione, la matrice LED 5×5 mostra  e l'altoparlante suona. Altrimenti, l'OLED e la matrice LED 5×5 non mostrano nulla e l'altoparlante non emette suono.
```Python
if strenght < 900 or strenght > 1200: # Quando l'intensità rilevata dall'accelerometro è inferiore a 900 o superiore a 1200
clear_oled() # pulisce l'OLED
add_text(0, 0, 'Earthquake Warning') # Visualizza la stringa nella posizione corrispondente dell'OLED
add_text(0, 2, 'Earthquake Level: ') # Visualizza la stringa nella posizione corrispondente dell'OLED
add_text(0, 4, str(int(strenght))) # Visualizza il valore di strength nella posizione corrispondente dell'OLED
music.play("C4:1") # l'altoparlante suona la nota C4
display.show(Image.GHOST) # la matrice LED mostra un pattern a forma di fantasma
else: # altrimenti
clear_oled() # pulisce l'OLED
display.clear() # Imposta la luminosità di tutti i LED a 0 (spento)
music.reset() # nessun suono
```
#### 4.3.5.7 Risultato del test

Dopo aver eseguito i collegamenti e aver alimentato tramite il cavo micro USB, collegare l'alimentazione esterna (6 batterie AA) per garantire una fornitura di energia sufficiente, e cliccare “Flash” per scaricare il codice sulla scheda micro:bit.

Dopo aver caricato il codice di test, premere il pulsante di reset sul retro della scheda micro:bit.

Inclina o scuoti leggermente la scheda micro:bit. Quando il valore di accelerazione rilevato è inferiore a 900 o superiore a 1200, l'OLED visualizza la stringa e il valore, la matrice LED 5×5 mostra  e l'altoparlante suona. Altrimenti, l'OLED e la matrice LED 5×5 non mostrano nulla e l'altoparlante non emette suono.

⚠️ **Nota: i building blocks nell'esperimento non sono inclusi in questo kit.**
(**Suggerimento:** Se non si osserva alcun risultato, premere il pulsante di reset della scheda micro:bit.)
