In questo articolo vediamo come realizzare un semplice giroscopio su Home Assistant con ESPHome, dove si può utilizzare? Un’ esempio potrebbe essere monitorare se ci sono scosse telluriche. Vediamo cosa occorre per questo semplice progetto.
Dopo esserci procurato tutto il materiale, vediamo come sono collegamento tra la schedina Mini D1 o NodeMCU e in sensore MPU-6050.
Per primo facciamo i collegamenti tra il MiniD1 e il sensore MPU-6050 come da schema.
Dopo aver fatto tutti i collegamenti passiamo al codice. Apriamo il nostro Home Assistant, e creiamo un nuovo progetto con ESPHome, Mi raccomando far funzionare il progetto, scegliamo la schedina che abbiamo preso, altrimenti si rischia che non funzioni. Il codice in questione ve lo lascio qui sotto come esempio, sta voi a fare ulteriori modifiche personalizzarlo a vostro piacimento.
i2c:
sda: D1
scl: D2
scan: true
id: bus_a
sensor:
- platform: mpu6050
address: 0x68
accel_x:
id: accel_x
name: "accel X"
filters:
- sliding_window_moving_average:
window_size: 5
send_every: 1
- delta: 0.5
accel_y:
id: accel_y
name: "accel Y"
filters:
- sliding_window_moving_average:
window_size: 4
send_every: 1
- delta: 0.5
accel_z:
id: accel_z
name: "accel z"
filters:
- sliding_window_moving_average:
window_size: 4
send_every: 1
- delta: 0.5
gyro_x:
name: "gyro X"
filters:
- sliding_window_moving_average:
window_size: 4
send_every: 1
- delta: 0.5
gyro_y:
name: "gyro Y"
filters:
- sliding_window_moving_average:
window_size: 4
send_every: 1
- delta: 0.5
gyro_z:
name: "gyro z"
filters:
- sliding_window_moving_average:
window_size: 4
send_every: 1
- delta: 0.5
temperature:
name: "MPU6050 Temperature"
update_interval: 1.5s
- platform: template
id: roll
name: pan1roll
accuracy_decimals: 2
lambda: |-
return (atan( id(accel_y).state / sqrt( pow( id(accel_x).state , 2) + pow( id(accel_z).state , 2) ) ) * 180 / PI) ;
update_interval: 250ms
- platform: template
id: pitch
name: pan1pitch
accuracy_decimals: 2
lambda: |-
return (atan(-1 * id(accel_x).state / sqrt(pow(id(accel_y).state, 2) + pow(id(accel_z).state, 2))) * 180 / PI);
update_interval: 250ms
Una volta che abbiamo caricato il programma dovreste avere questo, vi ricordo che potete personalizzarlo a vostro piacere.
Qui sotto vi lascio i link dove recuperare tutto il necessario, cliccando sul link mi aiutate a sostenere i costi, a voi non cambia nulla . a me mi date un piccoli sostegno
Ora continuiamo con questo piccolo progettino sempre de giroscopio solo che questa volta, metteremo un piccolo dispaly lcd (128×32) per vedere sul display dove si trova posizionato il nostro giroscopio. (AVANTI,INDIETRO, FERMO,DESTRA,SINISTRA) Comunque è personalizzabile a nostro piacimento. qui sotto il codice di esempio.
captive_portal:
i2c:
sda: D2
scl: D1
scan: true
# Configurazione del sensore MPU-6050
sensor:
- platform: mpu6050
address: 0x68
accel_x:
name: "Accelerazione X"
id: accel_x
on_value:
then:
- lambda: |-
id(update_direction).execute();
accel_y:
name: "Accelerazione Y"
id: accel_y
on_value:
then:
- lambda: |-
id(update_direction).execute();
accel_z:
name: "Accelerazione Z"
id: accel_z
update_interval: 0.1s
# Funzione lambda per aggiornare la direzione
globals:
- id: last_direction
type: std::string
initial_value: '"Unknown"'
script:
- id: update_direction
mode: queued
then:
- lambda: |-
std::string current_direction = "Unknown";
float x = id(accel_x).state;
float y = id(accel_y).state;
if (x > 1.0) {
current_direction = "Destra";
} else if (x < -1.0) {
current_direction = "Sinistra";
} else if (y > 1.0) {
current_direction = "Avanti";
} else if (y < -1.0) {
current_direction = "Indietro";
} else {
current_direction = "Fermo";
}
if (current_direction != id(last_direction)) {
id(oled_display).print(0, 0, id(font_small), current_direction.c_str());
id(last_direction) = current_direction;
}
# Configurazione Display OLED SSD1306
display:
- platform: ssd1306_i2c
model: "SSD1306 128x64"
reset_pin: 0
address: 0x3c
update_interval: 3s
id: oled_display
lambda: |-
it.printf(0, 20, id(font_small), TextAlign::BASELINE_LEFT, "Direzione:");
it.printf(0, 60, id(font_large), TextAlign::BASELINE_LEFT, "%s", id(last_direction).c_str());
# Font per l'OLED
font:
- file: "font/arial.ttf"
id: font_small
size: 20
- file: "font/arial.ttf"
id: font_large
size: 25