
Passo 1 de 10
Localizar a camada antes de corrigir
Classifique sintomas pelo percurso da medição e escolha observações que diferenciem hipóteses antes de alterar a montagem ou o firmware.
Trilha de aprendizado · Nível 11 · Tutorial 9
Ao concluir, o aluno será capaz de investigar leituras incoerentes e falhas de comunicação, preservar a distinção entre dados válidos e inválidos e recuperar a aquisição sem esperas ou tentativas ilimitadas.
Localizar a camada antes de corrigir
Classifique sintomas pelo percurso da medição e escolha observações que diferenciem hipóteses antes de alterar a montagem ou o firmware. 2 min
Registrar evidências sem perturbar a aquisição
Registre evidências de aquisição de forma comparável, explícita e limitada para não perturbar a comunicação que está sendo investigada. 2 min
Distinguir problema elétrico de problema de amostragem
Escolha medições seguras para diferenciar saturação, referência incorreta e efeitos de amostragem. 2 min
Interpretar os indícios de UART, I2C e SPI
Relacione indícios de UART, I2C e SPI às verificações que realmente diferenciam suas causas. 3 min
Conferir os bytes antes de aceitar o valor
Compare bytes brutos, palavra montada e valor convertido para localizar erros de interpretação com vetores conhecidos. 3 min
Separar valor, validade e idade
Represente valor, validade e idade como informações independentes para não confundir zero, ausência e histórico. 3 min
Limitar esperas e novas tentativas
Defina tentativas com prazo, intervalo e encerramento explícito, sem esperas ou novas tentativas ilimitadas. 3 min
Confirmar a recuperação antes de retomar
Recupere a aquisição de modo controlado e retome a operação somente após uma nova leitura validada. 2 min
Planejar testes de falha sem danificar a montagem
Planeje uma falha de comunicação controlada, segura e reversível para verificar detecção, limite de tentativas e recuperação. 2 min
Concluir e documentar um diagnóstico completo
Aplique um roteiro completo de diagnóstico a registros de operação, falha e recuperação controlada. 2 min

Passo 1 de 10
Classifique sintomas pelo percurso da medição e escolha observações que diferenciem hipóteses antes de alterar a montagem ou o firmware.
Uma leitura estranha não aponta automaticamente para uma causa. Antes de mudar código, cabos ou parâmetros, localize em qual camada do percurso o problema pode ter surgido.
Use este mapa: alimentação e referência → sinal físico → configuração da interface → transação → interpretação do dado → valor apresentado.
Cada camada deixa indícios diferentes. O objetivo inicial não é adivinhar: é escolher a próxima observação que elimine possibilidades.

A investigação segue o mesmo caminho que os dados percorrem. Observe um ponto por vez.
Separe três coisas:
Um sintoma pode ter várias hipóteses. Portanto, evite mudar várias configurações ao mesmo tempo: se o resultado mudar, você não saberá qual alteração foi relevante.
Exemplo
Caso: um ADC apresenta repetidamente o código máximo.
Isso pode indicar, entre outras possibilidades:
O código máximo é o sintoma. Uma observação útil é comparar a tensão realmente presente na entrada com a referência aplicável. Ela ajuda a separar uma condição elétrica de uma possível falha na interpretação.
Uma escolha inicial prática:
“Transferir algo” não confirma, por si só, que o dado representa uma medição correta.
Dica
Ao escolher a próxima ação, prefira uma observação que produza resultados diferentes para hipóteses diferentes.
Por exemplo, diante de uma leitura I2C incoerente, alterar simultaneamente endereço, clock e fórmula de conversão mistura camadas. Em vez disso, primeiro verifique se a transação fornece a quantidade de bytes esperada; depois compare os bytes recebidos com o formato documentado; só então avalie a conversão.
Assim, cada passo reduz a incerteza sem criar novos efeitos difíceis de explicar.
Associe cada sintoma à camada que deve ser investigada primeiro. Considere que esta é apenas a primeira direção da investigação, não uma conclusão definitiva.
Faça as associações.
Toque em um item e depois no par correspondente.

