Robô faz pesquisa no blog

🔍 Buscar no Blog ×
Olá! Digite o assunto ou a palavra-chave que você procura, e eu listarei as postagens do blog para você.

digitalRead() + SIMULADOR LADDER

digitalRead(): Leitura de Sinais Digitais no Arduino

A função digitalRead() permite que o microcontrolador leia o estado lógico presente em um pino digital. Ela faz a interface entre o circuito eletrônico físico e o programa desenvolvido em C/C++.

Em termos simples: o circuito apresenta uma condição elétrica ao pino do microcontrolador e digitalRead() permite que o programa interprete essa condição como HIGH ou LOW.

1. Sintaxe da função digitalRead()

A sintaxe básica da função é:

int valor = digitalRead(pino);

Por exemplo:

int estado = digitalRead(2);
  • pino: número do pino que será lido.
  • HIGH: nível lógico alto.
  • LOW: nível lógico baixo.

2. Como o Arduino interpreta a tensão?

Uma entrada digital não interpreta qualquer tensão simplesmente como HIGH ou LOW. O microcontrolador possui especificações elétricas que determinam os níveis de entrada reconhecidos.

  • VIL: tensão máxima especificada para uma entrada ser reconhecida como LOW.
  • VIH: tensão mínima especificada para uma entrada ser reconhecida como HIGH.
Importante: entre VIL e VIH existe uma região em que o nível lógico não é garantido pela especificação elétrica.

3. HIGH e LOW

Estado Valor lógico Interpretação
LOW 0 Nível lógico baixo
HIGH 1 Nível lógico alto

4. Pinos analógicos como entradas digitais

No Arduino Uno R3, os pinos A0 até A5 também podem ser utilizados como entradas ou saídas digitais.

Pino Número digital
A014
A115
A216
A317
A418
A519

5. Entradas flutuantes

Uma entrada digital sem uma referência definida pode apresentar comportamento instável. Essa condição é conhecida como entrada flutuante.

Para evitar esse problema, podemos utilizar resistores Pull-Up ou Pull-Down.

No Arduino também podemos utilizar o resistor Pull-Up interno através de INPUT_PULLUP.

6. Exemplo com INPUT_PULLUP

const int BOTAO = 2; const int LED = 13; void setup() { pinMode(BOTAO, INPUT_PULLUP); pinMode(LED, OUTPUT); } void loop() { int estado = digitalRead(BOTAO); if (estado == LOW) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } }
Atenção: quando utilizamos INPUT_PULLUP, a lógica do botão fica invertida. Normalmente o pino permanece em HIGH e, quando o botão é pressionado e conectado ao GND, o pino passa para LOW.

7. Simulador Ladder — Circuito de Selo

O circuito abaixo representa um comando clássico de partida e parada com selo, utilizado em automação e comandos elétricos.

Simulador de Circuito Ladder

LIGA + DESLIGA + CONTATO DE SELO + BOBINA Q0.0
LIGA I0.0 (NA) Q0.0 CONTATO DE SELO DESLIGA I0.1 (NF) Q0.0 BOBINA / SAÍDA L N
Q0.0 = DESLIGADO
Caminho energizado
Caminho desenergizado

8. Como funciona o circuito de selo?

O botão LIGA é um contato normalmente aberto (NA). Quando pressionado, ele fecha o circuito e permite que a bobina Q0.0 seja energizada.

Quando Q0.0 energiza, o contato auxiliar de Q0.0 também fecha. Esse contato está ligado em paralelo com LIGA.

Dessa forma, quando o operador solta o botão LIGA, o circuito continua energizado através do contato auxiliar de selo.

Sequência de funcionamento:

1. Pressione LIGA.
2. Q0.0 energiza.
3. O contato auxiliar Q0.0 fecha.
4. Solte LIGA.
5. O contato de selo mantém Q0.0 energizado.
6. Pressione DESLIGA.
7. O circuito é interrompido e Q0.0 desliga.

