Trilha de aprendizado · Nível 9 · Tutorial 2

Variáveis e tipos no firmware

Declare variáveis e constantes adequadas aos dados do programa e acompanhe como seus valores mudam durante a execução no Uno R3.

  • Nível: Iniciante
  • Duração: 20 min
  • 8 passos
Variáveis e tipos no firmware

O que você vai percorrer

  1. Nome, tipo e valor de uma variável Reconheça nome, tipo e valor em uma declaração e inicialize variáveis inteiras com identificadores válidos. 2 min
  2. Como as atribuições mudam os valores Acompanhe instruções sequenciais e determine como atribuições substituem ou copiam valores entre variáveis. 3 min
  3. Estados lógicos e faixas dos inteiros Escolha bool ou um tipo inteiro no Uno R3 considerando estados, sinal e a faixa completa de valores. 3 min
  4. Tipos com largura explícita Use `stdint.h` e tipos inteiros de largura explícita para comunicar a faixa necessária de cada dado no Uno R3. 3 min
  5. Valores fracionários com float Reconheça dados fracionários e trate valores float como aproximações de precisão limitada no Uno R3. 2 min
  6. Valores que não devem mudar: const Declare parâmetros fixos com const e diferencie-os de dados de estado que podem mudar. 2 min
  7. Onde a variável existe e por quanto tempo Diferencie o acesso e a permanência de variáveis globais e locais automáticas em um sketch do Uno R3. 3 min
  8. Aplicação final: declarar e rastrear dados Complete declarações de um sketch curto, rastreie suas atribuições e diferencie dados que permanecem daqueles recriados em cada chamada. 3 min

O que você vai aprender

  • Declarar e inicializar variáveis e constantes com nomes válidos.
  • Selecionar um tipo a partir da necessidade de sinal, faixa numérica e parte fracionária.
  • Determinar se um valor cabe no tipo escolhido para o Uno R3.
  • Distinguir a visibilidade e a permanência de variáveis globais e locais.
  • Preencher uma tabela com os valores resultantes de uma sequência de atribuições.

Antes de começar

  • Primeiro programa no Arduino Uno R3

Passo 1 de 8

Nome, tipo e valor de uma variável

Reconheça nome, tipo e valor em uma declaração e inicialize variáveis inteiras com identificadores válidos.

Anatomia da declaração

Uma variável tem nome, tipo e valor

Uma variável é um espaço de armazenamento que o programa identifica por um nome e usa conforme um tipo. Ela também guarda um valor.

Neste início, usaremos int para valores inteiros pequenos. Observe a declaração abaixo: ela apresenta a variável ao programa e já define seu primeiro valor.

Lendo uma declaração

Diagrama de uma posição de armazenamento com o valor 3, associada ao nome ledCount e ao tipo int.

Em int ledCount = 3;, int indica o tipo, ledCount é o nome e 3 é o valor inicial.

Exemplo

Declaração inicializada de uma variável inteira.

cpp
int ledCount = 3;

Declaração e inicialização

Declare e inicialize

Uma declaração inicializada segue esta estrutura:

tipo nome = valor;

O sinal = define o valor inicial neste momento, e o ponto e vírgula ; encerra a instrução. Declarar é criar um nome que o programa poderá reconhecer; inicializar é fornecer seu valor inicial.

Adote a inicialização explícita: declare a variável já com um valor conhecido antes de usá-la nos exemplos.

Dica

Boa prática

Uma declaração não inicializada, como int tentativas;, será evitada neste tutorial. Sem um valor inicial explícito, não use a variável como se soubesse qual valor ela contém.

Escolha bons nomes

Nomes válidos e claros

Escolha nomes que revelem o que o dado representa. Um identificador pode usar letras, números e _, mas não pode ter espaços nem começar por número.

C/C++ diferencia maiúsculas de minúsculas: total, Total e TOTAL são nomes diferentes. Também não use palavras reservadas pela linguagem, como int ou for.