Passo 2 de 10
Registre evidências de aquisição de forma comparável, explícita e limitada para não perturbar a comunicação que está sendo investigada.
Uma investigação útil registra o bastante para comparar tentativas, sem transformar o diagnóstico em uma nova fonte de falhas. Para cada operação, anote: interface e dispositivo/canal, instante, estado da transação, quantidade de bytes recebidos, bytes brutos e, somente se a resposta estiver completa e aceita, o valor convertido.
O estado explica o que ocorreu; os campos numéricos mostram a evidência. Exemplo: I2C MCP9808 t=1250 ms estado=PARCIAL n=1 bruto=0x01 valor=indisponível.
Não invente informação ausente. Se nenhum byte chegou, bytes brutos e valor convertido são indisponíveis. Se chegaram menos bytes que o esperado, registre apenas os bytes efetivamente recebidos e não converta a resposta.

Registre evidências observadas e marque explicitamente o que não foi recebido.
Compare uma referência conhecida como correta com a tentativa sob investigação. A comparação mostra em que ponto os registros deixam de ser equivalentes, sem concluir ainda qual correção será necessária.
| Campo | Operação conhecida correta | Tentativa com falha |
|---|---|---|
| Interface / alvo | I2C / 0x18 | I2C / 0x18 |
| Instante | 1250 ms | 2250 ms |
| Estado | COMPLETA | PARCIAL |
| Bytes recebidos | 2 de 2 | 1 de 2 |
| Bytes brutos | 0x01 0x90 | 0x01 |
| Valor convertido | 25,0 °C | indisponível |
Exemplo de publicação limitada: a aquisição pode continuar em seu ritmo; o monitor recebe apenas um resumo periódico ou um evento novo.
const unsigned long INTERVALO_LOG_MS = 1000;
unsigned long ultimoLogMs = 0;
unsigned int falhasDesdeUltimoLog = 0;
void publicarResumo(bool houveFalha, unsigned long agora) {
if (houveFalha) {
falhasDesdeUltimoLog++;
}
if (agora - ultimoLogMs >= INTERVALO_LOG_MS) {
Serial.print("falhas no intervalo: ");
Serial.println(falhasDesdeUltimoLog);
falhasDesdeUltimoLog = 0;
ultimoLogMs = agora;
}
}
Dica
A frequência de aquisição não precisa ser a frequência de publicação. Registre cada falha no estado interno, mas publique um resumo em intervalos definidos, com uma contagem de ocorrências. Mensagens curtas e limitadas reduzem o risco de encher buffers, atrasar o programa ou alterar o próprio sintoma investigado.
Complete a condição que limita a publicação do resumo. A aquisição e a contagem de falhas podem continuar fora desse bloco.
if (agora - ultimoLogMs >= ) {
Serial.print("falhas no intervalo: ");
Serial.println(falhasDesdeUltimoLog);
falhasDesdeUltimoLog = 0;
ultimoLogMs = agora;
}Qual conjunto de campos separa corretamente uma resposta ausente de uma resposta parcial e de uma resposta completa que gerou um valor?

Passo 3 de 10
Escolha medições seguras para diferenciar saturação, referência incorreta e efeitos de amostragem.
Um código ADC repetidamente em 0 ou no máximo não condena o conversor sozinho. Localize primeiro o ponto em que a evidência deixa de ser coerente:
Entrada próxima de 0 V pode justificar código baixo; entrada próxima ou acima da referência pode justificar saturação alta. Se a tensão estiver dentro da faixa esperada, mas o código permanecer extremo, ainda há hipóteses sobre conexão, canal, referência ou aquisição a investigar.

