Menu
CoddyTech

Tempos em unsigned long

Parte da seção Temporização sem delay do Journey de Arduino da Coddy. Lição 2 de 18.

Uma variável só pode armazenar números até um determinado valor, definido pelo seu tipo. Um int no Uno armazena de -32768 a 32767. Após 32.8 segundos, millis() é maior que isso, e um int que tenta armazenar esse valor dá a volta e passa a ser um número negativo.

Um tipo unsigned não tem números negativos, então alcança o dobro: um unsigned int armazena de 0 a 65535, o equivalente a cerca de 65 segundos em milissegundos. Ainda não é suficiente.

Um unsigned long armazena de 0 a 4,294,967,295. Em milissegundos, isso representa mais de 49 dias, e esse é o tipo que o próprio millis() retorna. Armazene cada horário em uma variável desse tipo:

unsigned long now = millis();
unsigned long startTime = 0;

Um sketch com o tipo errado funciona por meio minuto e depois dá errado, então é fácil não perceber o bug.

challenge icon

Desafio

Fácil

Este sketch imprime o tempo uma vez por segundo, mas, depois de 32 segundos, imprime números negativos. Altere o tipo de now para que o tempo continue correto por dias.

Pressione Executar e espere passar de 33 segundos para ver o bug; depois, corrija-o e Verifique.

Experimente você mesmo

void setup() {
  Serial.begin(9600);
}

void loop() {
  int now = millis();   // este tipo é pequeno demais para armazenar o tempo: troque-o
  Serial.println(now);
  delay(1000);
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Temporização sem delay

Pratique por conta própria: Playground de Arduino