// SPDX-License-Identifier: MIT // Entrada digital e entrada analógica no mesmo sketch (Arduino Uno) // // Um botão escolhe o que a Serial mostra: o número cru do conversor ou a tensão em volts. // Junta as duas formas de ler o mundo: a pergunta de sim ou não do botão e a medida // contínua do trimpot. // // Ligação: // Botão: um lado no pino 2, o outro no GND (INPUT_PULLUP: solto = HIGH, apertado = LOW). // Trimpot de 10 kΩ: pontas em 5V e GND, cursor em A1. const int PINO_BOTAO = 2; const int PINO_TRIMPOT = A1; const float TENSAO_REFERENCIA = 5.0; const float DEGRAUS = 1024.0; const unsigned long ESPERA_REPIQUE_MS = 30; // o contato quica alguns milissegundos ao fechar E ao abrir const unsigned long INTERVALO_MS = 200; // ritmo das linhas na Serial bool mostrarVolts = false; // começa mostrando o número cru bool estadoEstavel = HIGH; // último estado aceito do botão (com pull-up, o repouso é HIGH) bool ultimaLeitura = HIGH; // última leitura crua do pino, com quique e tudo unsigned long instanteMudanca = 0; // quando a leitura crua mudou pela última vez unsigned long ultimoEnvio = 0; void setup() { pinMode(PINO_BOTAO, INPUT_PULLUP); Serial.begin(9600); Serial.println("Botao no pino 2 alterna entre codigo e volts."); } void loop() { bool leitura = digitalRead(PINO_BOTAO); // Toda mudança na leitura crua, toque de verdade ou quique, reinicia a contagem de estabilidade. if (leitura != ultimaLeitura) { instanteMudanca = millis(); ultimaLeitura = leitura; } // Só quando o pino ficou parado no novo nível por ESPERA_REPIQUE_MS o estado é aceito. // Isso cobre o quique ao apertar e o quique ao soltar: nenhum dos dois vira borda. if (leitura != estadoEstavel && millis() - instanteMudanca >= ESPERA_REPIQUE_MS) { estadoEstavel = leitura; if (estadoEstavel == LOW) { // borda de descida: acabou de ser apertado mostrarVolts = !mostrarVolts; } } // O botão é lido a cada volta do loop; só a impressão espera o intervalo. if (millis() - ultimoEnvio >= INTERVALO_MS) { ultimoEnvio = millis(); int valor = analogRead(PINO_TRIMPOT); if (mostrarVolts) { Serial.println(valor * TENSAO_REFERENCIA / DEGRAUS, 2); } else { Serial.println(valor); } } } // Variação para criar: em vez de alternar, use o botão para congelar a leitura na tela // (uma função de "hold", como a dos multímetros).