Nota
Ciao, benvenuto nella Community di SunFounder per appassionati di Raspberry Pi, Arduino e ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
Perché unirsi?
Supporto Esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.
Impara e Condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.
Anteprime Esclusive: Accedi in anteprima agli annunci dei nuovi prodotti e alle anticipazioni.
Sconti Speciali: Godi di sconti esclusivi sui nostri prodotti più recenti.
Promozioni e Giveaway Festivi: Partecipa a giveaway e promozioni festive.
👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi!
MPR121
Panoramica
In questa lezione, imparerai a usare il MPR121. È una buona opzione quando vuoi aggiungere molti interruttori touch al tuo progetto. L’elettrodo del MPR121 può essere esteso con un conduttore. Se colleghi un filo a una banana, puoi trasformare la banana in un interruttore touch, realizzando così progetti come il pianoforte di frutta.
Componenti Necessari
In questo progetto, abbiamo bisogno dei seguenti componenti.
È sicuramente conveniente acquistare un kit completo, ecco il link:
Nome |
ELEMENTI IN QUESTO KIT |
LINK |
---|---|---|
Elite Explorer Kit |
300+ |
Puoi anche acquistarli separatamente dai link seguenti.
INTRODUZIONE DEI COMPONENTI |
LINK PER L’ACQUISTO |
---|---|
- |
|
- |
Cablaggio
In questo esempio, inseriamo il MPR121 nella breadboard. Collega il GND del MPR121 a GND, 3.3V a 3V3, IRQ al pin digitale 2, SCL al pin SCL(A5) e SDA al pin SDA(A4). Ci sono 12 elettrodi per il rilevamento touch.
Nota
Il MPR121 è alimentato a 3.3V, non a 5V.
Schema Elettrico
Codice
Nota
Puoi aprire direttamente il file
23-mpr121.ino
nel percorsoelite-explorer-kit-main\basic_project\23-mpr121
.La libreria
Adafruit MPR121
viene utilizzata qui, puoi installarla dal Library Manager.
Dopo aver caricato il codice sulla scheda UNO, lo stato di tocco dei pin MPR121 «1» e «0» verrà registrato in un array booleano a 12 bit. Questo array verrà quindi stampato sul monitor seriale.
Analisi del Codice
Questo codice facilita la comunicazione e il funzionamento del sensore touch MPR121. Può rilevare lo stato degli elettrodi touch e stampare informazioni sugli elettrodi toccati o rilasciati sull’interfaccia seriale. Se sono necessari dati dettagliati del sensore, il codice pertinente può essere decommentato.
Ecco un’analisi del codice:
Importa Librerie:
#include <Wire.h> #include "Adafruit_MPR121.h"
Wire.h
: Utilizzata per la comunicazione I2C.Adafruit_MPR121.h
: La libreria Adafruit per il funzionamento del sensore touch MPR121.
Definisci la Macro
_BV
:#ifndef _BV #define _BV(bit) (1 << (bit)) #endif
_BV(bit)
definisce una macro che converte un dato bit nel valore binario corrispondente, simile a 1 << bit.Inizializza l’istanza della classe
Adafruit_MPR121
:Adafruit_MPR121 cap = Adafruit_MPR121();
Crea un’istanza della classe
Adafruit_MPR121
chiamatacap
. L’oggettocap
verrà utilizzato per comunicare e operare con il sensore touch MPR121.Funzione
setup()
:Inizializza la comunicazione seriale a un baud rate di 9600. poi inizializza il sensore touch MPR121 con l’indirizzo I2C predefinito di 0x5A. Se l’inizializzazione fallisce, stampa un messaggio di errore ed entra in un ciclo infinito.
void setup() { Serial.begin(9600); while (!Serial) { // necessario per evitare che leonardo/micro partano troppo velocemente! delay(10); } Serial.println("Adafruit MPR121 Capacitive Touch sensor test"); // L'indirizzo predefinito è 0x5A, se collegato a 3.3V è 0x5B // Se collegato a SDA è 0x5C e se a SCL è 0x5D if (!cap.begin(0x5A)) { Serial.println("MPR121 not found, check wiring?"); while (1); } Serial.println("MPR121 found!"); }
Funzione
loop()
:Ottieni lo stato attuale del tocco, restituito come intero a 16 bit.
currtouched = cap.touched();
Itera attraverso lo stato di 12 elettrodi (numerati da 0 a 11).
for (uint8_t i=0; i<12; i++) { // se *è* toccato e *non era* toccato prima, avvisa! if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) { Serial.print(i); Serial.println(" touched"); } // se *era* toccato e ora *non è*, avvisa! if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) ) { Serial.print(i); Serial.println(" released"); } }
Se un elettrodo è toccato e non era toccato prima, stampa «x toccato,» dove x è il numero dell’elettrodo.
Se un elettrodo era toccato prima ma non è toccato ora, stampa «x rilasciato.»
Aggiorna
lasttouched
per memorizzare lo stato attuale del tocco per il confronto nella prossima iterazione.lasttouched = currtouched;
Informazioni di Debug (Sezione Opzionale):
// informazioni di debug, cosa Serial.print("\t\t\t\t\t\t\t\t\t\t\t\t\t 0x"); Serial.println(cap.touched(), HEX); Serial.print("Filt: "); for (uint8_t i=0; i<12; i++) { Serial.print(cap.filteredData(i)); Serial.print("\t"); } Serial.println(); Serial.print("Base: "); for (uint8_t i=0; i<12; i++) { Serial.print(cap.baselineData(i)); Serial.print("\t"); } Serial.println(); // metti un ritardo per non sovraccaricare delay(100);