Arduino: Comunicação IIC
📁 Estrutura de arquivos
IIC_Voice/
├── IIC_Voice.ino # Programa principal
├── bsp_iic.hpp # Arquivo de cabeçalho (endereços e declarações de funções)
├── bsp_iic.cpp # Arquivo de implementação
└── README.md # Este tutorial🔌 Conexão de hardware

🔧 Compilação e upload
Primeiro passo: abrir o Arduino IDE
Abra o arquivo
IIC_Voice.inoSelecione o modelo da sua placa de desenvolvimento (como o Arduino Uno)
Selecione a porta serial correspondente
Segundo passo: compilar e enviar
Clique no botão ✔️ para compilar
Clique no botão ➡️ para enviar à placa de desenvolvimento
📡 Teste da porta serial
Abrir o monitor serial no Arduino IDE
Taxa de transmissão: 115200
Caractere de fim de linha: Nenhum
Saída esperada
Após energizar, você deve ver:
IIC Voice Module Initialized
Diga a palavra de ativação e a palavra de comando ao módulo e o ID correspondente será exibido:
ID: 1
ID: 2
ID: 10📚 Mapeamento de registradores
📚 Descrição da interface BSP
IIC_Init()
void IIC_Init(void);Função: inicializa o barramento I2C
Exemplo:
void setup() {
IIC_Init();
}IIC_ReadCommand()
int IIC_ReadCommand(void);Função: lê o ID do comando reconhecido pelo módulo de voz
Valor de retorno:
0- nenhum comando reconhecido1~254- ID do comando-1- erro de comunicação
Exemplo:
int id = IIC_ReadCommand();
if (id > 0) {
Serial.print("识别到命令: ");
Serial.println(id);
}IIC_SetPassiveVoice()
void IIC_SetPassiveVoice(uint8_t voiceID);Função: define a voz de reprodução passiva
Parâmetros:
0x00- tipo de frase de reprodução passiva
Exemplo:
IIC_SetPassiveVoice(0x00);
delay(200);IIC_SetFunctionVoice()
void IIC_SetFunctionVoice(uint8_t voiceID);Função: define a voz de reprodução das palavras de função
Parâmetros:
0x00- tipo de frase de reprodução de palavras de função
Exemplo:
IIC_SetFunctionVoice(0x00);
delay(200);IIC_SetCommandVoice()
void IIC_SetCommandVoice(uint8_t voiceID);Função: define a voz de reprodução das palavras de comando
Parâmetros:
0x00- tipo de frase de reprodução de palavras de comando
Exemplo:
IIC_SetCommandVoice(0x00);
delay(200);🎯 Descrição da lógica do programa principal
void setup() {
Serial.begin(115200);
IIC_Init();
Serial.println("IIC Voice Module Initialized");
IIC_SetCommandVoice(0x00); // Ao energizar, reproduzir a voz das palavras de comando
delay(200);
}
void loop() {
int commandId = IIC_ReadCommand();
if (commandId >= 0) {
// Filtrar valores inválidos para evitar saída duplicada
if (commandId != 0 && commandId != 255 && commandId != lastCommandId) {
Serial.print("ID: ");
Serial.println(commandId);
lastCommandId = commandId;
// Exemplo: controlar a reprodução conforme o comando reconhecido
if (commandId == 1) {
IIC_SetCommandVoice(0x00); // Comando 1 reconhecido; reproduzir a voz das palavras de comando
} else if (commandId == 2) {
IIC_SetCommandVoice(0x00); // Comando 2 reconhecido; reproduzir a voz das palavras de comando
}
} else if (commandId == 0 || commandId == 255) {
if (lastCommandId != 0) {
lastCommandId = 0; // Redefinir o estado
}
}
} else {
Serial.println("IIC Read Error");
delay(1000);
}
delay(50);
}🔍 Solução de problemas
Q1: A porta serial mostra apenas "IIC Read Error"
Possíveis causas:
Cabeamento incorreto ou não conectado
Módulo sem alimentação
Endereço I2C incorreto
Solução:
Verifique se SDA/SCL estão invertidos
Verifique se o GND está aterrado em comum
Verifique se a alimentação de 5V está normal
Use um programa de varredura I2C para confirmar o endereço do dispositivo
Q2: Nenhuma saída
Possíveis causas:
Taxa de transmissão da porta serial incorreta
O módulo não foi ativado
Solução:
Confirme se a taxa de transmissão da porta serial é 115200
Primeiro diga a palavra de ativação, depois a palavra de comando
Q3: Saída de "ID: 255" ou "ID: 0"
Observação: isso é normal
0= nenhum comando reconhecido255= nenhum novo dado
Esses valores já são filtrados no código, por isso normalmente não são exibidos. Se você vir essa saída, significa que o código não está em vigor.
💡 Vantagens da arquitetura BSP
Camadas de código bem definidas
bsp_iic.hpp - contém apenas as declarações, não a implementação
bsp_iic.cpp - detalhes concretos da implementação
IIC_Voice.ino - trata apenas da lógica de negócio
Fácil de portar
Se você trocar para outra plataforma (como STM32 ou ESP32), basta modificar a implementação de bsp_iic.cpp; o programa principal não precisa ser alterado.
Fácil de manter
As alterações no código relacionado ao I2C ficam apenas em bsp_iic.cpp; uma única alteração vale em todos os lugares.
🚀 Exemplos de funções estendidas
Exemplo 1: acionar diferentes reproduções conforme o comando
if (commandId == 1) {
IIC_SetCommandVoice(0x00); // Reproduzir palavras de comando
} else if (commandId == 2) {
IIC_SetFunctionVoice(0x00); // Reproduzir palavras de função
} else if (commandId == 3) {
IIC_SetPassiveVoice(0x00); // Reproduzir voz passiva
}Exemplo 2: controlar o LED
if (commandId == 10) {
digitalWrite(LED_PIN, LOW); // Apagar a luz
IIC_SetCommandVoice(0x00); // Reproduzir confirmação
}Exemplo 3: controlar o motor
if (commandId == 11) {
motor_stop();
IIC_SetCommandVoice(0x00); // Reproduzir confirmação
}