Atenção

Verifique os identificadores

Associe cada nome à descrição correta.

Escolha um identificador

Qual destes é um nome válido para uma variável que guarda uma quantidade de peças?

Pratique a estrutura

Complete a inicialização

Complete a declaração de uma variável inteira para registrar tentativas, começando em zero.

cpp
  = ;

Passo 2 de 8

Como as atribuições mudam os valores

Acompanhe instruções sequenciais e determine como atribuições substituem ou copiam valores entre variáveis.

Uma instrução muda o valor atual

Atribuir é substituir

Uma atribuição coloca um novo valor em uma variável que já foi declarada. Sua forma é nome = valor;.

Leia = como “recebe”, não como igualdade matemática. Ao executar contador = 8;, o valor que estava guardado em contador é substituído por 8.

As instruções são executadas na ordem em que aparecem. Para descobrir o valor atual, acompanhe uma linha de cada vez.

Antes e depois de uma atribuição

Diagrama de uma variável chamada contador com valor 3 antes da atribuição e valor 8 depois.

O nome e o tipo da variável permanecem; a atribuição substitui apenas o valor armazenado.

Copiar o valor disponível

Execute na ordem

As duas variáveis deste trecho já receberam valores iniciais. Leia as instruções de cima para baixo. Primeiro, nivel recebe 5. Depois, referencia recebe uma cópia do valor que nivel guarda naquele instante.

Sequência de atribuições

Trecho para rastrear valores; não é necessário executá-lo.

cpp
int nivel = 2;
int referencia = 7;

nivel = 5;
referencia = nivel;
nivel = 9;

Dica

Cópia, não vínculo

Na linha referencia = nivel;, o programa lê o valor disponível em nivel naquele momento — 5 — e o copia para referencia.

Depois, nivel = 9; altera somente nivel. A cópia em referencia continua com 5: as variáveis não formam um vínculo permanente.

Registre cada mudança

Rastreie linha por linha

Uma tabela de rastreamento mostra o estado logo após cada instrução. Comece pelas inicializações e, em cada nova linha, altere somente a variável que está à esquerda de =.

Tabela de rastreamento

Valores após cada instrução do trecho anterior.

A última atribuição não altera `referencia`.
Instrução executadanivelreferencia
int nivel = 2;2—
int referencia = 7;27
nivel = 5;57
referencia = nivel;55
nivel = 9;95

Aplicação curta

Pratique o rastreamento

Preencha os valores registrados logo após cada uma das duas atribuições. O primeiro ponto de conferência ocorre logo após a cópia; o segundo ocorre depois que a variável de origem recebe outro valor.

Cópia seguida de alteração

Complete os dois pontos de conferência do rastreamento.

cpp
int leitura = 4;
int registro = 1;

registro = leitura;  // depois: leitura = , registro = 
leitura = 6;          // depois: leitura = , registro = 

Passo 3 de 8

Estados lógicos e faixas dos inteiros

Escolha bool ou um tipo inteiro no Uno R3 considerando estados, sinal e a faixa completa de valores.

Bool: estado lógico

Estados de duas possibilidades

Um dado com apenas dois estados possíveis usa o tipo bool. Os valores são escritos como true e false.

Use bool para expressar o significado lógico do dado, por exemplo “o alarme está ativo?”. Isso não quer dizer que uma variável bool ocupe necessariamente um único bit na memória: tipo e organização de armazenamento são assuntos diferentes.

Exemplo

bool no firmware

Exemplos de estados lógicos inicializados:

Declarações booleanas

Dois estados possíveis, expressos de forma clara no código.

cpp
bool alarmeAtivo = false;
bool portaAberta = true;

Um estado, duas opções

Diagrama com uma variável lógica ligada a apenas dois estados visuais: verdadeiro e falso.

Um bool representa uma escolha lógica entre dois estados, não uma medida numérica contínua.