9. Lógica booleana do circuito

A lógica do circuito pode ser representada por:

Q0.0 = (I0.0 OR Q0.0) AND I0.1
  • I0.0: botão LIGA.
  • I0.1: condição do botão DESLIGA NF.
  • Q0.0: bobina/saída.
  • Q0.0: também atua como contato de selo.

10. Estados do circuito

LIGA DESLIGA NF SELO Q0.0 Resultado
0 1 0 0 Desligado
1 1 1 1 Ligado
0 1 1 1 Ligado pelo selo
0 0 0 0 Desligado

11. O significado das linhas verdes

No simulador, a cor verde representa um trecho que está energizado.

Verde = caminho elétrico energizado.

Quando Q0.0 está desligado, o ramo de selo permanece desenergizado. Ao pressionar LIGA, o caminho até a bobina fica energizado. Depois que Q0.0 fecha o contato auxiliar, o ramo superior também permanece energizado.

Ao pressionar DESLIGA, o contato normalmente fechado abre. Como consequência, o caminho até a bobina é interrompido, Q0.0 desliga e o contato de selo volta a abrir.

12. Relação entre Ladder e programação

O mesmo princípio pode ser implementado em um microcontrolador utilizando entradas digitais, lógica de programa e uma saída.

const int LIGA = 2; const int DESLIGA = 3; const int MOTOR = 13; bool selo = false; void setup() { pinMode(LIGA, INPUT_PULLUP); pinMode(DESLIGA, INPUT_PULLUP); pinMode(MOTOR, OUTPUT); } void loop() { bool ligaPressionado = (digitalRead(LIGA) == LOW); bool desligaPressionado = (digitalRead(DESLIGA) == LOW); if (desligaPressionado) { selo = false; } else if (ligaPressionado) { selo = true; } digitalWrite( MOTOR, selo ? HIGH : LOW ); }

Resumo

A função digitalRead() permite ao programa ler estados digitais presentes nas entradas do microcontrolador. Esse princípio é utilizado para ler botões, sensores, chaves fim de curso e outros dispositivos.

No circuito Ladder, a lógica de selo permite que uma saída permaneça energizada depois que o botão de partida é liberado. O botão DESLIGA interrompe o circuito e desenergiza a saída.