Compare grandezas da mesma cadeia antes de atribuir a causa ao ADC.
Dica
Evite mudar referência, canal, taxa e fiação ao mesmo tempo. Uma observação por vez reduz as hipóteses concorrentes e preserva o significado do resultado.
Uma tensão contínua conhecida e compatível com a entrada é um teste de separação útil. Ela não precisa ser “perfeita”: basta conhecer seu nível por uma medição segura e mantê-lo estável durante a comparação.
Se essa tensão produz um código coerente, a cadeia de aquisição ganha evidência favorável; investigue então o sinal variável, sua faixa ou sua amostragem. Se ainda produz resultado incoerente, concentre a investigação na entrada, referência, canal ou configuração de aquisição.
Exemplo
Caso: o ADC de 10 bits usa referência medida de 4,90 V. Uma entrada contínua medida em 2,45 V deveria resultar aproximadamente em metade da escala: código 512. O registro mostra 511 repetidamente.
Essa evidência favorece o funcionamento da cadeia nessa condição. Ela não prova que um sinal variável será adquirido sem aliasing ou que a taxa de amostragem é adequada.
| Evidência observada | Hipótese mais compatível | Próxima observação |
|---|---|---|
| Entrada próxima de 0 V e código 0 | Nível baixo real ou ligação ao terra | Confirmar tensão no pino e terra comum |
| Entrada próxima de Vref e código máximo | Saturação na faixa | Verificar se o sinal excede a faixa |
| 2,45 V com Vref de 4,90 V e código 511 | Cadeia coerente nesse teste | Investigar o sinal variável |
| Tensão estável, mas código oscila muito | Aquisição, referência ou ruído | Medir referência e observar o sinal |
| Evidência observada | Hipótese mais compatível | Próxima observação |
|---|---|---|
| Entrada próxima de 0 V e código 0 | Nível baixo real ou ligação ao terra | Confirmar tensão no pino e terra comum |
| Entrada próxima de Vref e código máximo | Saturação na faixa | Verificar se o sinal excede a faixa |
| 2,45 V com Vref de 4,90 V e código 511 | Cadeia coerente nesse teste | Investigar o sinal variável |
| Tensão estável, mas código oscila muito | Aquisição, referência ou ruído | Medir referência e observar o sinal |
O multímetro é apropriado para comparar níveis contínuos, como entrada e referência. Porém, seu valor médio não revela necessariamente pulsos, bordas, ruído rápido nem a integridade de uma comunicação digital.
Quando a hipótese depende de variação no tempo, o osciloscópio — se disponível — permite observar nível, variação e bordas. Compare a taxa de amostragem registrada com o comportamento esperado do sinal; uma variação aparente pode ser aliasing, mas exige evidência adicional.
Atenção
Faça medições somente em montagens de baixa tensão. Ao usar um osciloscópio aterrado, conecte a garra de terra apenas a um terra compatível da montagem. Nunca remova o aterramento de proteção do instrumento para “resolver” uma conexão.
Sem instrumentos, analise os casos e registros fornecidos no tutorial: a conclusão deve indicar o que a evidência permite — e o que ela ainda não permite afirmar.
Uma leitura de multímetro mostra 2,50 V estáveis na entrada de um ADC. Os códigos digitais registrados alternam de modo aparentemente irregular. A aplicação amostra um sinal que pode variar rapidamente.
Qual é o próximo teste mais informativo?
Escreva pelo menos 80 caracteres (0/80).

Passo 4 de 10
Relacione indícios de UART, I2C e SPI às verificações que realmente diferenciam suas causas.
Um indício de comunicação só ganha significado dentro da interface e da fase em que apareceu. Antes de mudar configuração ou fiação, registre o sintoma e escolha uma observação que separe hipóteses.

O mesmo resultado aparente exige verificações diferentes em UART, I2C e SPI.
Use o sintoma para escolher a próxima verificação, não para fechar o diagnóstico cedo demais.
| Interface e sintoma | Hipóteses iniciais | Próxima verificação |
|---|---|---|
| UART: caracteres sem sentido | Taxa ou enquadramento incompatíveis | Comparar a configuração nos dois extremos |
| UART: mensagem truncada | Perda, delimitador ausente ou prazo encerrado | Conferir bytes recebidos e terminador esperado |
| I2C: NACK inesperado | Endereço, fase, alimentação ou conexão | Localizar a fase do NACK antes de concluir a causa |
| I2C: menos bytes que o esperado | Resposta parcial | Rejeitar a leitura antes de montar ou converter |
| SPI: resultado constante | CS, modo, clock, ordem dos bits ou entrada legítima | Conferir CS e parâmetros; comparar sinais quando disponível |
Dica
Em uma leitura I2C normal de 2 bytes, o controlador confirma o primeiro byte com ACK porque ainda deseja outro byte. Após receber o segundo, emite NACK para encerrar a leitura. Esse NACK final previsto pelo protocolo não é falha.
Um NACK inesperado precisa ser localizado: ocorreu ao selecionar o endereço, ao enviar o registrador ou em outra fase? A fase orienta a conferência de endereço, alimentação e conexão.
Há outro caso: endereço reconhecido, mas apenas 1 dos 2 bytes esperados chega; o controlador pode emitir NACK após esse único byte para encerrar antecipadamente. O NACK pode ser um encerramento válido, mas a contagem de 1 de 2 torna a resposta inválida. Não monte nem converta dados parciais.
Exemplo
Associe cada indício à próxima verificação mais útil. Considere as associações como direção de investigação, não como confirmação definitiva da causa.
Associe cada indício à próxima verificação mais útil. Considere as associações como direção de investigação, não como confirmação definitiva da causa.
Escreva pelo menos 80 caracteres (0/80).
Uma rotina I2C solicitou 2 bytes. O endereço foi reconhecido, mas somente o primeiro byte chegou. Para encerrar a tentativa, o controlador emitiu NACK após esse byte. Qual conclusão é correta?

