Sommario:

SilverLight: monitor ambientale basato su Arduino per sale server: 3 passaggi (con immagini)
SilverLight: monitor ambientale basato su Arduino per sale server: 3 passaggi (con immagini)

Video: SilverLight: monitor ambientale basato su Arduino per sale server: 3 passaggi (con immagini)

Video: SilverLight: monitor ambientale basato su Arduino per sale server: 3 passaggi (con immagini)
Video: A Dark Balance | Critical Role | Campaign 3, Episode 38 2024, Luglio
Anonim
SilverLight: monitor ambientale basato su Arduino per sale server
SilverLight: monitor ambientale basato su Arduino per sale server
SilverLight: monitor ambientale basato su Arduino per sale server
SilverLight: monitor ambientale basato su Arduino per sale server
SilverLight: monitor ambientale basato su Arduino per sale server
SilverLight: monitor ambientale basato su Arduino per sale server
SilverLight: monitor ambientale basato su Arduino per sale server
SilverLight: monitor ambientale basato su Arduino per sale server

Una volta mi è stato affidato il compito di cercare una sonda ambientale per il monitoraggio della temperatura nella sala server della mia azienda. La mia prima idea è stata: perché non utilizzare solo un Raspberry PI e un sensore DHT, può essere configurato in meno di un'ora inclusa l'installazione del sistema operativo. Per questo ho ricevuto la fredda risposta da persone prepotenti con gli occhi bendati che non lo faremo perché costerebbe di più in ore di lavoro per configurarlo rispetto all'acquisto di un dispositivo. Dover accettare persone di mentalità ristretta come questa per una parte della mia vita era una cosa e ho ordinato un po 'di spazzatura EATON di livello aziendale da Ebay e chiamarlo, ma in quel momento ho deciso che per la mia sala server costruirò un Arduino completamente Open Source dispositivo basato che sarà molto meglio di quello che ho appena ordinato.

Questo progetto ha il nome in codice SilverLight, non chiedetemi da dove prendo questi nomi:) Ho appena guardato la scatola semiacrilica lucida e ho deciso con questo nome, non ha nulla a che fare con il prodotto microzoccolo quello che ho scoperto dopo.

Passaggio 1: progettazione dell'hardware

Progettazione hardware
Progettazione hardware
Progettazione hardware
Progettazione hardware
Progettazione hardware
Progettazione hardware

Panoramica dell'hardware commerciale.

Ok, quindi non ho nemmeno iniziato con la cui grande idea era quella di inserire un monitor ambientale all'interno di un ups, ma ovviamente c'è un mercato per questo, quindi vediamo cosa possono fare:

COMPATIBILITÀ dispositivo di monitoraggio ambientale

La rete 10/100Mb-MS, PXGUPS, PXGPDP e PXGMS.

ConnectUPS-X, ConnectUPS-BD e ConnectUPS-E da 10/100 Mb con FW V3.01 e versioni successive. DIMENSIONI (LXPXH)

2,26 x 1,48 x 1,15 (pollici) 57,6 x 37,6 x 29,3 (mm) PESO

1,19 once (34 g)