Conceito fundamental: O contato Q0.0 de selo fica em paralelo com o botão LIGA. O botão DESLIGA permanece em série com a bobina.
+ SIMULADOR LADDER ========================================================= */ .post-body-custom { font-family: Arial, sans-serif; color: #333; line-height: 1.6; font-size: 16px; max-width: 100%; } .post-body-custom h2 { color: #0d47a1; border-bottom: 2px solid #0d47a1; padding-bottom: 6px; margin-top: 30px; font-size: 1.35rem; } .post-body-custom h3 { color: #1565c0; margin-top: 22px; font-size: 1.15rem; } .post-body-custom code { font-family: "Courier New", monospace; } .highlight-box { background: #eef7ff; border-left: 5px solid #1976d2; padding: 12px 16px; margin: 15px 0; border-radius: 4px; } .alert-box { background: #fff3cd; border-left: 5px solid #ffc107; padding: 12px 16px; margin: 15px 0; border-radius: 4px; color: #856404; } .success-box { background: #e8f5e9; border-left: 5px solid #2e7d32; padding: 12px 16px; margin: 15px 0; border-radius: 4px; color: #1b5e20; } .table-responsive { width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 15px 0; } .custom-table { width: 100%; border-collapse: collapse; min-width: 300px; } .custom-table th, .custom-table td { border: 1px solid #ddd; padding: 8px 12px; text-align: center; } .custom-table th { background: #f2f2f2; color: #333; } /* ========================================================= BLOCO DE CÓDIGO ========================================================= */ .code-container { background: #1e1e1e; color: #d4d4d4; border-radius: 7px; padding: 14px 16px; margin: 15px 0; overflow-x: auto; -webkit-overflow-scrolling: touch; font-family: "Courier New", monospace; font-size: 14px; line-height: 1.45; } .code-container code { white-space: pre; display: block; } .kw-blue { color: #569cd6; font-weight: bold; } .kw-purple { color: #c586c0; } .kw-yellow { color: #dcdcaa; } .kw-green { color: #6a9955; font-style: italic; } .kw-number { color: #b5cea8; } /* ========================================================= SIMULADOR LADDER ========================================================= */ .ladder-box { width: 100%; max-width: 1000px; margin: 30px auto; padding: 18px; box-sizing: border-box; background: #f5f7fa; border: 1px solid #d5dbe3; border-radius: 12px; box-shadow: 0 3px 12px rgba(0,0,0,.08); } .ladder-title { text-align: center; color: #0d47a1; margin: 0 0 8px; font-size: 1.35rem; } .ladder-subtitle { text-align: center; color: #666; margin-bottom: 20px; } /* Área do Ladder */ .ladder-scroll { width: 100%; overflow-x: auto; padding-bottom: 10px; } .ladder { position: relative; width: 900px; height: 330px; margin: auto; background: #fff; border: 1px solid #ddd; border-radius: 8px; } /* Barramentos verticais */ .rail { position: absolute; top: 25px; bottom: 25px; width: 5px; background: #444; border-radius: 3px; } .rail-left { left: 35px; } .rail-right { right: 35px; } /* ========================================================= FIOS ========================================================= */ .wire { position: absolute; height: 5px; background: #777; border-radius: 3px; transition: background .2s ease, box-shadow .2s ease; } .wire.active { background: #16a34a; box-shadow: 0 0 9px rgba(22,163,74,.65); } /* Linha principal */ .w-main-1 { left: 38px; top: 150px; width: 115px; } .w-main-2 { left: 205px; top: 150px; width: 105px; } .w-main-3 { left: 390px; top: 150px; width: 105px; } .w-main-4 { left: 570px; top: 150px; width: 115px; } .w-main-5 { left: 755px; top: 150px; width: 110px; } /* ========================================================= RAMO DO SELO ========================================================= */ .selo-wire-left { position: absolute; left: 310px; top: 150px; width: 5px; height: 80px; background: #777; border-radius: 3px; } .selo-wire-left.active { background: #16a34a; box-shadow: 0 0 9px rgba(22,163,74,.65); } .selo-wire-top { position: absolute; left: 310px; top: 70px; width: 210px; height: 5px; background: #777; border-radius: 3px; } .selo-wire-top.active { background: #16a34a; box-shadow: 0 0 9px rgba(22,163,74,.65); } .selo-wire-right { position: absolute; left: 515px; top: 70px; width: 5px; height: 80px; background: #777; border-radius: 3px; } .selo-wire-right.active { background: #16a34a; box-shadow: 0 0 9px rgba(22,163,74,.65); } /* ========================================================= CONTATOS ========================================================= */ .ladder-contact { position: absolute; width: 70px; height: 45px; background: #fff; border: 3px solid #555; border-radius: 5px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: bold; color: #444; cursor: pointer; user-select: none; transition: all .2s ease; } .ladder-contact.active { border-color: #16a34a; color: #15803d; box-shadow: 0 0 9px rgba(22,163,74,.45); } /* LIGA */ #swLiga { left: 135px; top: 127px; } /* DESLIGA */ #swDesliga { left: 310px; top: 127px; } /* SELO */ #swSelo { left: 380px; top: 47px; } /* ========================================================= BOBINA ========================================================= */ .ladder-coil { position: absolute; left: 685px; top: 125px; width: 70px; height: 50px; border: 4px solid #555; border-radius: 50%; background: #fff; display: flex; align-items: center; justify-content: center; font-weight: bold; color: #444; transition: all .2s ease; } .ladder-coil.active { border-color: #16a34a; color: #15803d; box-shadow: 0 0 12px rgba(22,163,74,.55); } /* ========================================================= IDENTIFICAÇÕES ========================================================= */ .component-label { position: absolute; font-size: 12px; color: #555; font-weight: bold; text-align: center; } .label-liga { left: 130px; top: 185px; width: 80px; } .label-desliga { left: 300px; top: 185px; width: 90px; } .label-selo { left: 360px; top: 12px; width: 110px; } .label-coil { left: 670px; top: 185px; width: 100px; } /* ========================================================= CONTROLES ========================================================= */ .ladder-controls { display: flex; justify-content: center; flex-wrap: wrap; gap: 10px; margin-top: 20px; } .ladder-btn { border: 0; border-radius: 7px; padding: 11px 20px; color: white; background: #1565c0; font-weight: bold; cursor: pointer; font-size: 14px; } .ladder-btn:hover { opacity: .88; } .btn-stop { background: #c62828; } .btn-reset { background: #555; } /* ========================================================= STATUS ========================================================= */ .ladder-status { margin: 18px auto 0; max-width: 500px; padding: 12px; text-align: center; border-radius: 7px; background: #eee; font-weight: bold; } .status-on { color: #15803d; background: #e8f5e9; } .status-off { color: #b91c1c; background: #ffebee; } /* ========================================================= RESPONSIVIDADE ========================================================= */ @media (max-width: 600px) { .post-body-custom { font-size: 15px; } .code-container { font-size: 13px; } .ladder-box { padding: 10px; } }

digitalRead(): Leitura de Sinais Digitais no Arduino

A função digitalRead() permite que o microcontrolador leia o estado lógico presente em um pino digital. Ela faz a interface entre o circuito eletrônico físico e o programa desenvolvido em C/C++.

Em termos simples: o circuito apresenta uma tensão ao pino do microcontrolador e digitalRead() permite que o programa interprete essa condição como HIGH ou LOW.

1. Sintaxe da função digitalRead()

A sintaxe básica é:

int valor = digitalRead(pino);

Por exemplo:

int estado = digitalRead(2);
  • pino: número do pino que será lido.
  • HIGH: nível lógico alto.
  • LOW: nível lógico baixo.

2. Como o Arduino interpreta a tensão?

Uma entrada digital não trabalha simplesmente com qualquer tensão. O microcontrolador possui especificações elétricas que determinam quais níveis de tensão podem ser reconhecidos como LOW ou HIGH.

  • VIL: tensão máxima especificada para uma entrada ser reconhecida como LOW.
  • ```
  • VIH: tensão mínima especificada para uma entrada ser reconhecida como HIGH.
  • ```
Importante: entre VIL e VIH existe uma região em que o nível lógico não é garantido pela especificação elétrica. Portanto, os circuitos digitais devem fornecer níveis claramente definidos.

3. HIGH e LOW

```
Estado Valor lógico Interpretação
LOW 0 Nível lógico baixo
HIGH 1 Nível lógico alto
```

4. Pinos analógicos como entradas digitais

No Arduino Uno R3, os pinos A0 até A5 também podem ser utilizados como entradas ou saídas digitais.

```
Pino Número digital
A014
A115
A216
A317
A418
A519
```

5. Entradas flutuantes

Uma entrada digital que não possui uma referência definida pode apresentar comportamento instável. Essa condição é conhecida como entrada flutuante.

Para evitar esse problema, podemos utilizar resistores Pull-Up ou Pull-Down. No Arduino também podemos utilizar o resistor Pull-Up interno através de INPUT_PULLUP.

6. Exemplo com INPUT_PULLUP

const int BOTAO = 2; const int LED = 13; void setup() { pinMode(BOTAO, INPUT_PULLUP); pinMode(LED, OUTPUT); } void loop() { int estado = digitalRead(BOTAO); if (estado == LOW) { ``` digitalWrite(LED, HIGH); ``` } else { ``` digitalWrite(LED, LOW); ``` } }
Atenção: quando usamos INPUT_PULLUP, a lógica do botão fica invertida: normalmente o pino está em HIGH e, quando o botão é pressionado e conectado ao GND, o pino passa para LOW.

7. Simulador Ladder — Circuito de Selo

O circuito abaixo demonstra um dos circuitos mais importantes utilizados em comandos elétricos e automação industrial: o circuito de partida com selo.

```

Simulador de Circuito Ladder

LIGA + DESLIGA + CONTATO DE SELO + BOBINA Q0.0
LIGA
I0.0
(NA)
DESLIGA
I0.1
(NF)
Q0.0
CONTATO DE SELO
Q0.0
BOBINA
Q0.0 = DESLIGADO
```

8. Como funciona o circuito de selo?

O botão LIGA é um contato normalmente aberto (NA). Quando acionado, ele permite que o circuito seja energizado.

O botão DESLIGA é representado como contato normalmente fechado (NF). Quando pressionado, ele interrompe o circuito.

Quando a bobina Q0.0 é energizada, seu contato auxiliar de selo também fecha. Esse contato cria um caminho paralelo ao botão LIGA.

``` Sequência de funcionamento:

1. Pressione LIGA.
2. Q0.0 energiza.
3. O contato auxiliar Q0.0 fecha.
4. Solte LIGA.
5. O contato de selo mantém Q0.0 energizado.
6. Pressione DESLIGA para interromper o circuito. ```

9. Lógica booleana do circuito

A lógica pode ser representada pela seguinte expressão:

Q0.0 = (I0.0 OR Q0.0) AND I0.1
  • I0.0: botão LIGA;
  • I0.1: botão DESLIGA;
  • Q0.0: bobina/saída;
  • Q0.0: também funciona como contato de selo.

10. Estados do circuito

```
LIGA DESLIGA SELO Q0.0 Resultado
0 1 0 0 Desligado
1 1 1 1 Ligado
0 1 1 1 Ligado pelo selo
0 0 0 0 Desligado
```

11. O significado das linhas verdes

No simulador, as linhas verdes representam os trechos do circuito que estão energizados.

``` Verde = caminho energizado.

Quando Q0.0 está desligado, o caminho de saída permanece apagado. Quando LIGA é acionado, o circuito encontra um caminho até a bobina. Depois que Q0.0 energiza, o ramo de selo mantém o circuito fechado. ```

Ao pressionar DESLIGA, o contato normalmente fechado abre e o caminho de energia é interrompido. Consequentemente, Q0.0 desliga e o contato de selo também abre.

12. Relação entre Ladder e programação

O mesmo princípio pode ser implementado em um microcontrolador, como um Arduino, utilizando entradas digitais e saídas digitais.

const int LIGA = 2; const int DESLIGA = 3; const int MOTOR = 13; bool selo = false; void setup() { pinMode(LIGA, INPUT_PULLUP); pinMode(DESLIGA, INPUT_PULLUP); pinMode(MOTOR, OUTPUT); } void loop() { bool ligaPressionado = (digitalRead(LIGA) == LOW); bool desligaPressionado = (digitalRead(DESLIGA) == LOW); if (desligaPressionado) { ``` selo = false; ``` } else if (ligaPressionado) { ``` selo = true; ``` } digitalWrite(MOTOR, selo ? HIGH : LOW); }

Resumo

A função digitalRead() permite que o programa leia estados digitais presentes nas entradas do microcontrolador. Em sistemas de automação, esse princípio pode ser utilizado para ler botões, sensores, fins de curso e outros dispositivos.

O circuito Ladder, por sua vez, representa graficamente a lógica de comando. No circuito de selo estudado aqui, a saída Q0.0 permanece energizada mesmo depois que o operador solta o botão LIGA, até que o botão DESLIGA interrompa o circuito.

Conceito fundamental: o Ladder representa a lógica de comando de forma gráfica, enquanto o microcontrolador pode executar uma lógica equivalente por meio de entradas, processamento lógico e saídas.

Comentários