Passo 5 de 10
Compare bytes brutos, palavra montada e valor convertido para localizar erros de interpretação com vetores conhecidos.
Uma resposta já validada na transação ainda precisa passar por três conferências antes de ser aceita como medida:
Use uma resposta conhecida e compare cada etapa lado a lado. A primeira divergência orienta a investigação:
Uma resposta completa e um número plausível não provam, isoladamente, que a interpretação está certa. Aqui, considere que a quantidade de bytes já foi validada: o foco é não atribuir ao transporte um erro que está na conversão.

Compare bytes, palavra e valor: a primeira etapa diferente localiza a categoria do erro.
Exemplo
No registrador de temperatura do MCP9808, use vetores conhecidos para testar a interpretação sem depender de uma nova medição física.
Vetor positivo: bytes 0x01 0x90 formam 0x0190. Os 12 bits de temperatura são 0x190 = 400. Com escala de 1/16 °C, o resultado é 25,0 °C.
Vetor negativo: bytes 0x1F 0x60 formam 0x1F60. Os 12 bits de temperatura são 0xF60 = 3936, ou 246,0 °C antes do ajuste. Como o bit 0x1000 está ativo, subtraia 256,0 °C: o resultado é −10,0 °C.
O bit de sinal não pede para negar diretamente os 12 bits. No formato do sensor, a conversão é: valor de 12 bits dividido por 16 e, se o bit 0x1000 estiver ativo, menos 256 °C.
A inversão dos bytes muda a palavra antes de qualquer cálculo de escala. Ela não é um problema de transporte se os bytes brutos coincidem com o registro recebido.
| Bytes brutos | Palavra montada | Cálculo | Resultado esperado |
|---|---|---|---|
| 0x01 0x90 | 0x0190 | 400 / 16 | 25,0 °C |
| 0x1F 0x60 | 0x1F60 | 3936 / 16 − 256 | −10,0 °C |
| 0x01 0x90 invertidos | 0x9001 | 1 / 16 − 256 | −255,9375 °C |
A montagem da palavra e a conversão para temperatura são etapas distintas. Os sufixos .0f impedem divisão inteira e preservam a parte fracionária.
float interpretarTemperatura(uint8_t msb, uint8_t lsb) {
uint16_t word = ((uint16_t)msb << 8) | lsb;
float temperaturaC = (word & 0x0FFF) / 16.0f;
if (word & 0x1000) {
temperaturaC -= 256.0f;
}
return temperaturaC;
}Complete a conversão. Ela deve retornar 25,0 para 0x01 0x90 e −10,0 para 0x1F 0x60. Os bytes já foram recebidos completos; avalie apenas a interpretação.
float interpretarTemperatura(uint8_t msb, uint8_t lsb) {
uint16_t word = ((uint16_t)msb << 8) | lsb;
float temperaturaC = (word & ) / ;
if (word & 0x1000) {
temperaturaC -= ;
}
return temperaturaC;
}O registro mostra bytes brutos 0x01 0x90, iguais ao vetor de 25,0 °C. Porém, o firmware registra palavra 0x9001 antes de calcular a temperatura. Qual é a causa mais diretamente indicada?

