Nota

Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti?

  • Supporto esperto: Risolvi problemi tecnici e post-vendita con l’aiuto della nostra community e del nostro team.

  • Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato ai nuovi annunci di prodotti e anteprime.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e omaggi: Partecipa a promozioni e omaggi durante le festività.

👉 Sei pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi!

5.3 Rilevamento del Cambio di Stato

Quando il pulsante controlla altri dispositivi, non solo può attivarli quando viene premuto, ma anche fermarli quando viene rilasciato. È inoltre possibile commutare lo stato operativo ogni volta che il pulsante viene premuto.

Per ottenere questo effetto, è necessario sapere come alternare lo stato di funzionamento tra acceso e spento quando il pulsante viene premuto, ovvero il «rilevamento del cambio di stato».

In questo progetto, utilizzeremo il pulsante per controllare il motore.

Componenti necessari

In questo progetto, ci servono i seguenti componenti.

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

3 in 1 Starter Kit

380+

3 in 1 Starter Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda SunFounder R3

ACQUISTA

Breadboard

ACQUISTA

Cavi di Collegamento

ACQUISTA

Resistore

ACQUISTA

Pulsante

ACQUISTA

Motore TT

-

Modulo Driver Motore L9110

-

Schema

../_images/circuit_8.3_statechange.png

Collegamenti

../_images/5.3_state_change_l9110_bb.png

Codice

Nota

  • Apri il file 5.3.state_change_detection.ino nel percorso 3in1-kit\basic_project\5.3.state_change_detection.

  • Oppure copia questo codice nell”Arduino IDE.

  • Oppure carica il codice tramite l”Arduino Web Editor.

Dopo aver caricato correttamente il codice, premi il pulsante e il motore si avvierà; fino a quando non premi nuovamente il pulsante, il motore si fermerà.

Come funziona?

  1. Crea variabili e definisci i pin per il motore e il pulsante.

    ...
    int detectionState = 0;
    int buttonState = 0;
    int lastButtonState = 0;
    
    • detectionState è una variabile che cambia il suo valore ogni volta che viene premuto il pulsante, ad esempio, 0 questa volta, 1 la prossima e così via alternativamente.

    • buttonState e lastButtonState vengono utilizzati per registrare lo stato del pulsante questa volta e l’ultima volta, per confrontare se il pulsante è stato premuto o rilasciato.

  2. Inizializza ogni pin e imposta la velocità di trasmissione del monitor seriale.

    void setup() {
        pinMode(buttonPin, INPUT);
        Serial.begin(9600);
        pinMode(B_1A, OUTPUT);
        pinMode(B_1B, OUTPUT);
    }
    
  3. Leggi lo stato del pulsante e, se premuto, la variabile detectionState cambierà il suo valore da 0 a 1 o da 1 a 0. Quando detectionState è 1, il motore si avvierà. L’effetto sarà che questa volta il pulsante viene premuto, il motore gira, la prossima volta che viene premuto, il motore si fermerà, e così via alternativamente.

    void loop() {
    // Toggle the detectionState each time the button is pressed
    buttonState = digitalRead(buttonPin);
    if (buttonState != lastButtonState) {
        if (buttonState == HIGH) {
        detectionState=(detectionState+1)%2;
        Serial.print("The detection state is: ");
        Serial.println(detectionState);
        }
        delay(50);
    }
    lastButtonState = buttonState;
    
    // According to the detectionState, start the motor
    if(detectionState==1){
        digitalWrite(B_1A,HIGH);
        digitalWrite(B_1B,LOW);
    }else{
        digitalWrite(B_1A,LOW);
        digitalWrite(B_1B,LOW);
    }
    }
    

    Il flusso di lavoro completo è il seguente.

    • Leggi il valore del pulsante.

    buttonState = digitalRead(buttonPin);
    
    • Se buttonState e lastButtonState non sono uguali, significa che lo stato del pulsante è cambiato, procedi con il successivo controllo, e memorizza lo stato del pulsante attuale nella variabile lastButtonState. delay(50) viene utilizzato per eliminare il rimbalzo.

    if (buttonState != lastButtonState) {
    ...
        delay(50);
    }
    lastButtonState = buttonState;
    
    • Quando il pulsante è premuto, il suo valore è HIGH. Qui, quando il pulsante è premuto, il valore della variabile detectionState cambia, ad esempio, da 0 a 1 dopo un’operazione.

    if (buttonState == HIGH) {
        detectionState=(detectionState+1)%2;
        Serial.print("The detection state is: ");
        Serial.println(detectionState);
        }
    
    • Quando la variabile detectionState è 1, fai ruotare il motore, altrimenti fermalo.

    if(detectionState==1){
        digitalWrite(B_1A,HIGH);
        digitalWrite(B_1B,LOW);
    }else{
        digitalWrite(B_1A,LOW);
        digitalWrite(B_1B,LOW);
    }