.. note:: Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati. **Perché unirsi?** - **Supporto tecnico esperto**: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team. - **Impara e Condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze. - **Anteprime Esclusive**: Ottieni l'accesso anticipato a nuovi annunci di prodotti e anteprime. - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni e Concorsi Festivi**: Partecipa a concorsi e promozioni festive. 👉 Sei pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti subito! 2.1.3 Interruttore di Inclinazione ==================================== Introduzione --------------- Questo è un interruttore di inclinazione a sfera con una pallina di metallo all'interno, utilizzato per rilevare inclinazioni di piccoli angoli. Componenti ------------- .. image:: img/list_2.1.3_tilt_switch.png Principio di Funzionamento ----------------------------- **Inclinazione** Il principio è molto semplice. Quando l'interruttore viene inclinato di un certo angolo, la pallina all'interno rotola verso il basso e tocca i due contatti collegati ai pin esterni, chiudendo il circuito. In caso contrario, la pallina rimane lontana dai contatti, interrompendo il circuito. .. image:: img/image167.png Schema Elettrico ------------------- .. image:: img/image307.png .. image:: img/image308.png Procedure Sperimentali ------------------------- **Passo 1:** Costruisci il circuito. .. image:: img/image169.png :width: 800 Per Utenti C ^^^^^^^^^^^^^^ **Passo 2:** Cambia la directory. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/2.1.3/ **Passo 3:** Compila il codice. .. raw:: html .. code-block:: gcc 2.1.3_Tilt.c -lwiringPi **Passo 4:** Esegui. .. raw:: html .. code-block:: sudo ./a.out Posiziona l'interruttore di inclinazione orizzontalmente e il LED verde si accenderà. Se lo inclini, apparirà "Tilt!" sullo schermo e il LED rosso si accenderà. Rimettilo in posizione orizzontale e il LED verde si riaccenderà. .. note:: Se non funziona dopo l'esecuzione o compare un messaggio di errore: \"wiringPi.h: No such file or directory", consulta :ref:`faq_c_nowork`. **Codice** .. code-block:: c #include #include #define TiltPin 0 #define Gpin 2 #define Rpin 3 void LED(char* color) { pinMode(Gpin, OUTPUT); pinMode(Rpin, OUTPUT); if (color == "RED") { digitalWrite(Rpin, HIGH); digitalWrite(Gpin, LOW); } else if (color == "GREEN") { digitalWrite(Rpin, LOW); digitalWrite(Gpin, HIGH); } else printf("LED Error"); } int main(void) { if(wiringPiSetup() == -1){ //se l'inizializzazione di wiring fallisce, stampa un messaggio printf("setup wiringPi failed !"); return 1; } pinMode(TiltPin, INPUT); LED("GREEN"); while(1){ if(0 == digitalRead(TiltPin)){ delay(10); if(0 == digitalRead(TiltPin)){ LED("RED"); printf("Tilt!\n"); delay(100); } } else if(1 == digitalRead(TiltPin)){ delay(10); if(1 == digitalRead(TiltPin)){ LED("GREEN"); } } } return 0; } **Spiegazione del Codice** .. code-block:: c void LED(char* color) { pinMode(Gpin, OUTPUT); pinMode(Rpin, OUTPUT); if (color == "RED") { digitalWrite(Rpin, HIGH); digitalWrite(Gpin, LOW); } else if (color == "GREEN") { digitalWrite(Rpin, LOW); digitalWrite(Gpin, HIGH); } else printf("LED Error"); } Definisce la funzione LED() per accendere o spegnere i due LED. Se il parametro color è "RED", si accende il LED rosso; allo stesso modo, se il parametro color è "GREEN", si accende il LED verde. .. code-block:: c while(1){ if(0 == digitalRead(TiltPin)){ delay(10); if(0 == digitalRead(TiltPin)){ LED("RED"); printf("Tilt!\n"); } } else if(1 == digitalRead(TiltPin)){ delay(10); if(1 == digitalRead(TiltPin)){ LED("GREEN"); } } } Se il valore letto dall'interruttore di inclinazione è 0, significa che è inclinato e quindi il parametro "RED" viene passato alla funzione LED per accendere il LED rosso; altrimenti si accende il LED verde. Per Utenti Python ^^^^^^^^^^^^^^^^^^^^ **Passo 2:** Cambia la directory. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python/ **Passo 3:** Esegui. .. raw:: html .. code-block:: sudo python3 2.1.3_Tilt.py Posiziona l'interruttore di inclinazione orizzontalmente e si accenderà il LED verde. Se lo inclini, apparirà "Inclinazione rilevata!" sullo schermo e si accenderà il LED rosso. Rimettilo in posizione orizzontale e si riaccenderà il LED verde. ED will lights on. **Code** .. note:: Puoi **Modificare/Reimpostare/Copiare/Eseguire/Arrestare** il codice qui sotto. Tuttavia, prima devi accedere al percorso del codice sorgente come ``davinci-kit-for-raspberry-pi/python``. .. raw:: html .. code-block:: python import RPi.GPIO as GPIO import time dhtPin = 17 GPIO.setmode(GPIO.BCM) MAX_UNCHANGE_COUNT = 100 STATE_INIT_PULL_DOWN = 1 STATE_INIT_PULL_UP = 2 STATE_DATA_FIRST_PULL_DOWN = 3 STATE_DATA_PULL_UP = 4 STATE_DATA_PULL_DOWN = 5 def readDht11(): GPIO.setup(dhtPin, GPIO.OUT) GPIO.output(dhtPin, GPIO.HIGH) time.sleep(0.05) GPIO.output(dhtPin, GPIO.LOW) time.sleep(0.02) GPIO.setup(dhtPin, GPIO.IN, GPIO.PUD_UP) unchanged_count = 0 last = -1 data = [] while True: current = GPIO.input(dhtPin) data.append(current) if last != current: unchanged_count = 0 last = current else: unchanged_count += 1 if unchanged_count > MAX_UNCHANGE_COUNT: break state = STATE_INIT_PULL_DOWN lengths = [] current_length = 0 for current in data: current_length += 1 if state == STATE_INIT_PULL_DOWN: if current == GPIO.LOW: state = STATE_INIT_PULL_UP else: continue if state == STATE_INIT_PULL_UP: if current == GPIO.HIGH: state = STATE_DATA_FIRST_PULL_DOWN else: continue if state == STATE_DATA_FIRST_PULL_DOWN: if current == GPIO.LOW: state = STATE_DATA_PULL_UP else: continue if state == STATE_DATA_PULL_UP: if current == GPIO.HIGH: current_length = 0 state = STATE_DATA_PULL_DOWN else: continue if state == STATE_DATA_PULL_DOWN: if current == GPIO.LOW: lengths.append(current_length) state = STATE_DATA_PULL_UP else: continue if len(lengths) != 40: #print ("Data not good, skip") return False shortest_pull_up = min(lengths) longest_pull_up = max(lengths) halfway = (longest_pull_up + shortest_pull_up) / 2 bits = [] the_bytes = [] byte = 0 for length in lengths: bit = 0 if length > halfway: bit = 1 bits.append(bit) #print ("bits: %s, length: %d" % (bits, len(bits))) for i in range(0, len(bits)): byte = byte << 1 if (bits[i]): byte = byte | 1 else: byte = byte | 0 if ((i + 1) % 8 == 0): the_bytes.append(byte) byte = 0 #print (the_bytes) checksum = (the_bytes[0] + the_bytes[1] + the_bytes[2] + the_bytes[3]) & 0xFF if the_bytes[4] != checksum: #print ("Data not good, skip") return False return the_bytes[0], the_bytes[2] def main(): while True: result = readDht11() if result: humidity, temperature = result print ("humidity: %s %%, Temperature: %s C`" % (humidity, temperature)) time.sleep(1) def destroy(): GPIO.cleanup() if __name__ == '__main__': try: main() except KeyboardInterrupt: destroy() **Spiegazione del Codice** .. code-block:: python GPIO.add_event_detect(TiltPin, GPIO.BOTH, callback=detect, bouncetime=200) Configura un rilevamento su TiltPin e la funzione di callback per rilevare. .. code-block:: python def Led(x): if x == 0: GPIO.output(Rpin, 1) GPIO.output(Gpin, 0) if x == 1: GPIO.output(Rpin, 0) GPIO.output(Gpin, 1) Definisci una funzione Led() per accendere o spegnere i due LED. Se x=0, il LED rosso si accende; altrimenti, si accende il LED verde. .. code-block:: python def Print(x): if x == 0: print (' *************') print (' * Tilt! *') print (' *************') Crea una funzione Print() per visualizzare i caratteri sopra riportati sullo schermo. .. code-block:: python def detect(chn): Led(GPIO.input(TiltPin)) Print(GPIO.input(TiltPin)) Definisci una funzione di callback per il rilevamento dell'inclinazione. Ottieni il valore letto dall’interruttore di inclinazione; successivamente, la funzione Led() controlla l'accensione o lo spegnimento dei due LED in base al valore letto. Immagine del Fenomeno -------------------------- .. image:: img/image170.jpeg