Inteiros no Uno R3

Sinal e faixa

Para contagens e medidas inteiras, escolha primeiro se o dado pode ser negativo.

  • Use um inteiro com sinal quando o intervalo previsto incluir valores negativos e positivos.
  • Use um inteiro sem sinal, escrito com unsigned, quando todos os valores previstos forem de zero para cima.

Depois, confira se o maior e o menor valor previstos cabem na faixa do tipo. Não escolha pelo valor atual isolado: considere todos os valores que o dado poderá assumir.

Referência: Uno R3

No Arduino Uno R3, estas são as faixas dos tipos inteiros usados neste step.

Faixas específicas da plataforma Uno R3 (ATmega328P).
TipoBitsMenor valorMaior valor
int16-3276832767
unsigned int16065535
long32-21474836482147483647
unsigned long3204294967295

Compare as faixas

Quatro linhas numéricas com faixas de inteiros de 16 e 32 bits, com e sem sinal.

Os tipos sem sinal usam toda a faixa para zero e valores positivos; os tipos long alcançam intervalos muito maiores.

Atenção

Atenção à plataforma

Essas larguras valem para o Uno R3 usado aqui. Em outra placa, um int ou long pode ter outra largura e outra faixa. Consulte a documentação da plataforma antes de reutilizar essa escolha.

Prática: selecionar tipos

Escolha pelo intervalo

Associe cada requisito ao tipo mais adequado no Uno R3. Considere somente os valores informados.

Qual tipo escolher?

Faça as associações.

Toque em um item e depois no par correspondente.

Prática: conferir limites

Complete a declaração

Analise a declaração. A variável deve registrar uma contagem que nunca é negativa e pode chegar a 65535 no Uno R3.

Limite exato

Preencha a lacuna com o tipo adequado.

cpp
 amostrasRegistradas = 65535;

Confira a faixa

No Uno R3, qual tipo apresentado comporta o valor inteiro não negativo 70000?

Passo 4 de 8

Tipos com largura explícita

Use stdint.h e tipos inteiros de largura explícita para comunicar a faixa necessária de cada dado no Uno R3.

Nomes que informam a largura

Largura declarada no nome

Além de int e long, você pode usar tipos cujo nome informa a largura desejada. Isso comunica quantos bits o dado exige e evita depender do tamanho que outros nomes podem ter em outra plataforma.

Leia uint8_t assim:

  • u significa sem sinal: somente valores de zero para cima.
  • A ausência de u, como em int16_t, indica um tipo com sinal.
  • O número informa a largura em bits.
  • _t faz parte do nome do tipo.

Assim, um dado limitado a 0–255 pode usar uint8_t. Para escolher, considere sempre o intervalo completo previsto, inclusive seus limites.

Como interpretar sinal e largura

Diagrama comparando recipientes de 8, 16 e 32 bits, com tipos com sinal distribuídos ao redor de zero e tipos sem sinal começando em zero.

O sinal define se há valores negativos; a largura define o tamanho da faixa disponível.

Cabeçalho e faixas

Inclua o cabeçalho

Para usar esses nomes no sketch, inclua o cabeçalho stdint.h no início do código. A diretiva começa com # e não termina com ponto e vírgula. Ela disponibiliza nomes como uint8_t e int16_t para o compilador reconhecer.

Tipos de largura explícita

Exemplo de declarações no início de um sketch.

cpp
#include <stdint.h>

uint8_t nivel = 255;
int16_t ajuste = -120;
uint16_t contagem = 50000;
uint32_t total = 100000;

void setup() {
}

void loop() {
}

Faixas de referência

No Uno R3, os tipos de 16 e 32 bits correspondem às faixas estudadas anteriormente. Escolha um tipo que comporte todos os valores previstos, não apenas o valor atual.

Tipos de largura explícita usados nesta etapa no Uno R3.
TipoSinalBitsFaixa
uint8_tsem sinal80 a 255
int16_tcom sinal16-32768 a 32767
uint16_tsem sinal160 a 65535
uint32_tsem sinal320 a 4294967295