Passo 6 de 10
Represente valor, validade e idade como informações independentes para não confundir zero, ausência e histórico.
Uma leitura não é apenas um número. Para apresentá-la com segurança, mantenha três informações separadas:
Assim, 0 continua sendo uma medição possível. Ele não precisa significar “não recebi nada”.

O mesmo valor numérico pode aparecer em estados diferentes; a validade e a idade dão o contexto.
Use o limite de idade adequado à aplicação. Por exemplo, uma amostra pode ser considerada atual por até 2 segundos. A idade é calculada a partir da última leitura aceita, não do início da tentativa atual.
A tentativa em andamento ou recém-falha tem seu próprio estado. Ela não apaga, não valida novamente e não rejuvenesce a amostra anterior. Portanto, uma falha às 11 900 ms não torna atual uma amostra aceita às 9 000 ms.
Considere agora = 12000 ms e um limite de idade de 2000 ms.
| Situação | valor | amostraValida | instanteAceito | Apresentação correta |
|---|---|---|---|---|
| Nenhuma leitura aceita | — | false | — | Ausente |
| Leitura aceita às 9000 ms | 0 | true | 9000 ms | Antiga: histórico 0 |
| Leitura aceita às 10800 ms | 0 | true | 10800 ms | Atual: 0 |
| Tentativa falhou às 11900 ms; última aceita às 9000 ms | 27,4 | true | 9000 ms | Antiga: histórico 27,4 |
Trecho para estudar: valor, amostraValida e instanteAceito só mudam depois que a resposta passa pelos critérios de aceitação. O estado da tentativa muda separadamente.
float valor = 0.0f;
bool amostraValida = false;
unsigned long instanteAceito = 0;
enum EstadoTentativa { AGUARDANDO, ACEITA, FALHOU };
EstadoTentativa estado = AGUARDANDO;
void tratarResposta(bool respostaAceita, float valorLido) {
if (respostaAceita) {
valor = valorLido;
amostraValida = true;
instanteAceito = millis();
estado = ACEITA;
} else {
estado = FALHOU;
// Não alterar valor, amostraValida ou instanteAceito.
}
}
bool amostraAtual(unsigned long agora) {
const unsigned long limiteIdade = 2000;
return amostraValida && (agora - instanteAceito <= limiteIdade);
}Dica
Após uma falha, mantenha o último valor apenas se ele for útil como histórico identificado. Mostre, por exemplo, “última leitura: 27,4 (antiga)”; não mostre “27,4” como se fosse uma leitura recém-obtida.
Se nenhuma amostra foi aceita, apresente “sem dado” em vez de inventar 0.
Complete o caminho de aceitação de uma leitura. O bloco else deve preservar a última amostra aceita.
if (respostaAceita) {
valor = ;
amostraValida = ;
instanteAceito = ;
estado = ACEITA;
} else {
estado = FALHOU;
}Relacione cada condição à classificação correta.
Toque em um item e depois no par correspondente.

Passo 7 de 10
Defina tentativas com prazo, intervalo e encerramento explícito, sem esperas ou novas tentativas ilimitadas.
Uma operação de leitura precisa terminar em sucesso ou em falha explícita. Defina quatro elementos:
Use uma convenção sem ambiguidade: MAX_TENTATIVAS = 3 significa, no máximo, as tentativas 1, 2 e 3. Se a terceira não for aceita, a operação termina em FALHOU.
O contador pertence à operação em curso. Ele é zerado quando um evento explícito solicita uma nova leitura, e não a cada passagem pelo loop(). Sucesso ou falha encerram a operação atual.

A primeira tentativa começa com o evento; o intervalo existe somente entre tentativas.
Atenção
Os limites são independentes:
Um laço externo com três repetições não ajuda se a primeira chamada de comunicação puder esperar indefinidamente por bytes. O prazo só é real quando a função chamada pode retornar: por exemplo, porque a API documenta um timeout configurável ou porque a arquitetura inicia a solicitação e depois consulta seu estado.
Não presuma que toda biblioteca oferece isso. Se uma chamada síncrona não tem timeout documentado, não a apresente como espera limitada nem construa sobre ela uma política não bloqueante.
Neste exemplo, a comunicação segue uma arquitetura por consulta: iniciarConsulta() dispara a solicitação e retorna rapidamente; consultarResposta() informa depois se ela está pendente, completa ou inválida.
A primeira tentativa começa diretamente quando ocorre o evento. Somente depois de uma tentativa inválida ou vencida é aplicado INTERVALO_MS antes da próxima. Assim, o loop() continua atendendo as demais tarefas entre consultas e entre tentativas.
Este modelo exige que a interface, a biblioteca ou uma camada já existente no firmware realmente ofereça esse comportamento. Em uma API exclusivamente síncrona, use apenas um timeout documentado e reconheça que a chamada ocupará o processador até retornar.
Esqueleto para estudar. Como consultarResposta() não informa o instante em que a resposta chegou, uma resposta observada depois do prazo é rejeitada. O prazo é verificado antes de aceitar COMPLETA.
enum EstadoLeitura {
OCIOSA,
EM_ANDAMENTO,
ESPERANDO_REPETICAO,
FALHOU
};
enum ResultadoConsulta { PENDENTE, COMPLETA, INVALIDA };
const byte MAX_TENTATIVAS = 3; // inclui a primeira
const unsigned long PRAZO_MS = 40;
const unsigned long INTERVALO_MS = 200;
EstadoLeitura estado = OCIOSA;
byte tentativas = 0;
unsigned long inicioTentativa = 0;
unsigned long inicioIntervalo = 0;
void iniciarProximaTentativa(unsigned long agora) {
tentativas++;
iniciarConsulta(); // deve retornar rapidamente
inicioTentativa = agora;
estado = EM_ANDAMENTO;
}
void solicitarNovaLeitura(unsigned long agora) {
if (estado != OCIOSA && estado != FALHOU) return;
tentativas = 0;
iniciarProximaTentativa(agora); // tentativa 1, sem intervalo inicial
}
void agendarOuFalhar(unsigned long agora) {
if (tentativas >= MAX_TENTATIVAS) {
estado = FALHOU;
} else {
inicioIntervalo = agora;
estado = ESPERANDO_REPETICAO;
}
}
void atualizarLeitura(unsigned long agora) {
if (estado == ESPERANDO_REPETICAO &&
agora - inicioIntervalo >= INTERVALO_MS) {
iniciarProximaTentativa(agora);
}
if (estado != EM_ANDAMENTO) return;
// Sem instante de chegada fornecido pela API, não aceite após o prazo.
if (agora - inicioTentativa >= PRAZO_MS) {
agendarOuFalhar(agora);
return;
}
ResultadoConsulta resultado = consultarResposta();
if (resultado == COMPLETA) {
aceitarNovaAmostra();
estado = OCIOSA;
} else if (resultado == INVALIDA) {
agendarOuFalhar(agora);
}
}
Dica
A ordem da verificação temporal é importante. Neste modelo, COMPLETA significa apenas “a resposta foi observada agora”; ela não traz o instante em que chegou. Por isso, se o prazo já venceu quando o programa consulta o resultado, a resposta é rejeitada e a política segue para repetição ou falha.
Uma API que informe o instante de conclusão pode permitir outro critério: aceitar somente se esse instante estiver dentro do prazo. Sem essa evidência, não afirme que uma resposta tardia foi recebida a tempo.
Complete o trecho derivado da máquina de estados. As lacunas devem: liberar a repetição após o intervalo, detectar o prazo da tentativa atual, reconhecer o limite total e realmente agendar a próxima tentativa quando ainda houver uma disponível.
Complete as três constantes. O caminho else já mostra o agendamento efetivo da próxima tentativa.
if (estado == ESPERANDO_REPETICAO &&
agora - inicioIntervalo >= ) {
iniciarProximaTentativa(agora);
}
if (estado == EM_ANDAMENTO &&
agora - inicioTentativa >= ) {
if (tentativas >= ) {
estado = FALHOU;
} else {
inicioIntervalo = agora;
estado = ESPERANDO_REPETICAO;
}
}Qual política ainda pode repetir indefinidamente, apesar de declarar MAX_TENTATIVAS = 3?
Qual situação ainda pode bloquear o firmware, mesmo com um contador externo de três tentativas?

Passo 8 de 10
Recupere a aquisição de modo controlado e retome a operação somente após uma nova leitura validada.
Uma recuperação começa pela camada já diagnosticada. Reiniciar uma interface pode ser apropriado diante de uma falha de transação, mas não corrige uma máscara, ordem de bytes, sinal ou escala errada no firmware.
Antes de agir, encerre a tentativa que falhou. Bytes parciais e respostas chegadas depois do prazo não podem ser promovidos a resposta da próxima tentativa. Trate ou descarte esses dados conforme as regras da interface e preserve a última amostra aceita com seu instante original.

Uma ação na comunicação não corrige, por si só, um erro de interpretação do dado.
Dica
Restaure uma configuração ou reinicialize um dispositivo somente pelo procedimento documentado para o dispositivo e a biblioteca usada. Não invente pulsos, desligamentos ou comandos para “forçar” uma resposta.
Depois da ação, faça outra operação com prazo por tentativa, limite total de tentativas e estado final explícito. A recuperação também precisa terminar: não transforme falhas repetidas em um ciclo infinito de reinicializações.
Exemplo
Uma leitura I2C esperava 2 bytes, mas recebeu somente 1. A tentativa foi encerrada, o byte isolado não foi convertido e a última temperatura aceita permaneceu identificada como histórico, com seu instante original.
Foi executado o procedimento documentado de reinicialização da interface. Em seguida, a aplicação inicia uma nova leitura, sujeita ao prazo e ao limite de tentativas definidos. A reinicialização, isoladamente, ainda não é evidência de recuperação.
Qual evidência permite que a aplicação retome a operação normal?
Organize o procedimento para uma tentativa que não recebeu todos os bytes esperados. Considere que já existe uma camada diagnosticada e uma ação de recuperação documentada para ela.
Coloque as ações na ordem de uma recuperação controlada.
Após uma reinicialização documentada, a tentativa 1 vence o prazo. A tentativa 2 recebe apenas 1 dos 2 bytes esperados. O limite total da recuperação foi atingido. Qual decisão está correta?
Atenção
A regra de retomada é: encerrar a tentativa anterior → ação adequada à camada → nova verificação limitada → nova leitura válida ou falha explícita.
Não trate a reinicialização, uma resposta parcial ou uma resposta tardia como confirmação de recuperação. Se houver valor anterior, apresente-o como histórico identificado, nunca como leitura atual.

Passo 9 de 10
Planeje uma falha de comunicação controlada, segura e reversível para verificar detecção, limite de tentativas e recuperação.
Um teste de falha útil é reversível: ele cria uma condição prevista, permite observar a reação do firmware e permite restaurar a operação sem expor a montagem a uma condição elétrica perigosa.
Planeje antes de testar:
Mude somente uma variável por teste. Assim, o resultado pode sustentar ou enfraquecer uma hipótese específica.

O teste deve verificar tanto a detecção da falha quanto a aceitação de uma nova amostra após restaurar a resposta.
Você pode testar a lógica sem desconectar nada. Considere este caso apresentado:
Durante o teste, a sequência simulada é: nenhuma resposta; 1 byte; nenhuma resposta. Depois, a resposta normal de 2 bytes é restaurada.
Previsão da sequência
| Etapa | Resposta recebida | Efeito esperado |
|---|---|---|
| Tentativa 1 | 0 bytes até 50 ms | Timeout; não atualizar valor nem instante |
| Tentativa 2 | 1 byte | Rejeitar como incompleta; não converter |
| Tentativa 3 | 0 bytes até 50 ms | Encerrar em falha explícita |
| Após restaurar | 2 bytes válidos | Aceitar nova amostra e renovar instante |
Atenção
Em uma montagem própria, prefira testes lógicos controlados pelo firmware ou a análise do caso apresentado. Se for necessário alterar uma conexão para simular ausência de resposta, faça isso somente com todas as fontes desligadas: USB, fonte externa, bateria e qualquer alimentação vinda de outro equipamento.
Antes de religar, confira a conexão conforme a documentação do módulo. Após restaurá-la, a recuperação só foi confirmada se uma nova leitura válida for aceita dentro dos limites definidos.
Atenção
Não crie falhas por curto-circuito, sobretensão ou união de duas saídas que possam dirigir níveis opostos. Esses métodos podem danificar componentes e não são necessários para verificar timeout, rejeição de resposta incompleta ou recuperação.
Registre também a origem da evidência: “sequência analisada no tutorial” não é o mesmo que “medição realizada na minha montagem”. Uma observação local pode depender da versão da biblioteca, do dispositivo e das condições da montagem.
Usando o caso apresentado, descreva um registro curto do teste. Inclua: a hipótese, a alteração única aplicada, o que deve acontecer com o valor e o instante da última amostra durante as três tentativas, o estado final esperado e a evidência que confirmaria a recuperação após restaurar a resposta.
Não é preciso possuir equipamento: baseie-se na sequência fornecida.
Escreva pelo menos 180 caracteres (0/180).

Passo 10 de 10
Aplique um roteiro completo de diagnóstico a registros de operação, falha e recuperação controlada.
Uma aplicação usa um MCP9808. Às 10:00:00, a última leitura aceita foi 25,00 °C. Às 10:00:10, uma nova aquisição falhou: cada tentativa recebeu NACK na seleção do endereço; portanto, não houve bytes de temperatura nem conversão válida.
A política já definida permite 3 tentativas no total (a inicial mais 2 novas), com prazo de 20 ms por tentativa e intervalo de 200 ms. Depois do terceiro NACK, o sistema entra em falha explícita.
A conexão do módulo foi conferida e restaurada somente com todas as fontes desligadas. Após religar, uma leitura nova foi aceita às 10:00:14. Seu trabalho é transformar esses fatos em uma conclusão rastreável — sem chamar a amostra de 10:00:00 de leitura atual durante a falha.

A falha atual não renova nem invalida silenciosamente a marca de tempo da última amostra aceita.
Compare os registros pelo que eles realmente comprovam. NACK durante a seleção do endereço é um indício de transação sem resposta naquele ponto; ele não autoriza inventar bytes, converter um valor ou substituir a ausência por zero.
Registro resumido do caso. Os traços indicam informação indisponível, e não valor zero.
| Instante | Evento | Bytes brutos | Valor | Decisão |
|---|---|---|---|---|
| 10:00:00 | Leitura I2C OK | 01 90 | 25,00 °C | Aceita; última amostra |
| 10:00:10 | Tentativas 1, 2 e 3: NACK | — | — | Falha explícita após limite |
| 10:00:12 | Conexão restaurada sem alimentação | — | — | Ação segura; ainda não confirma recuperação |
| 10:00:14 | Leitura I2C OK | 01 91 | 25,06 °C | Aceita; atualiza amostra e instante |
A intervenção é uma hipótese testada, não a prova final. A evidência de recuperação é a nova transação completa aceita às 10:00:14. Durante a falha, a aplicação pode preservar 25,00 °C como histórico identificado, mas deve informar que a última atualização aceita foi às 10:00:00 e que a tentativa atual falhou.
Escreva um registro de diagnóstico de 5 a 8 linhas para o caso. Inclua: sintoma; hipótese compatível com os NACKs; evidência que a sustenta; teste/intervenção segura; resultado; limite de tentativas; tratamento da amostra de 10:00:00; e critério que permitiu retomar a operação.
Não é necessário inventar uma causa elétrica específica: registre o que os dados permitem concluir.
| Etapa | Pergunta de controle |
|---|---|
| Sintoma | O que foi observado, sem atribuir causa? |
| Hipótese | Em qual camada a causa pode estar? |
| Evidência | Que observação diferencia hipóteses? |
| Teste seguro | Qual alteração única e reversível será feita? |
| Limite | Quando a tentativa termina em falha explícita? |
| Retomada | Qual nova leitura válida confirma a recuperação? |
Resumo
Parabéns! Você concluiu: Diagnóstico de aquisição e falhas de comunicação
Você concluiu este nível!
Agora você vai iniciar: Fontes e acionamento de cargas
Dimensionamento de reguladores linearesDimensionar a faixa de operação de um regulador linear, verificando se a tensão de entrada, a corrente de carga e a dissipação permitem manter a saída com margem térmica.Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks