.. note:: Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci l'esplorazione del Raspberry Pi, Arduino ed ESP32 con altri appassionati. **Perché unirti a noi?** - **Supporto esperto**: Risolvi i problemi post-vendita e le sfide tecniche con l'aiuto della nostra comunità e del nostro team. - **Impara e condividi**: Scambia consigli e tutorial per migliorare le tue competenze. - **Anteprime esclusive**: Accedi in anteprima agli annunci di nuovi prodotti e alle anteprime esclusive. - **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni e omaggi festivi**: Partecipa a omaggi e promozioni speciali durante le festività. 👉 Sei pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso! .. _2.2.7_py: 2.2.7 PIR ============ Introduzione --------------- In questo progetto, realizzeremo un dispositivo utilizzando i sensori piroelettrici a infrarossi per il rilevamento del corpo umano. Quando qualcuno si avvicina al LED, questo si accenderà automaticamente. In caso contrario, la luce si spegnerà. Questo sensore di movimento a infrarossi è un tipo di sensore che può rilevare l'infrarosso emesso da esseri umani e animali. Componenti necessari ------------------------------ In questo progetto avremo bisogno dei seguenti componenti. .. image:: ../img/list_2.2.4_pir2.png È sicuramente conveniente acquistare un kit completo, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - ELEMENTI IN QUESTO KIT - LINK * - Kit Raphael - 337 - |link_Raphael_kit| Puoi anche acquistarli separatamente dai link sottostanti. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE AI COMPONENTI - LINK PER L'ACQUISTO * - :ref:`cpn_gpio_extension_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_rgb_led` - |link_rgb_led_buy| * - :ref:`cpn_pir` - \- Schema elettrico ----------------------- .. image:: ../img/image327.png Procedura sperimentale ------------------------- **Passo 1:** Costruisci il circuito. .. image:: ../img/image214.png **Passo 2:** Vai nella cartella del codice. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Passo 3:** Esegui il file eseguibile. .. raw:: html .. code-block:: sudo python3 2.2.7_PIR.py Dopo l'esecuzione del codice, il PIR rileva l'ambiente circostante e fa illuminare il LED RGB di giallo se rileva qualcuno nelle vicinanze. Sul modulo PIR ci sono due potenziometri: uno per regolare la sensibilità e l'altro per regolare la distanza di rilevamento. Per far funzionare meglio il modulo PIR, devi ruotarli entrambi in senso antiorario fino alla fine. .. image:: ../img/PIR_TTE.png :width: 400 :align: center **Codice** .. note:: Puoi **Modificare/Resettare/Copiare/Eseguire/Fermare** il codice qui sotto. Ma prima di farlo, devi andare nel percorso del codice sorgente, come ``raphael-kit/python``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto. .. raw:: html .. code-block:: python import RPi.GPIO as GPIO import time rgbPins = {'Red':18, 'Green':27, 'Blue':22} pirPin = 17 # il pir è collegato al pin 17 def setup(): global p_R, p_G, p_B GPIO.setmode(GPIO.BCM) # Imposta le modalità GPIO su BCM Numbering GPIO.setup(pirPin, GPIO.IN) # Imposta pirPin come input # Imposta tutti i LedPin in modalità output e livello iniziale alto (3,3 V) for i in rgbPins: GPIO.setup(rgbPins[i], GPIO.OUT, initial=GPIO.HIGH) # Imposta tutti i led come canali pwm e frequenza a 2KHz p_R = GPIO.PWM(rgbPins['Red'], 2000) p_G = GPIO.PWM(rgbPins['Green'], 2000) p_B = GPIO.PWM(rgbPins['Blue'], 2000) # Imposta tutti i valori iniziali a 0 p_R.start(0) p_G.start(0) p_B.start(0) # Definisci una funzione MAP per mappare i valori, ad esempio da 0~255 a 0~100 def MAP(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min # Definisci una funzione per impostare i colori def setColor(color): # configura la luminosità dei tre LED con il valore del colore inserito. # Suddividi i colori dalla variabile 'color' R_val = (color & 0xFF0000) >> 16 G_val = (color & 0x00FF00) >> 8 B_val = (color & 0x0000FF) >> 0 # Mappa il valore del colore da 0~255 a 0~100 R_val = MAP(R_val, 0, 255, 0, 100) G_val = MAP(G_val, 0, 255, 0, 100) B_val = MAP(B_val, 0, 255, 0, 100) # Assegna il valore del ciclo di lavoro mappato al corrispondente canale PWM per cambiare la luminosità. p_R.ChangeDutyCycle(R_val) p_G.ChangeDutyCycle(G_val) p_B.ChangeDutyCycle(B_val) #print ("messaggio_colore: R_val = %s, G_val = %s, B_val = %s"%(R_val, G_val, B_val)) def loop(): while True: pir_val = GPIO.input(pirPin) if pir_val==GPIO.HIGH: setColor(0xFFFF00) else : setColor(0x0000FF) def destroy(): p_R.stop() p_G.stop() p_B.stop() GPIO.cleanup() # Rilascia le risorse if __name__ == '__main__': # Il programma inizia qui setup() try: loop() except KeyboardInterrupt: # Quando si preme 'Ctrl+C', viene eseguito il programma figlio destroy(). destroy() **Spiegazione del Codice** .. code-block:: python rgbPins = {'Red':18, 'Green':27, 'Blue':22} def setup(): global p_R, p_G, p_B GPIO.setmode(GPIO.BCM) # …… for i in rgbPins: GPIO.setup(rgbPins[i], GPIO.OUT, initial=GPIO.HIGH) p_R = GPIO.PWM(rgbPins['Red'], 2000) p_G = GPIO.PWM(rgbPins['Green'], 2000) p_B = GPIO.PWM(rgbPins['Blue'], 2000) p_R.start(0) p_G.start(0) p_B.start(0) def MAP(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min def setColor(color): ... Questi codici vengono utilizzati per impostare il colore del LED RGB, per ulteriori dettagli consulta :ref:`1.1.2_py`. .. code-block:: python def loop(): while True: pir_val = GPIO.input(pirPin) if pir_val==GPIO.HIGH: setColor(0xFFFF00) else : setColor(0x0000FF) Quando il PIR rileva lo spettro infrarosso umano, il LED RGB emette luce gialla; altrimenti, emette luce blu. Immagine del fenomeno ------------------------- .. image:: ../img/image215.jpeg