Prática: interpretar os limites

Leia sinal e largura

Associe cada tipo à sua característica. Preste atenção ao u: ele indica que a faixa não inclui valores negativos.

Tipos e características

Faça as associações.

Toque em um item e depois no par correspondente.

Teste o limite 255–256

Um firmware precisa declarar codigo = 256 e correcao = -1. Qual par de tipos é adequado no Uno R3?

Prática: declarar com precisão

Escolha pelo intervalo

Complete o início deste trecho. codigo deve ir de 0 a 255; correcao pode ir de -200 a 200; e amostras pode chegar a 60000. Use o cabeçalho e tipos que expressem esses requisitos.

Complete as declarações

Preencha as quatro lacunas.

cpp


 codigo = 255;
 correcao = -200;
 amostras = 60000;

Passo 5 de 8

Valores fracionários com float

Reconheça dados fracionários e trate valores float como aproximações de precisão limitada no Uno R3.

Contagem ou grandeza fracionária?

Quando usar float

Use float quando o dado pode ter uma parte fracionária. Por exemplo, uma distância fictícia de 12,75 unidades não cabe integralmente em um tipo inteiro, pois o valor após a vírgula faz parte do dado.

Já uma contagem, como 12 peças, é inteira e pode usar um tipo inteiro adequado à sua faixa. O tipo descreve o tipo de valor que o programa pretende guardar — não apenas como o número costuma ser escrito.

Comparação visual: uma contagem de 12 itens inteiros e uma medida de 12,75 em uma régua.

Contagens usam valores inteiros; grandezas que incluem fração podem precisar de float.

Exemplo de declaração

Duas declarações inicializadas: uma contagem e uma medida fracionária.

cpp
unsigned int quantidadePecas = 12;
float distanciaMedida = 12.75f;

O limite de precisão

Precisão não é número de casas

No Uno R3, um float tem precisão limitada a aproximadamente 6 ou 7 algarismos significativos. Esses algarismos começam no primeiro dígito diferente de zero e contam todos os dígitos relevantes do valor.

Assim, 1234567 tem 7 algarismos significativos, enquanto 0.001234567 também tem 7. Não é correto interpretar essa característica como “6 ou 7 casas depois da vírgula”.

Dica

Uma aproximação finita

Muitos números decimais não podem ser guardados exatamente em um float. Portanto, trate o valor armazenado como uma aproximação do valor que você escreveu.

Para dados fracionários comuns, float é útil; porém, não prometa precisão ilimitada. Ao escolher o tipo, considere tanto a necessidade de fração quanto a quantidade de algarismos relevantes para seu dado.

Explique a limitação

A afirmação é verdadeira ou falsa?

“Como float tem cerca de 6 a 7 algarismos significativos no Uno R3, todo valor com até 7 casas depois da vírgula é armazenado exatamente.”

Escreva pelo menos 40 caracteres (0/40).

Pratique a escolha

Escolha justificada

Complete a declaração para guardar uma medida fictícia que pode ter parte fracionária. O sufixo f deixa explícito que o literal é um valor float.

Escreva pelo menos 30 caracteres (0/30).

Complete o tipo

Preencha o tipo adequado.

cpp
 nivelFicticio = 18.25f;

Escolha os tipos

Qual declaração representa melhor estes dados fictícios?

  • distância que pode ser 4,5 unidades;
  • quantidade de amostras, sempre inteira e não negativa.

Passo 6 de 8

Valores que não devem mudar: const

Declare parâmetros fixos com const e diferencie-os de dados de estado que podem mudar.

Estado variável e parâmetro fixo

Um valor fixo no programa

Valores que não devem mudar: const

Use const quando um dado é um parâmetro fixo do programa: ele recebe um valor na declaração e não pode receber outro depois.

const float LIMITE_TEMPERATURA = 35.0f;

A constante continua tendo um tipo. Aqui, float é adequado porque o limite tem parte fracionária. O nome em maiúsculas é uma convenção útil para destacar valores fixos, mas o que realmente impede a alteração é const.

Comparação visual entre uma variável contador que muda de 0 para 1 e uma constante LIMITE que permanece em 35,0.

Uma variável representa um estado que pode mudar; uma constante representa um parâmetro que deve permanecer fixo.

O que pode receber atribuição

Escolha o dado que pode mudar

Compare os dois dados abaixo. Ambos são declarados e inicializados, mas têm papéis diferentes.

Variável e constante tipadas

Trecho para estudar

cpp
int contagem = 0;
const uint16_t LIMITE_AMOSTRAS = 500;

contagem = 1;              // permitido
// LIMITE_AMOSTRAS = 600;  // inválido: a constante não pode ser alterada

Dica

Regra prática

contagem é um estado: seu valor pode ser substituído durante a execução. Já LIMITE_AMOSTRAS é um parâmetro definido para este programa. Como 500 é inteiro não negativo e cabe de 0 a 65535, uint16_t é um tipo adequado no Uno R3.

Uma constante precisa ser inicializada na própria declaração. Assim, o programa já sabe qual valor ela deve preservar.

Prática: estado ou parâmetro?

Classifique os dados

Relacione cada declaração ao seu papel no firmware.

Associe cada declaração à descrição correta.

Toque em um item e depois no par correspondente.

Confira sua compreensão

Complete a constante

Complete a declaração de um parâmetro fixo. O valor é um inteiro não negativo entre 0 e 255.

cpp
 uint8_t BRILHO_INICIAL = 120;

Verifique a atribuição

Considere o código:

int leituras = 0;
const int LIMITE = 10;

leituras = 1;
LIMITE = 12;

Qual linha de atribuição é inválida?

Passo 7 de 8

Onde a variável existe e por quanto tempo

Diferencie o acesso e a permanência de variáveis globais e locais automáticas em um sketch do Uno R3.

Dois alcances diferentes

Visibilidade e duração

Duas perguntas diferentes ajudam a entender uma variável:

  • Visibilidade: em quais trechos do código esse nome pode ser usado?
  • Duração: por quanto tempo a variável existe durante a execução?

Uma variável global é declarada antes de setup() e loop(). Seu nome pode ser usado nas duas funções e ela permanece existindo enquanto o programa está em execução.

Uma variável local automática é declarada dentro de um bloco entre chaves. Seu nome só pode ser usado da declaração até o fim desse bloco. Ela existe apenas enquanto aquele bloco está sendo executado.

Mapa das variáveis no sketch

Diagrama com uma área global antes das funções e uma área local dentro de loop, mostrando que a global alcança as duas funções e a local fica limitada ao bloco de loop.

A posição da declaração determina onde o nome é visível e quando a variável existe.

Global: acesso e retenção

Global antes das funções

Declare uma global antes das funções quando o dado precisar continuar disponível entre as chamadas de loop(). Ela deve ser inicializada explicitamente, como nos exemplos anteriores.

Uma global e uma local

Sketch para observar uma variável global e uma local automática.

cpp
bool estadoRegistrado = false;

void setup() {
}

void loop() {
  bool sensorLido = true;
  estadoRegistrado = sensorLido;
}

Leia a posição das declarações

estadoRegistrado é global: foi declarada antes de setup() e loop(). Portanto, pode ser usada em ambas as funções e retém o valor recebido na chamada anterior de loop().

sensorLido é local automática: só pode ser usada depois de sua declaração e antes da chave } de loop(). Fora desse bloco, esse nome não existe.

Duas chamadas, dois tempos de vida

Local: criação a cada chamada

Toda vez que o ambiente chama loop(), a variável local automática é criada novamente e sua inicialização é executada de novo. Neste caso, sensorLido recebe true em cada chamada.

Ao chegar à chave final de loop(), sensorLido deixa de existir. Já estadoRegistrado continua existindo e guarda o último valor atribuído enquanto o programa permanece em execução.

Linha do tempo de duas chamadas

Rastreamento de duas chamadas de loop() para o código mostrado.

A global é retida entre chamadas; a local é recriada e depois deixa de existir.
MomentoestadoRegistradosensorLido
Antes da 1ª chamadafalsenão existe
Após a declaração na 1ªfalsetrue
Fim da 1ª chamadatruedeixa de existir
Antes da 2ª chamadatruenão existe
Após a declaração na 2ªtruetrue
Fim da 2ª chamadatruedeixa de existir

Atenção

Inicialize antes de ler

Não leia uma variável local automática que não recebeu valor inicial. Não suponha que ela comece em zero nem que conserve o valor de uma chamada anterior. Inicialize-a na declaração antes de usá-la.

Pratique visibilidade e duração

Onde cada nome é visível?

Para cada ponto do sketch, associe quais nomes podem ser usados. Considere que sensorLido já foi declarado quando indicado.

Visibilidade no sketch

Associe cada trecho à combinação correta de nomes que pode ser usada nele.

Toque em um item e depois no par correspondente.

Rastreie duas chamadas

Complete o rastreamento de duas chamadas do loop() do sketch estudado. As lacunas estão em comentários: elas registram o estado em cada momento.

Valores e permanência

Preencha os valores observados e acompanhe quando a variável local existe.

cpp
bool estadoRegistrado = false;

void setup() {
}

void loop() {
  bool sensorLido = true;
  estadoRegistrado = sensorLido;
}

// Antes da 1ª chamada: estadoRegistrado = ; sensorLido não existe.
// No fim da 1ª chamada: estadoRegistrado = ; sensorLido deixa de existir.
// Antes da 2ª chamada: estadoRegistrado = ; sensorLido não existe.
// Após declarar sensorLido na 2ª: estadoRegistrado = ; sensorLido = .
// No fim da 2ª chamada: estadoRegistrado = ; sensorLido deixa de existir.

Passo 8 de 8

Aplicação final: declarar e rastrear dados

Complete declarações de um sketch curto, rastreie suas atribuições e diferencie dados que permanecem daqueles recriados em cada chamada.

Escolha os dados pelo requisito

Cenário integrado

Considere estes requisitos fictícios para um Uno R3:

  • sistemaAtivo: estado com duas possibilidades.
  • contagem: número não negativo de 0 a 2000.
  • temperaturaC: medida que pode ter parte fracionária.
  • LIMITE_LEITURAS: parâmetro fixo igual a 8.

As escolhas adequadas são bool, uint16_t, float e const uint8_t, respectivamente. As declarações globais ficam antes de setup() e loop().

Dados globais e dado temporário

Diagrama de quatro dados globais — estado lógico, contagem, medida fracionária e parâmetro fixo — e um dado temporário dentro de loop.

Os dados globais permanecem disponíveis durante a execução; um dado criado dentro de loop pertence somente àquela chamada.

Complete os tipos e a constante

Prática: declarações corretas

Complete as declarações conforme os requisitos. O cabeçalho disponibiliza os nomes de tipos com largura explícita. O parâmetro fixo precisa de const e recebe seu valor já na declaração.

Complete os tipos e a constante

Preencha os quatro trechos ausentes.

cpp
#include <stdint.h>

 sistemaAtivo = false;
 contagem = 0;
 temperaturaC = 23.5f;
 LIMITE_LEITURAS = 8;

Acompanhe valores e permanência

Código para rastrear

As quatro primeiras declarações são globais. Dentro de loop(), estadoNestaChamada e temperaturaRegistrada são locais automáticas: surgem ao entrar no bloco e deixam de existir ao sair dele.

Leia uma instrução por vez. = substitui o valor à esquerda; quando o lado direito é outra variável, o valor atual é copiado naquele instante.

Sketch integrado

Sketch completo para rastreamento e compilação opcional

cpp
#include <stdint.h>

bool sistemaAtivo = false;
uint16_t contagem = 0;
float temperaturaC = 23.5f;
const uint8_t LIMITE_LEITURAS = 8;

void setup() {
}

void loop() {
  bool estadoNestaChamada = true;
  sistemaAtivo = estadoNestaChamada;
  contagem = 12;
  float temperaturaRegistrada = temperaturaC;
  estadoNestaChamada = false;
}
Saída esperada
Sketch uses 928 bytes (2%) of program storage space. Maximum is 32256 bytes.
Global variables use 10 bytes (0%) of dynamic memory, leaving 2038 bytes for local variables. Maximum is 2048 bytes.

A mensagem exata pode variar conforme a versão e o idioma da IDE. O essencial é a indicação de que a compilação foi concluída sem erros.

Atenção

Conferência opcional

Se quiser, copie o sketch para um arquivo .ino no seu computador, selecione Arduino Uno e use apenas Verificar na IDE. Uma compilação aceita confirma que a sintaxe e os tipos foram aceitos pelo compilador, como na saída mostrada. Ela não comprova os valores durante a execução nem garante que uma faixa atende a todos os casos reais. Nesta atividade, confira os valores por rastreamento manual.

Rastreie uma chamada e a próxima

Rastreamento manual

Use o sketch da tela anterior. Para cada linha da tabela, registre o estado logo após a instrução indicada. A coluna de uma variável local recebe “não existe” antes de sua declaração e depois da saída de loop().

Lembre-se: temperaturaRegistrada = temperaturaC; copia o valor disponível de temperaturaC, e mudar estadoNestaChamada no fim não altera sistemaAtivo.

Tabela para preencher

Preencha a tabela em seu caderno ou em uma nota. Depois compare com o gabarito na próxima tela.

Rastreamento de uma chamada de loop
Após a instruçãosistemaAtivocontagemtemperaturaRegistradaestadoNestaChamada
entrada no loop??não existenão existe
criar estado local??não existe?
copiar estado??não existe?
atribuir contagem??não existe?
copiar temperatura????
alterar estado local????
sair do loop??não existenão existe

Permanência entre chamadas

Após a saída de loop(), qual afirmação descreve corretamente a próxima chamada?

Escreva pelo menos 50 caracteres (0/50).

Confira e consolide

Gabarito do rastreamento

Resultado de uma chamada de loop(). A constante não aparece nas atribuições porque preserva o mesmo valor: LIMITE_LEITURAS = 8.

Traço de execução de uma única chamada de loop
Após a instruçãosistemaAtivocontagemtemperaturaRegistradaestadoNestaChamada
entrada no loopfalse0não existenão existe
criar estado localfalse0não existetrue
copiar estadotrue0não existetrue
atribuir contagemtrue12não existetrue
copiar temperaturatrue1223.5true
alterar estado localtrue1223.5false
sair do looptrue12não existenão existe

Resumo

Síntese final

  • Comece pelo requisito: dois estados usam bool; uma faixa não negativa de 0 a 2000 cabe em uint16_t; parte fracionária pede float.
  • Declare e inicialize cada dado antes de lê-lo, com um nome claro.
  • Use const para um parâmetro que o programa não deve alterar e inicialize-o na declaração.
  • Globais permanecem durante a execução; locais automáticas existem somente no bloco e na chamada em que foram criadas.
  • Rastreie atribuições em sequência: uma cópia registra o valor disponível naquele instante, sem criar vínculo permanente.

Tutorial concluído

Parabéns! Você concluiu: Variáveis e tipos no firmware

Muito bem! Antes de declarar um dado, escolha o tipo, dê um nome claro, inicialize-o e defina se ele pode mudar e por quanto tempo precisa existir.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso