Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Timer Regressivo Ajustável DIY com Arduino Mega 2560

Componentes e Materiais

Arduino Mega 2560 (qualquer Arduino funciona) 1
Display 7 segmentos 4 dígitos 1
Botão push button 4
Buzzer 1
Fios jumpers (genéricos) 21
Protoboard tamanho completo 1

Sobre o Projeto

Timer regressivo é provavelmente o projeto mais natural para display 7 segmentos de 4 dígitos. Explorando o que está disponível online, encontrei vários projetos, mas não achei o que tinha em mente: um timer regressivo ajustável autônomo que você possa ajustar convenientemente com botões (e não modificando e recarregando o código). Então decidi fazer um.

Gastei tempo escrevendo um código que torne fácil usar e ajustar o timer, para que possa ser usado na prática.

O código incluído também serve para outros projetos com display 7 segmentos 4 dígitos. Em particular, tem a função que exibe um número (0-9999) por um intervalo de tempo. Talvez essa funcionalidade exista em alguma biblioteca, mas uma busca rápida não revelou. Como programar este display é um pouco complicado (pois só mostra um dígito por vez), tal função é muito útil.

Código

Timer regressivo display 7 segmentos 4 dígitos C/C++

O código contém a função de timer regressivo que inicia a contagem regressiva mostrada no display. Também tem a função útil PrintNumber que mostra um número de 4 dígitos no display por um tempo determinado. Pode ser usado em outros projetos.

#include <math.h>

int digit_pin[] = {6, 9, 10, 11}; // Pinos PWM dos dígitos do display da esquerda para direita
int speakerPin = 15;
#define DIGIT_ON LOW
#define DIGIT_OFF HIGH

int segA = 2;
int segB = 3;
int segC = 4;
int segD = 5;
int segE = A0; // pino 6 usado pelo display 1 para PWM
int segF = 7;
int segG = 8;

int button1 = 13;
int button2 = 12;
int button3 = 16;
int button4 = 17;

int countdown_time = 60;

struct struct_digits {
  int digit[4];
};

void setup() {
  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);
  
  for (int i = 0; i < 4; i++) {
    pinMode(digit_pin[i], OUTPUT);
  }
  
  pinMode(speakerPin, OUTPUT);
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  pinMode(button3, INPUT_PULLUP);
  pinMode(button4, INPUT_PULLUP);
}

void playTone(int tone, int duration) {
  for (long k = 0; k < duration * 1000L; k += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}

void lightNumber(int numberToDisplay) {
  #define SEGMENT_ON HIGH
  #define SEGMENT_OFF LOW
  
  switch (numberToDisplay) {
    case 0: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_OFF); break;
    case 1: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break;
    case 2: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_ON); break;
    case 3: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_ON); break;
    case 4: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break;
    case 5: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break;
    case 6: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break;
    case 7: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break;
    case 8: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break;
    case 9: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break;
    case 10: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break;
  }
}

void SwitchDigit(int digit) {
  for (int i = 0; i < 4; i++) {
    if (i == digit) { digitalWrite(digit_pin[i], DIGIT_ON); }
    else { digitalWrite(digit_pin[i], DIGIT_OFF); }
  }
}

struct struct_digits IntToDigits(int n) {
  struct struct_digits dig;
  int zeros = 0;
  int d;
  for (int i = 0; i < 4; i++) {
    d = n / pow(10, 3 - i);
    zeros += d;
    n = n - d * pow(10, 3 - i);
    if (zeros != 0 || i == 3) { dig.digit[i] = d; }
    else { dig.digit[i] = 10; }
  }
  return dig;
}

void PrintNumber(int n, int time) {
  struct struct_digits dig;
  dig = IntToDigits(n);
  for (int i = 0; i <= time / 20; i++) {
    if (digitalRead(button2) == LOW) { return; }
    for (int j = 0; j < 4; j++) {
      SwitchDigit(j);
      lightNumber(dig.digit[j]);
      delay(5);
    }
  }
}

bool Countdown(int n, int del) {
  for (int q = n; q > 0; q--) {
    PrintNumber(q, del);
    if (digitalRead(button2) == LOW) { return false; }
  }
  PrintNumber(0, 0);
  playTone(1519, 1000);
  return true;
}

void reset() {
  int m, zeros, d, pressed3 = 0, pressed4 = 0;
  m = countdown_time;
  struct struct_digits dig;
  dig = IntToDigits(countdown_time);
  
  while (digitalRead(button1) == HIGH) {
    for (int j = 0; j < 4; j++) {
      SwitchDigit(j);
      lightNumber(dig.digit[j]);
      delay(5);
    }
    
    if (digitalRead(button3) == LOW) {
      if (pressed3 == 0 || pressed3 > 30) {
        if (countdown_time > 0) { countdown_time -= 1; }
        dig = IntToDigits(countdown_time);
      }
      pressed3 += 1;
    } else if (digitalRead(button4) == LOW) {
      if (pressed4 == 0 || pressed4 > 30) {
        if (countdown_time < 9999) { countdown_time += 1; }
        dig = IntToDigits(countdown_time);
      }
      pressed4 += 1;
    }
    
    if (digitalRead(button3) == HIGH) { pressed3 = 0; }
    if (digitalRead(button4) == HIGH) { pressed4 = 0; }
  }
}

void loop() {
  reset();
  while (!Countdown(countdown_time, 962)) { reset(); }
  while (digitalRead(button2) == 1) {};
}

Esquemáticos

Timer Regressivo Ajustável DIY com Arduino Mega 2560

Processo de manufatura

  1. Display de Cristal Líquido (LCD): Tecnologia, Fabricação e Perspectivas Futuras
  2. Dominando Sobrecarga de Métodos em C#: Conceitos, Exemplos e Boas Práticas
  3. Primal Display: Construa Monitor de Temperatura LCD com Raspberry Pi
  4. Como Instalar Display TFT 3.5″ Kuman no RetroPie – Guia Passo a Passo
  5. Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
  6. Construa o Clássico Jogo Pong no Arduino UNO com Display OLED – Tutorial Passo a Passo
  7. Entendendo o Watchdog Timer: Como Ele Impede Travamentos do Microcontrolador
  8. Kit Caça-Níqueis Alienígena com ATmega328P
  9. Projeto HMI Interativo com Nextion, Arduino Mega e Sensores
  10. Amortecedores Ajustáveis: Melhorando Altura de Rodagem e Desempenho