Entendendo a digitalWrite(): Controle de Saídas Digitais no Arduino
Depois de configurarmos um pino do microcontrolador como saída usando a função pinMode(), a próxima instrução fundamental é a digitalWrite(). É através dela que enviamos sinais elétricos digitais para controlar LEDs, acionar relés, transistores ou enviar pulsos de comunicação.
Neste artigo, vamos analisar em detalhes como a função digitalWrite() funciona, o comportamento elétrico envolvido e como estruturar códigos limpos e profissionais em C/C++.
1. Sintaxe da Função digitalWrite()
A função digitalWrite() recebe dois parâmetros para definir o estado elétrico do pino desejado:
digitalWrite( pin , val )
- pin (uint8_t): O número do pino digital ou analógico (ex: 13, A0) onde o nível lógico será aplicado.
- val (uint8_t): O valor do nível lógico atribuído, podendo ser
HIGH(Alto) ouLOW(Baixo).
2. Níveis Lógicos e Tensões Elétricas
A atribuição de HIGH ou LOW altera a tensão elétrica presente na porta do microcontrolador em relação ao pino de terra (GND):
| Estado Lógico | Tensão (Placa 5V - ex: Uno / Nano) | Tensão (Placa 3.3V - ex: Due / ESP32) |
|---|---|---|
| HIGH | 5V (VCC) | 3.3V (VCC) |
| LOW | 0V (GND / Ground) | 0V (GND / Ground) |
INPUT ou INPUT_PULLUP, executar digitalWrite(pin, HIGH) ativará o resistor interno de pull-up, enquanto digitalWrite(pin, LOW) irá desativá-lo.
3. Exemplo Básico: Pisca-Pisca (Blink) e Leitura em Osciloscópio
O exemplo clássico de temporização alterna o estado de um pino de saída e insere um intervalo com a função delay():
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // Coloca 5V no pino (Acende o LED)
delay(1000); // Aguarda 1000ms (1 segundo)
digitalWrite(LED_BUILTIN, LOW); // Coloca 0V no pino (Apaga o LED)
delay(1000); // Aguarda 1 segundo
}
Ao conectar um osciloscópio à saída digital executando esse programa, observamos uma onda quadrada perfeita com período correspondente aos tempos definidos:
- Nível Alto (HIGH): Mantém a amplitude constante de 5V por 1000ms.
- Nível Baixo (LOW): Transição rápida para 0V, permanecendo em nível zero pelos próximos 1000ms.
4. Exemplo Prático: Controle Direto via Entrada de Botão
Uma aplicação comum é utilizar a leitura de uma entrada (como um botão) para alterar dinamicamente o estado de uma saída com digitalWrite().
Opção A: Escrevendo com Mapeamento Numérico Direto
void setup() {
pinMode(2, INPUT); // Pino 2 configurado como Entrada
pinMode(13, OUTPUT); // Pino 13 configurado como Saída
}
void loop() {
if (digitalRead(2)) {
digitalWrite(13, HIGH); // Se pino 2 estiver ALTO, acende o LED no 13
} else {
digitalWrite(13, LOW); // Caso contrário, apaga o LED
}
}
Opção B: Estrutura Profissional usando #define (Boas Práticas de Programação)
Em projetos técnicos e industriais, evita-se usar números soltos ("magic numbers") no meio do código. Utilizar diretivas de pré-compilador #define deixa o firmware legível e fácil de manter:
#define BTN_PIN 2
#define LED_PIN 13
void setup() {
pinMode(BTN_PIN, INPUT); // Declaração clara do botão
pinMode(LED_PIN, OUTPUT); // Declaração clara do LED
}
void loop() {
if (digitalRead(BTN_PIN)) {
digitalWrite(LED_PIN, HIGH); // Liga a saída do LED
} else {
digitalWrite(LED_PIN, LOW); // Desliga a saída do LED
}
}
Resumo Didático
A função digitalWrite() é a base para o controle de cargas em projetos de microcontroladores. Compreender a conversão do nível lógico programável em tensão elétrica real (5V/3.3V) e aplicar boas práticas organizacionais com #define garante códigos concisos, organizados e prontos para aplicação técnica!
Comentários
Postar um comentário