Πίνακας περιεχομένων:
- Βήμα 1: Εισαγωγή
- Βήμα 2: Χαρακτηριστικά
- Βήμα 3: Το ESP01 μπορεί να έχει 128 GPIO
- Βήμα 4: MCP23016
- Βήμα 5: ΡΟΛΟΙ
- Βήμα 6: Διεύθυνση
- Βήμα 7: Εντολές
- Βήμα 8: Κατηγορίες:
- Βήμα 9: Δομή για την Επικοινωνία
- Βήμα 10: Πρόγραμμα
- Βήμα 11: ESP01
- Βήμα 12: Τοποθέτηση ESP01
- Βήμα 13: NodeMCU ESP-12E
- Βήμα 14: Τοποθέτηση NodeMCU ESP-12E
- Βήμα 15: WiFi NodeMCU-32S ESP-WROOM-32
- Βήμα 16: Κόμβος τοποθέτησης WiFiMCU-32S ESP-WROOM-32
- Βήμα 17: Βιβλιοθήκες και μεταβλητές
- Βήμα 18: Ρύθμιση
- Βήμα 19: ConfigurePort
- Βήμα 20: WriteBlockData & CheckButton
- Βήμα 21: ReadPin & ValueFromPin
- Βήμα 22: Πρόγραμμα ESP8266
- Βήμα 23: ΣΗΜΑΝΤΙΚΟ
- Βήμα 24: Αρχεία
Βίντεο: IO Expander για ESP32, ESP8266 και Arduino: 24 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:37
Θέλετε να επεκτείνετε τα IO του ESP32, ESP8266 ή του Arduino; Και έχετε σκεφτεί τη δυνατότητα 16 νέων GPIO που μπορούν να ελεγχθούν χρησιμοποιώντας το δίαυλο I2C; Λοιπόν σήμερα, θα σας παρουσιάσω το GPIO Expander MCP23016. Επίσης, θα σας δείξω πώς να επικοινωνείτε με έναν μικροελεγκτή με το MCP23016. Θα μιλήσω επίσης για τη δημιουργία ενός προγράμματος όπου θα χρησιμοποιήσουμε μόνο 2 ακίδες αυτού του μικροελεγκτή για να επικοινωνήσουμε με τον διαστολέα. Θα τα χρησιμοποιήσουμε για τον έλεγχο των LED και του κουμπιού.
Βήμα 1: Εισαγωγή
Η συσκευή MCP23016 παρέχει 16 bit για επέκταση GPIO χρησιμοποιώντας το δίαυλο I2C. Κάθε bit μπορεί να ρυθμιστεί ξεχωριστά (είσοδος ή έξοδος).
Το MCP23016 αποτελείται από πολλαπλές ρυθμίσεις 8-bit για είσοδο, έξοδο και επιλογή πολικότητας.
Οι διαστολείς παρέχουν μια απλή λύση όταν χρειάζονται IO για διακόπτες, αισθητήρες, κουμπιά και LED, μεταξύ άλλων παραδειγμάτων.
Βήμα 2: Χαρακτηριστικά
16 ακίδες εισόδου / εξόδου (16 πρότυπα εισόδου)
Γρήγορη συχνότητα ρολογιού διαύλου I2C (0-400 kbits/s)
Τρεις καρφίτσες διευθύνσεων υλικού επιτρέπουν τη χρήση έως και οκτώ συσκευών
Διακοπή εγγραφής λήψης θύρας
Μητρώο αντιστροφής πολικότητας για ρύθμιση της πολικότητας των δεδομένων της θύρας εισόδου
Συμβατό με τους περισσότερους μικροελεγκτές
Βήμα 3: Το ESP01 μπορεί να έχει 128 GPIO
Ένα παράδειγμα που δείχνει το μέγεθος αυτού του διαστολέα είναι η χρήση του με το ESP01, το οποίο μπορεί να συνδεθεί με έως και οκτώ επεκτάσεις με μόνο δύο IOS, φτάνοντας τα 128 GPIO.
Βήμα 4: MCP23016
Εδώ, έχουμε το σχηματικό σχήμα του διαστολέα, το οποίο έχει δύο ομάδες οκτώ δυαδικών ψηφίων. Αυτό σημαίνει συνολικά 16 θύρες. Εκτός από έναν πείρο διακοπής, έχει τον πείρο CLK, ο οποίος συνδέει τον πυκνωτή και την αντίσταση, οι οποίες συνδέονται εσωτερικά σε μια λογική θύρα. Αυτό γίνεται για να σχηματίσει το ρολόι, χρησιμοποιώντας την ιδέα ενός κρυσταλλικού ταλαντωτή, ο οποίος χρειάζεται ρολόι 1MHz. Ο πείρος TP χρησιμοποιείται για τη μέτρηση του ρολογιού. Οι ακίδες A0, A1 και A2 είναι δυαδικές διευθύνσεις.
Βήμα 5: ΡΟΛΟΙ
Το MCP23016 χρησιμοποιεί επομένως ένα εξωτερικό κύκλωμα RC για να καθορίσει την ταχύτητα του εσωτερικού ρολογιού. Απαιτείται ένα εσωτερικό ρολόι 1 MHz (συνήθως) για τη σωστή λειτουργία της συσκευής. Το εσωτερικό ρολόι μπορεί να μετρηθεί στην ακίδα TP. Οι προτεινόμενες τιμές για REXT και CEXT φαίνονται παρακάτω.
Βήμα 6: Διεύθυνση
Για να ορίσουμε τη διεύθυνση του MCP23016, στη συνέχεια χρησιμοποιούμε τις ακίδες A0, A1 και A2. Απλώς αφήστε τα στο HIGH ή LOW για αλλαγή διεύθυνσης.
Η διεύθυνση θα διαμορφωθεί ως εξής:
MCP_Address = 20 + (A0 A1 A2)
Όπου το A0 A1 A2 μπορεί να λάβει τιμές HIGH / LOW, αυτό σχηματίζει έναν δυαδικό αριθμό από 0 έως 7.
Για παράδειγμα:
A0> GND, A1> GND, A2> GND (σημαίνει 000, στη συνέχεια 20 + 0 = 20)
Ή αλλιώς, A0> HIGH, A1> GND, A2> HIGH (σημαίνει 101, στη συνέχεια 20 + 5 = 25)
Βήμα 7: Εντολές
Παρακάτω είναι ένας πίνακας με τις εντολές για επικοινωνία. Ας χρησιμοποιήσουμε GP0 και GP1, καθώς και IODIR0 και IODIR1.
Βήμα 8: Κατηγορίες:
GP0 / GP1 - Καταχωρητές θύρας δεδομένων
Υπάρχουν δύο καταχωρητές που παρέχουν πρόσβαση στις δύο θύρες GPIO.
Η ανάγνωση καταχωρητή παρέχει την κατάσταση των ακίδων σε αυτήν τη θύρα.
Bit = 1> HIGH Bit = 0> LOW
OLAT0 / OLAT1 - ΕΓΓΡΑΦΕΣ LACTCH εξόδου
Υπάρχουν δύο καταχωρητές που παρέχουν πρόσβαση στις θύρες εξόδου των δύο θυρών.
IPOL0 / IPOL1 - Καταχωρητές πολικότητας εισόδου
Αυτοί οι καταχωρητές επιτρέπουν στο χρήστη να διαμορφώσει την πολικότητα των δεδομένων της θύρας εισόδου (GP0 και GP1).
IODIR0 / IODIR1
Υπάρχουν δύο καταχωρητές που ελέγχουν τη λειτουργία pin. (Είσοδος ή Έξοδος)
Bit = 1> ΕΙΣΟΔΟΣ Bit = 0> OUTPUT
INTCAP0 / INTCAP1 - Διακοπή καταγραφής καταγραφής
Πρόκειται για καταχωρητές που περιέχουν την τιμή της θύρας που δημιούργησε τη διακοπή.
IOCON0 / IOCON1 - I / O Expander Control Register
Αυτό ελέγχει τη λειτουργικότητα του MCP23016.
Η ρύθμιση του bit 0 (IARES> Interrupt Activity Resolution) ελέγχει τη συχνότητα δειγματοληψίας των ακίδων της θύρας GP.
Bit0 = 0> (προεπιλογή) Ο μέγιστος χρόνος ανίχνευσης δραστηριότητας θύρας είναι 32ms (χαμηλή κατανάλωση ενέργειας)
Bit0 = 1> ο μέγιστος χρόνος ανίχνευσης δραστηριότητας στη θύρα είναι 200usec (υψηλότερη κατανάλωση ενέργειας)
Βήμα 9: Δομή για την Επικοινωνία
Δείχνω εδώ την κατηγορία Wire, η οποία είναι η επικοινωνία I2C στον πυρήνα μας Arduino, η οποία επιτρέπει επίσης στον διαστολέα να συνεργαστεί με τα Arduino Uno και Mega. Ωστόσο, το τελευταίο έχει ήδη αρκετούς IO. Ασχολούμαστε εδώ με τις διευθύνσεις του τσιπ, τον έλεγχο πρόσβασης, που είναι οι κωδικοί των καταχωρητών, καθώς και τα δεδομένα.
Βήμα 10: Πρόγραμμα
Το πρόγραμμά μας συνίσταται στην επικοινωνία του ESP32 με το MCP23016 για χρήση περισσότερων GPIO. Στη συνέχεια θα έχουμε ένα κουμπί και μερικές λυχνίες LED συνδεδεμένες στο MCP23016. Θα τα ελέγξουμε όλα χρησιμοποιώντας μόνο το δίαυλο I2C. Έτσι, θα χρησιμοποιηθούν μόνο δύο ακίδες ESP32. Μπορείτε να δείτε το κύκλωμα εικόνας παρακάτω στο βίντεο.
Βήμα 11: ESP01
Εδώ, εμφανίζω το Pinout του ESP01.
Βήμα 12: Τοποθέτηση ESP01
Σε αυτό το παράδειγμα, έχουμε το GPIO0 συνδεδεμένο στο SDA και το GPIO2 συνδεδεμένο στο SCL. Έχουμε επίσης έναν πίνακα ρελέ, έναν βομβητή και ένα LED. Στην άλλη θύρα, στο GP1.0, έχουμε ένα ακόμη LED με αντίσταση.
Βήμα 13: NodeMCU ESP-12E
Εδώ, έχουμε το Pinout του NodeMCU ESP-12E.
Βήμα 14: Τοποθέτηση NodeMCU ESP-12E
Σε αυτή την περίπτωση, η μόνη διαφορά από το πρώτο παράδειγμα είναι ότι έχετε συνδέσει το D1 και το D2 στο SDA και το SCL, αντίστοιχα.
Βήμα 15: WiFi NodeMCU-32S ESP-WROOM-32
Εδώ είναι το Pinout του WiFi NodeMCU-32S ESP-WROOM-32.
Βήμα 16: Κόμβος τοποθέτησης WiFiMCU-32S ESP-WROOM-32
Αυτή τη φορά, η κύρια διαφορά από τα άλλα δύο παραδείγματα είναι το κουμπί και τα τρία LED που αναβοσβήνουν. Εδώ, το SDA συνδέεται με το GPIO19, ενώ το SCL με το GPIO23.
Βήμα 17: Βιβλιοθήκες και μεταβλητές
Πρώτον, θα συμπεριλάβουμε το Wire.h, το οποίο είναι υπεύθυνο για την επικοινωνία i2c, καθώς και τη ρύθμιση της διεύθυνσης i2c του MCP23016. Δείχνω αρκετές εντολές, ακόμη και μερικές που δεν χρησιμοποιούμε σε αυτό το έργο.
#include // καθορίστε τη χρήση της βιβλιοθήκης Wire.h. // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE TO REGISTER RELATIONSHIP: Πίνακας: 1-3 του Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x0 // DATA PORT 0X0 // DATA PORT PORT REGISTER 1 #define OLAT0 0x02 // OUTPUT LATCH REGISTER 0 #define OLAT1 0x03 // OUTPUT LATCH REGISTER 1 #define IPOL0 0x04 // INPUT POLARITY PORT REGISTER 0 #define IPOL1 0x05 // INTERPORT 0T000 /I/O DIRECTION REGISTER 0 #define IODIR1 0x07 // I/O DIRECTION REGISTER 1 #define INTCAP0 0x08 // INTERRUPT CAPTURE REGISTER 0 #define INTCAP1 0x09 // INTERRUPT CAPTURE REGISTER 1 #0 ΕΓΓΡΑΦΗ 0 #define IOCON1 0x0B // I/O EXPANDER CONTROL REGISTER 1
Βήμα 18: Ρύθμιση
Εδώ έχουμε τις λειτουργίες για την προετοιμασία τεσσάρων διαφορετικών τύπων μικροελεγκτών. Ελέγχουμε επίσης τη συχνότητα, ρυθμίζουμε τα GPIO και ρυθμίζουμε τις ακίδες. Στο βρόχο, ελέγχουμε την κατάσταση του κουμπιού.
void setup () {Serial.begin (9600); καθυστέρηση (1000)? Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frequencia // configura o GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // configura o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); } void loop () {// verifica e o botão GP foi pressionado checkButton (GP1); } // βρόχος τερματισμού
Βήμα 19: ConfigurePort
Σε αυτό το βήμα, διαμορφώνουμε τη λειτουργία των ακίδων GPIO και προσδιορίζουμε τη λειτουργία των θυρών.
// configura o GPIO (GP0 ou GP1) // como parametro passamos: // port: GP0 ou GP1 // custom: INPUT para todos as portas do GP trabalharem como entrada // OUTPUT para todos as portas do GP trabalharem como saida/ / custom um valor de 0-255 indicando o modo das portas (1 = INPUT, 0 = OUTPUT) // ex: 0x01 ou B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, or restando como saida void configurePort (uint8_t θύρα, uint8_t custom) {if (custom == INPUT) {writeBlockData (port, 0xFF); } else if (custom == OUTPUT) {writeBlockData (θύρα, 0x00); } else {writeBlockData (θύρα, προσαρμοσμένο); }}
Βήμα 20: WriteBlockData & CheckButton
Εδώ, στέλνουμε δεδομένα στο MCP23016 μέσω του διαύλου i2c, ελέγχουμε την κατάσταση του κουμπιού και υποδεικνύουμε το επόμενο βήμα λαμβάνοντας υπόψη την κατάσταση του να πιεστείτε ή όχι.
// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registrador) // data: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (δεδομένα); Wire.endTransmission (); καθυστέρηση (10)? }
// verifica se o botão foi pressionado // parametro GP: GP0 ou GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // se botão pressionado, seta para HIGH ως portas GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}
Βήμα 21: ReadPin & ValueFromPin
Ασχολούμαστε εδώ με την ανάγνωση ενός συγκεκριμένου πείρου και την επιστροφή της τιμής bit στην επιθυμητή θέση.
// faz a leitura de um pino específico // pin: pino desejado (0-7) // gp: GP0 ou GP1 // retorno: 0 ou 1 uint8_t readPin (uint8_t pin, uint8_t gp) {uint8_t statusGP = 0; Wire.beginTransmission (MCPAddress); Wire.write (gp); Wire.endTransmission (); Wire.requestFrom (MCPAddress, 1); // ler do chip 1 byte statusGP = Wire.read (); επιστροφή τιμήςFromPin (pin, statusGP) } // retorna o valor do bit na posição desejada // pin: posição do bit (0-7) // statusGP: valor lido do GP (0-255) uint8_t valueFromPin (uint8_t pin, uint8_t statusGP) {return (statusGP & (0x0001 << καρφίτσα)) == 0; 0: 1; }
Βήμα 22: Πρόγραμμα ESP8266
Από εδώ, θα δούμε πώς δημιουργήθηκε το πρόγραμμα που χρησιμοποιήσαμε στο ESP-01 και στο nodeMCU ESP-12E, το οποίο μας επιτρέπει να καταλάβουμε πώς οι διαφορές μεταξύ τους είναι ελάχιστες.
Θα τροποποιήσουμε μόνο τη γραμμή του κατασκευαστή επικοινωνίας i2c, η οποία είναι η αρχική μέθοδος του αντικειμένου Wire.
Απλώς σχολιάστε τη γραμμή σύμφωνα με την πλάκα που πρόκειται να συντάξουμε.
// Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01
Ρύθμιση
Παρατηρήστε ότι ο κατασκευαστής εξακολουθεί να σχολιάζεται. Επομένως, μην σχολιάζετε σύμφωνα με τον πίνακα (ESP-01 ή nodeMCU ESP12-E).
void setup () {Serial.begin (9600); καθυστέρηση (1000)? // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frequencia // configura o GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // configura o GPIO1 como OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000001); }
Βρόχος
Στο βρόχο, αλλάζουμε τις ακίδες κάθε 1 δευτερόλεπτο. Έτσι, όταν το pin0 του GP0 είναι ενεργοποιημένο, οι ακίδες του GP1 είναι απενεργοποιημένες. Όταν το pin0 του GP1 είναι ενεργοποιημένο, οι καρφίτσες GP0 είναι απενεργοποιημένες.
void loop () {// seta o pino 7 έως GP0 como HIGH και osmais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); καθυστέρηση (1000)? // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta o pino 0 για GP1 como HIGH και os demais como LOW writeBlockData (GP1, B00000001); καθυστέρηση (1000)? } // βρόχος τερματισμού
Βήμα 23: ΣΗΜΑΝΤΙΚΟ
Οι μεταβλητές και η βιβλιοθήκη που χρησιμοποιούνται είναι οι ίδιες με αυτές του προγράμματος που κάναμε για το ESP32, καθώς και οι μέθοδοι configurePort και writeBlockData.
Βήμα 24: Αρχεία
Κατεβάστε τα αρχεία:
INO (ESP8266)
INO (ESP32)
Συνιστάται:
Σύνδεση επεξεργασίας και Arduino και Make 7 Segment και Servo GUI Controller: 4 βήματα
Connecting Processing and Arduino and Make 7 Segment and Servo GUI Controller: Για ορισμένα έργα που κάνατε πρέπει να χρησιμοποιήσετε το Arduino καθώς παρέχει μια εύκολη πλατφόρμα πρωτοτύπων, αλλά η εμφάνιση γραφικών σε σειριακή οθόνη του Arduino μπορεί να διαρκέσει πολύ και είναι ακόμη και δύσκολο να γίνει. Μπορείτε να εμφανίσετε γραφήματα στο Arduino Serial Monitor bu
MicroPython σε φθηνό $ 3 ESP8266 WeMos D1 Mini για 2x καταγραφή θερμοκρασίας, Wifi και στατικά για κινητά: 4 βήματα
MicroPython σε φθηνή τιμή $ 3 ESP8266 WeMos D1 Mini για 2x καταγραφή θερμοκρασίας, Wifi και κινητά στατιστικά: Με μικροσκοπικό φτηνό τσιπ / συσκευή ESP8266 μπορείτε να καταγράφετε δεδομένα θερμοκρασίας έξω, στο δωμάτιο, στο θερμοκήπιο, στο εργαστήριο, στο ψυγείο ή σε άλλα μέρη εντελώς δωρεάν. Αυτό το παράδειγμα θα χρησιμοποιήσουμε για την καταγραφή της θερμοκρασίας του χώρου ψύξης, εντός και εκτός. Η συσκευή θα είναι
Arduino και SIM900 GSM GPRS 3G Καταγραφή θερμοκρασίας και υγρασίας, Στατιστικά για κινητά: 4 βήματα
Arduino και SIM900 GSM GPRS 3G Καταγραφή θερμοκρασίας και υγρασίας, Στατιστικά για κινητά: Με το Arduino UNO R3, SIM900 Shield AND DHT22 μπορείτε να καταγράφετε δεδομένα θερμοκρασίας και υγρασίας έξω, στο δωμάτιο, στο θερμοκήπιο, στο εργαστήριο, στο ψυγείο ή σε άλλα μέρη εντελώς δωρεάν. Αυτό το παράδειγμα θα χρησιμοποιήσουμε για την καταγραφή θερμοκρασίας και υγρασίας δωματίου. Η συσκευή θα
ESP8266 NodeMCU Access Point (AP) για διακομιστή Web με αισθητήρα θερμοκρασίας DT11 και θερμοκρασία εκτύπωσης και υγρασία στο πρόγραμμα περιήγησης: 5 βήματα
ESP8266 NodeMCU Access Point (AP) για διακομιστή Ιστού με αισθητήρα θερμοκρασίας DT11 και θερμοκρασία εκτύπωσης και υγρασία στο πρόγραμμα περιήγησης: Γεια σας παιδιά στα περισσότερα έργα χρησιμοποιούμε το ESP8266 και στα περισσότερα έργα χρησιμοποιούμε το ESP8266 ως διακομιστή ιστού, ώστε να μπορείτε να έχετε πρόσβαση στα δεδομένα οποιαδήποτε συσκευή μέσω wifi με πρόσβαση στον διακομιστή ιστοσελίδων που φιλοξενείται από το ESP8266, αλλά το μόνο πρόβλημα είναι ότι χρειαζόμαστε έναν δρομολογητή εργασίας για
Ένδειξη θερμοκρασίας και υγρασίας και συλλογή δεδομένων με Arduino και επεξεργασία: 13 βήματα (με εικόνες)
Εμφάνιση θερμοκρασίας και υγρασίας και συλλογή δεδομένων με Arduino και επεξεργασία: Εισαγωγή: Πρόκειται για ένα έργο που χρησιμοποιεί έναν πίνακα Arduino, έναν αισθητήρα (DHT11), έναν υπολογιστή Windows και ένα πρόγραμμα επεξεργασίας (δωρεάν λήψη) για την εμφάνιση δεδομένων θερμοκρασίας, υγρασίας σε ψηφιακή και φόρμα γραφήματος, εμφάνιση ώρας και ημερομηνίας και εκτέλεση χρόνου αντίστροφης μέτρησης