#include <Wire.h>
// Endereço I2C do MCP23017
#define MCP23017_ADDRESS 0x20
// Registradores do MCP23017
#define IODIRA 0x00 // I/O DIRECTION REGISTER A
#define IODIRB 0x01 // I/O DIRECTION REGISTER B
#define GPIOA 0x12 // PORT A
#define GPIOB 0x13 // PORT B
#define OLATA 0x14 // OUTPUT LATCH REGISTER A (Estado dos pinos de saída A)
#define OLATB 0x15 // OUTPUT LATCH REGISTER B (Estado dos pinos de saída B)
void setup() {
Wire.begin(); // Inicia a comunicação I2C
pinMode(21, OUTPUT); // SDA
pinMode(22, OUTPUT); // SCL
// Configura metade dos pinos como saída e metade como entrada
mcp23017Setup(IODIRA, 0x0F); // Primeiros 4 pinos como saída, últimos 4 como entrada
mcp23017Setup(IODIRB, 0xF0); // Primeiros 4 pinos como entrada, últimos 4 como saída
}
void loop() {
// Escreve nível lógico alto no pino selecionado e depois todos para baixo
writeHighAndTurnOff(0); // Exemplo para o primeiro pino
// Lê e imprime o estado dos pinos de entrada
readAndPrintInputs();
delay(1000); // Espera 1 segundo
}
void mcp23017Setup(byte reg, byte value) {
Wire.beginTransmission(MCP23017_ADDRESS);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
}
void writeHighAndTurnOff(byte pin) {
mcp23017Write(GPIOA, 1 << pin); // Escreve nível lógico alto no pino selecionado
delay(1000); // Espera 1 segundo
mcp23017Write(GPIOA, 0x00); // Muda todos os pinos para baixo
}
void mcp23017Write(byte reg, byte value) {
Wire.beginTransmission(MCP23017_ADDRESS);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
}
void readAndPrintInputs() {
Wire.beginTransmission(MCP23017_ADDRESS);
Wire.write(GPIOB); // Define o registrador GPIOB para leitura
Wire.endTransmission();
Wire.requestFrom(MCP23017_ADDRESS, 1); // Solicita 1 byte de dados
if(Wire.available()) {
byte inputs = Wire.read();
for (int i = 0; i < 8; i++) {
if (inputs & (1 << i)) {
Serial.print("Pino ");
Serial.print(i);
Serial.println(" está com nível lógico alto.");
}
}
}
}