È un'informazione molto utile, vero? Non preoccuparti perché non possono fare molto. Per iniziare, il tuo UPS avrà bisogno di un'altra costosa scheda aggiuntiva per questo che lo colleghi al sensore ambientale che acquisti separatamente, di solito con un cavo CAT5 standard (non provare nemmeno a collegare nulla a quella porta perché non c'è nulla di standard a proposito). Affermano che il dispositivo ha bisogno di 10 minuti per "riscaldarsi" che in realtà erano ore e una volta fatto voilà si è presentato nella loro interfaccia java che si aggiorna lentamente e abbiamo temperatura e umidità. L'impostazione delle condizioni basate sugli avvisi è stata facile da questo punto, ma chi se ne frega, costruiamo qualcosa di meglio.

Questo progetto è una congiunzione di più dei miei progetti: stazione meteo Natalia, Shadow of phoenix. Il box è in grado di monitorare i seguenti vincoli ambientali:

  • Temperatura/umidità/indice di calore
  • Concentrazioni nell'aria di GPL, fumo, alcol, propano, idrogeno, metano e monossido di carbonio (MQ2)
  • Sensibilità solare (la luce nella sala server è accesa?)
  • Sensore PIR di movimento (puoi anche accendere/spegnere automaticamente le luci d'ora in poi grazie al sensore di movimento quando qualcuno entra nella stanza)

Tutti questi dati sono ben visualizzati su uno schermo LCD mentre sono anche trasmessi a un computer (Orange PI Zero) per ulteriori elaborazioni e avvisi. Anche se sarebbe possibile collegare direttamente all'OrangePI sensori digitali come il DHT e il pin digitale dell'MQ2, preferisco sempre utilizzare micro dedicati per queste attività e quando è necessario aggiornare anche l'LCD e fare altro a basso livello roba l'Arduino è semplicemente imbattibile e può funzionare in modo affidabile senza sosta per molti anni (in effetti non un singolo Arduino che funziona 24 ore su 24, 7 giorni su 7 non è ancora riuscito su di me). L'OrangePI con i suoi difetti (ammettiamolo è un computer da 10 $) come inutilizzabile per carichi di lavoro pesanti, nessun supporto bsd, il wifi integrato è gonfio ecc.

Questo è un progetto hardware molto semplice che richiede i seguenti componenti:

  • Arduino PRO Micro
  • Schermo LCD 2x16 caratteri RGB
  • Modulo di alimentazione interruttore di isolamento AC-DC da 220V a 5V HLK-5M05 (questi sono molto buoni per i progetti Arduino/ESP), questa è la versione 5V/5W!
  • Resistori 2x300ohm
  • 2xled (rosso/verde)
  • Sensore di movimento PIR
  • Sensore MQ2
  • DHT22
  • LDR
  • Resistenza 2X10Kohm
  • Cicalino
  • Arancio PI Zero
  • cavo dati mini USB

Non mi sono nemmeno preoccupato di realizzare un PCB per questa breadboard appena usata perché i componenti possono essere semplicemente collegati ad Arduino (vedi foto allegate):

-DHT22 richiederà un pullup 10K su VCC (digitale)

-LDR richiederà un pulldown di 10K su GND (analogico)

-MQ2 può essere collegato direttamente a qualsiasi pin analogico (analogico) <preferisco usare l'analogico perché perché no quando abbiamo un MCU con pin analogici dove possiamo ottenere il valore esatto invece di regolare qualche potenziometro sul retro del dispositivo per ottenere HIGH o LOW fuori di esso, a causa dell'incollaggio nel mio disegno che è comunque inaccessibile. Controllare:

-PIR può essere collegato direttamente a qualsiasi pin (digitale)

-LCD: può essere pilotato con 4 pin, può essere collegato a qualsiasi pin (digitale) avrà bisogno di +2 RS/E (digitale)

-Buzzer: può essere collegato direttamente a qualsiasi pin Arduino (digitale)

Il pinout che ho usato può essere visto nel codice. Collegare tutto insieme dopo questo è abbastanza semplice, puoi anche farlo uno per uno, assicurati che 1 sensore funzioni perfettamente, quindi procedi con il successivo, tutto ciò che puoi sbagliare è collegare per errore i cavi in posti sbagliati (ad esempio scambiando vcc /gnd per un sensore, finora questo non ha mai ucciso nessuno dei miei dispositivi). Quello che vorrei notare qui è che c'erano troppi VCC e GND impilati per me, non potevo spremerli attraverso una morsettiera, quindi li ho saldati tutti.

Anche sui DHT non dimenticare dagli altri miei progetti: se metti la libreria DHT nel tuo codice e il sensore DHT non è collegato o DHT errato collegato (es. 11 definito nel codice stai usando 22) che può portare al programma appendere per sempre all'inizio.

Riguardo ai sensori di rilevamento del movimento PIR, come puoi vedere nella mia foto ci sono tonnellate di falsi falsi di questi, infatti farei fatica a comprarne uno originale da Ebay. I falsi funzionano altrettanto bene, anche a lungo termine ma hanno il loro circuito speculare che fa invertire i pin + e -, anche questi sono facili da riconoscere da: venendo con pcb blu non il solito verde, mancano le etichette per i potmetri. Sono stato fortunato a trovare un originale nella mia scatola altrimenti cambiando la posizione coprirei i 2 led per me. Ho scoperto che entrambi i vasi girati a metà funzionano per me. Questo ti darà un raggio d'azione abbastanza lungo per il rilevamento anche quando c'è movimento la gamba digitale sarà mantenuta in posizione ALTA per circa un minuto, quindi non devi recuperare il codice per questo. Sui falsi è facile determinare da che parte sta il - e il + basta guardare le gambe corrispondenti per i cappucci elettrolitici collegati ai pin.

Per tagliare la scatola ho usato una testa di diamante dremel (che era un'esagerazione ma funzionava benissimo) e un normale trapano. Queste scatole di giunzione sono facili da lavorare e anche se non mi piace incollare non avevo viti e bulloni a portata di mano durante la costruzione, quindi ho preso l'affare di incollare le cose insieme (che può anche essere facilmente riscaldato e smontato in seguito usando il stessa pistola per colla senza riempimento).

Passaggio 2: progettazione del software

Progettazione software
Progettazione software
Progettazione software
Progettazione software

Anche il codice Arduino è semplice, fondamentalmente estrae tutte le letture del sensore all'inizio di ogni ciclo. Accende i led se c'è movimento o fumo e riproduce anche un suono di allarme sul cicalino se c'è fumo (questo è l'unico codice di blocco quindi l'ho fatto corto), poi visualizza i dati su LCD e infine li invia al PC con un periodo di attesa di 10 secondi, per non allagare la porta.

Questo progetto utilizza una comunicazione unidirezionale da Arduino->OrangePI, non sono implementati comandi di alcun tipo. Anche se questo sarebbe perfettamente possibile farlo come ho fatto in uno dei miei altri progetti in cui il computer può inviare LCD_PRINT1 o LCD_PRINT2 per sovrascrivere una riga dello schermo LCD con il proprio messaggio (es: indirizzo IP, uptime, data di sistema, utilizzo della CPU), l'area dello schermo è così piccola per la visualizzazione dei dati da 3 sensori che non mi sono nemmeno preoccupato. I valori SOL e SMK possono arrivare entrambi fino a 4 cifre 0000-1023 occupando già 8 caratteri preziosi sullo schermo.

Con l'LCD puoi notare un piccolo trucco nel codice che dopo ogni valore misurato viene applicata una stampa di spazi bianchi (" "), quindi sposto il cursore su posizioni fisse per posizionare le nuove icone e dati. Questi sono lì perché l'LCD non è così intelligente da capire i numeri, disegna solo ciò che ottiene e per esempio se avessi un valore solare di 525 che all'improvviso è diminuito a 3, allora visualizzerà 325 lasciando la vecchia spazzatura sullo schermo là.

Un codice di controllo C in esecuzione su OrangePI che registra i dati ambientali e invia avvisi e-mail quando necessario.

L'OrangePI esegue Armbian (che al momento della stesura è basato su Debian Stretch). Lo includerò nella parte del software riguardo a ciò che è stato risolto da un problema hw. Ecco il consumo medio di potenza del dispositivo:

0,17 A - Solo Arduino + sensori

0,5-0,62 A - Avvio OrangePI

0,31 A - PI arancione in idle

0,29 A - Arancione PI spento (non può davvero spegnerlo, non ha ACPI o qualcosa del genere)

0,60 A - Stress test 100% di utilizzo della CPU su 4 core

Ho avuto questo OrangePI in una scatola da molto tempo. Con il vecchio kernel il dispositivo ha scaricato così tanta corrente (come diceva il misuratore ha raggiunto un picco di circa 0,63 A) quello che l'alimentatore probabilmente non poteva fornire che semplicemente non si avviava, il processo di avvio era bloccato e ho acceso i 2 led ethernet costantemente e senza fare nulla.

Ora questo è un po 'fastidioso poiché l'HLK-5M05 afferma di poter erogare 5 W su 5 V rendendolo in grado di fornire 1 Amp, ma con questi dispositivi che escono dalla Cina non si sa mai, il picco di 0,63 A era molto più basso del massimo nominale valore. Quindi stavo eseguendo semplici test di riavvio, da 10 riavvii l'OrangePI si avviava con successo solo due volte, il che mi ha quasi fatto buttare fuori dal progetto poiché non mi piace il comportamento incoerente e difettoso nei circuiti. Quindi ho iniziato a cercare su Google forse c'è un modo per ridurre il consumo energetico all'avvio dal software (dato che era solo un problema allora) e ho trovato un articolo che parlava di modificare lo script.bin ma era per il PC Orange PI e il mancavano file dalla memoria, quindi qualunque cosa come ultima risorsa ho fatto il magico "aggiornamento apt" per aggiornare il firmware, il kernel e tutto il resto, sperando che si scarichi di meno e che il dispositivo possa avviarsi e:

Linux silverlight 4.14.18-sunxi #24 SMP Ven Feb 9 16:24:32 CET 2018 armv7l GNU/Linux

Linux silverlight 4.19.62-sunxi #5.92 SMP Mer Jul 31 22:07:23 CEST 2019 armv7l GNU/Linux

Ha funzionato! Lanciare hardware a un problema software è di solito che gli sviluppatori java pigri devono affrontare, ma in questo caso abbiamo risolto un problema hardware con il software che grande successo. Ho fatto altri 20 test di riavvio, il dispositivo ha avviato ogni singolo caso. Vorrei ancora notare che l'aumento di corrente dall'accensione dell'Opi (connessione / disconnessione) è così grande che ripristinerà l'Arduino in un dato momento (un semplice riavvio farà solo lampeggiare l'LCD ma non causerà ulteriori problemi), ma questo problema rimane nascosto poiché i 2 verranno avviati insieme.

Ho anche guardato i moduli del kernel:

usb_f_acm u_serial g_serial libcomposite xradio_wlan mac80211 Lima sun8i_codec_analog snd_soc_simple_card gpu_sched sun8i_adda_pr_regmap sun4i_i2s snd_soc_simple_card_utils ttm sun4i_gpadc_iio snd_soc_core cfg80211 snd_pcm_dmaengine industrialio snd_pcm snd_timer snd sun8i_ths soundcore cpufreq_dt uio_pdrv_genirq UIO thermal_sys pwrseq_simple

Di cosa abbiamo veramente bisogno da questi? Ok, il pwr e il termico potrebbero essere utili ma audio, porta seriale, wifi (hw già rotto) non abbiamo bisogno di tutti questi possono essere inseriti nella lista nera. Creerò anche un kernel personalizzato con solo i moduli necessari in seguito.

Quello di cui abbiamo bisogno e non è caricato di default è il CDC ACM per comunicare con Arduino, abilitarlo con:

echo "cdc-acm" >> /etc/modules

Dopodiché puoi già testare la connessione con:

schermo /dev/ttyACM0 9600

Dovresti vedere i dati di stato inviati ogni 10 secondi.

Avvisi e monitoraggio

A partire dagli avvisi, ho appena inserito le chiamate system() nel codice di controllo C che riceve i dati dal seriale, quindi non sono necessari strumenti esterni. Alcuni avvisi di esempio:

- La temperatura supera i 30 C

- L'umidità supera il 70% (non salutare per i server)

- Rilevato movimento nella stanza (questo può essere fastidioso se continui ad andare nella stanza del server)

- Rilevato fumo o gas (gli avvisi superiori a 100 possono essere presi sul serio, ho giocato un po' con questo sensore e si accende per molte cose, ad esempio la creazione di fumo accanto al sensore con il saldatore è risultata un po' più di 50 mentre si fumava una sigaretta successiva o è aumentato fino a 500, ha persino rilevato il gas dal normale deodorante da molto lontano)

Per conservare i dati storici non mi sono preoccupato di sviluppare uno strumento perché reinventare la ruota quando abbiamo ottenuto ottimi quadri di monitoraggio là fuori. Mostrerò un esempio di come integrarlo nel mio preferito, Zabbix:

apt-get install zabbix-agent

Aggiungi alla fine di: /etc/zabbix/zabbix_agentd.conf

UserParameter=silverlight.hum, head -1 /dev/shm/silverlight-zbx.log | awk -F", " '{ print $1 }'

UserParameter=silverlight.tmp, head -1 /dev/shm/silverlight-zbx.log | awk -F", " '{ print $2 }' UserParameter=silverlight.sol, head -1 /dev/shm/silverlight-zbx.log | awk -F", " '{ print $4 }' UserParameter=silverlight.mot, head -1 /dev/shm/silverlight-zbx.log | awk -F", " '{ print $5 }' UserParameter=silverlight.smk, head -1 /dev/shm/silverlight-zbx.log | awk -F", " '{ print $6 }'

L'esecuzione di zabbix_agentd -p dovrebbe restituire ora i valori corretti:

silverlight.hum [t|41]

silverlight.tmp [t|23] silverlight.sol [t|144] silverlight.mot [t|0] silverlight.smk [t|19]

L'indice di calore, lo raccolgo ma non ne vedo alcun uso pratico, quindi viene semplicemente registrato. Nel codice di controllo C ho implementato 2 funzioni di registrazione, la prima registrerà tutti i dati in un formato user friendly:

[SILVERLIGHT] Dati ricevuti il 2019-09-10 23:36:08 => Umidità: 44, Temp: 22, Hi: 25, Solare: 0, Movimento: 0, Fumo: 21

[SILVERLIGHT] Dati ricevuti il 2019-09-10 23:36:18 => Umidità: 44, Temp: 22, Hi: 25, Solare: 0, Movimento: 0, Fumo: 21 [SILVERLIGHT] Dati ricevuti il 2019-09-09 -10 23:36:29 => Umidità: 44, Temp: 22, Hi: 25, Solare: 0, Movimento: 0, Fumo: 22 [SILVERLIGHT] Dati ricevuti il 2019-09-10 23:36:39 => Umidità: 44, Temp: 22, Hi: 25, Solare: 0, Movimento: 0, Fumo: 21

Il secondo:

void logger2(car *testo) {

FILE *f = fopen("/dev/shm/silverlight-zbx.log", "w"); if (f == NULL) { printf("Errore durante l'apertura del file di registro della memoria!\n"); Restituzione; } fprintf(f, "%s", testo); fchiudi(f); Restituzione; }

Questo metterà in memoria un log di 1 liner (eliminerà le operazioni rw non necessarie sulla sdcard) che verrà sempre sovrascritto la prossima volta. Questo registro conterrà solo le 6 colonne di dati e nessun timestamp, è facilmente leggibile per Zabbix.

Come bonus finale: come programmare Arduino direttamente dall'OrangePI in modo da non dover ogni volta avvicinarsi al dispositivo e collegare il laptop.

Ci sono 2 modi:

-Modo semplice: installa l'IDE e le librerie Arduino complete, utilizza alcuni desktop remoti come X11 con inoltro, Xrdp, Xvnc, Nxserver ecc

-Difficile: installa l'IDE Arduino e usa la riga di comando

Questa volta faremo le cose difficili perché non mi piace installare X11 sui server. Per questo avrai bisogno di 6 componenti:

1, Arduino IDE per ARM 32 bit ->

2, seriale Python -> apt-get install python-serial

3, progetto Arduino Makefile -> git clone

4, libreria DHT

5, definizioni della scheda Sparkfun

6, SilverLight.ino, codice principale

Per semplificare ho raggruppato i file necessari per gli ultimi 4 punti (sketchbook.tgz) quindi avrai bisogno solo dei primi 2

Per prima cosa è meglio creare un utente normale che abbia accesso rw alla porta USB:

adduser argento

usermod -a -G dialout silver

SCP lo sketchbook.tgz sul dispositivo nella directory home dell'utente appena creato ed estrailo proprio lì:

cd /home/argento

tar xvzf sketchbook.tgz

Per capire un po' cosa sta succedendo sotto il cofano quando si utilizza l'IDE grafico:

Il flusso di lavoro di creazione di uno schizzo Arduino quando si utilizza l'IDE Arduino è descritto sul sito Web di Arduino https://www.arduino.cc/en/Hacking/BuildProcess e più in dettaglio qui: https://www.arduino.cc/ it/Hacking/BuildProcess

In generale, il processo di compilazione standard di Arduino è:

Combina i file.ino nel file di schizzo principale. Trasformazione del file di sketch principale: aggiungere l'istruzione #include; creare dichiarazioni di funzione (prototipi) di tutte le funzioni nel file di schizzo principale; aggiungere il contenuto del file main.cxx della destinazione al file di schizzo principale. Compila il codice in file oggetto. Collega i file oggetto per produrre un file.hex pronto per il caricamento su Arduino.

Ci sono alcune lievi differenze tra il processo di compilazione standard Arduino e il processo di compilazione utilizzando Arduino-Makefile:

È supportato un solo file.ino. Le dichiarazioni di funzione non vengono create automaticamente nel file.ino. L'utente deve occuparsi di creare le corrette dichiarazioni di funzione.

Il cuore del processo di compilazione è il Makefile. Non preoccuparti, è tutto pronto per te, è un po' più complicato compilare in questo modo per schede non standard come la serie SparkFun.

BOARD_TAG = promicro

ALTERNATE_CORE = SparkFun BOARD_SUB = 16MHzatmega32U4 ARDUINO_PORT = /dev/ttyACM0 USER_LIB_PATH = /home/silver/sketchbook/librerie ARDUINO_DIR = /opt/arduino-1.8.9 include /home/silver/sketchbook/Arduino-Makefile/

E tutto ciò che devi digitare è: make upload (che prima creerà i file.hex e poi userà avrdude per caricarli), finirà con qualcosa del tipo:

mkdir -p build-promicro-16MHzatmega32U4

make reset make[1]: accesso alla directory '/home/silver/sketchbook' /home/silver/sketchbook/Arduino-Makefile/bin/ard-reset-arduino --caterina /dev/ttyACM0 make[1]: uscita dalla directory ' /home/silver/sketchbook' make do_upload make[1]: accesso alla directory '/home/silver/sketchbook' /opt/arduino-1.8.9/hardware/tools/avr/bin/avrdude -q -V -p atmega32u4 - C /opt/arduino-1.8.9/hardware/tools/avr/etc/avrdude.conf -D -c avr109 -b 57600 -P /dev/ttyACM0 / -U flash:w:build-promicro-16MHzatmega32U4/sketchbook. hex:i Connessione al programmatore:. Programmatore trovato: Id = "CATERIN"; tipo = S Versione software = 1.0; Nessuna versione hardware fornita. Il programmatore supporta l'incremento automatico dell'indirizzo. Il programmatore supporta l'accesso alla memoria bufferizzata con buffersize=128 byte. Il programmatore supporta i seguenti dispositivi: Codice dispositivo: 0x44 avrdude: dispositivo AVR inizializzato e pronto ad accettare istruzioni avrdude: firma dispositivo = 0x1e9587 (probabilmente m32u4) avrdude: lettura del file di input "build-promicro-16MHzatmega32U4/sketchbook.hex" avrdude: scrittura di flash (11580 byte): avrdude: 11580 byte di flash scritti avrdude: safemode: Fusibili OK (E:CB, H:D8, L:FF) avrdude fatto. Grazie.

Bene, grazie avrdude, e ora il nostro Arduino è stato resettato e programmato con il nuovo codice, quello che puoi semplicemente modificare con vi o il tuo editor preferito localmente, senza bisogno di alcun IDE. Vorrei notare che dovresti chiudere sia il programma di controllo C, lo schermo o qualsiasi altra cosa che acceda all'arduino durante il caricamento, altrimenti la porta tornerà come /dev/ttyACM1 dopo il ripristino.

Passaggio 3: chiusura e lista delle cose da fare

Chiusura e lista delle cose da fare
Chiusura e lista delle cose da fare
Chiusura e lista delle cose da fare
Chiusura e lista delle cose da fare
Chiusura e lista delle cose da fare
Chiusura e lista delle cose da fare

Anche se ho creato questa scatola di sensori ambientali per le sale server, puoi usarla per laboratori di chimica/elettronica, magazzini, stanze normali e qualsiasi altra cosa. E sì, dato che sta usando TCP/IP è un dispositivo IoT, G avrei dovuto metterlo anche nel titolo per renderlo più intraprendente:)

Puoi modificare facilmente sia l'hardware che il software per poter accendere automaticamente anche le luci della stanza. Dai un'occhiata al mio altro progetto: Shadow of phoenix come funziona per il controllo della luce, hai tutto l'hardware a portata di mano per fare la stessa cosa (usa i timer di attesa per mantenere le luci accese finché è stato rilevato un movimento all'interno di un periodo di tempo, se c'è di nuovo movimento, un timer verrà aumentato).

Con OrangePI che esegue uno stack completo Armbian le possibilità sono illimitate, è possibile creare un'interfaccia web locale scritta da zero in php per visualizzare i dati storici sui grafici. Non è già meglio che tu abbia un dispositivo completamente Open Source che monitora la tua stanza del server cosa puoi essere orgoglioso di costruire, se lo pensi, costruiscilo da solo!

Consigliato: