Go Down

Topic: Bucle cada segundo dentro de un contador regresivo TM1637 - 4 dig - 7 Segmentos (Read 373 times) previous topic - next topic

Retuit

Hola Buenas, Soy Alberto

He empezado hace unos meses con este mundillo y poquito a poco voy a prendiendo cada día algo nuevo, sin embargo, usando el buscador no he encontrado nada que se asemeje a mi problema, se que debe ser alguna tontería, pero no doy con la tecla  :smiley-confuse:  Tampoco lo he encontrado en mi libro de C que estoy leyendo.

Tengo un código para un contador regresivo, , el contador puedo ponerlo más rápido o más lento (son 4 digitos de 7 segmentos con i2c) modificando el delay, al llegar a cero se activa el pin A0 donde está conectado un buzzer.

Quiero aprovechar y usar el buzzer para que pite cada segundo, he introducido un comando simple dentro del loop, pero entonces el pitido no lo hace cada segundo... no se si me explico. Si el tiempo lo tengo con un delay de 15 (Va muy rápido y utilizo el digito 4 como decimas de segundo) el pitido, aunque tenga un delay de 300, el contador realiza el delay del buzzer...

Adjunto el código:

Code: [Select]
#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3

int NewKeyPadVal = 0;

//----Input Code Digits--
int InputDigit1 =  0;
int InputDigit2 =  5;
int InputDigit3 =  0;
int InputDigit4 =  0;
//----------------------

TM1637Display display(CLK, DIO);
uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
void setup()
{
 
  display.setBrightness(0x01);//MAX - 0x0f

   // Selectively set different digits
  data[0] = display.encodeDigit(0);
  data[1] = display.encodeDigit(0);
  data[2] = display.encodeDigit(0);
  data[3] = display.encodeDigit(0);
  display.setSegments(data);

 
  // initialize I/O pins.
   pinMode(A0, OUTPUT); //Relay or LED blinking Output at 0000
//--------------------------4x3 Keypad------------------ 
  //------3 columns-----
  pinMode(A3, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A1, OUTPUT);
 
  digitalWrite(A3, HIGH);
  digitalWrite(A2, HIGH);
  digitalWrite(A1, HIGH);
  //-------4 rows-----------
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  //------------------------

}

void loop()
{

   
display.setSegments(data);
if(InputDigit1 == 0 && InputDigit2 == 0 && InputDigit3 == 0 && InputDigit4 == 0)
{
  delay(400);
  while(Scan_4x3_keypad() == 15)
  {
  delay(1);
  IfZero();
  }
  NewKeyPadVal = Scan_4x3_keypad();
  InputDigit1 = NewKeyPadVal;
  data[0] = display.encodeDigit(InputDigit1);
  display.setSegments(data);
//----------------------------------------------------
delay(400);
  while(Scan_4x3_keypad() == 15)
  delay(1);
  NewKeyPadVal = Scan_4x3_keypad();
  InputDigit2 = NewKeyPadVal;
   data[1] = display.encodeDigit(InputDigit2);
  display.setSegments(data);
//----------------------------------------------------
delay(400);
  while(Scan_4x3_keypad() == 15)
  delay(1);
  NewKeyPadVal = Scan_4x3_keypad();
  InputDigit3 = NewKeyPadVal;
   data[2] = display.encodeDigit(InputDigit3);
  display.setSegments(data);

//----------------------------------------------------
delay(400);
  while(Scan_4x3_keypad() == 15)
  delay(1);
  NewKeyPadVal = Scan_4x3_keypad();
  InputDigit4 = NewKeyPadVal;
   data[3] = display.encodeDigit(InputDigit4);
  display.setSegments(data);

//-----------------------------------------------------

// A continuación las 4 líneas de código para activar el buzzer cada segundo
  //digitalWrite(A0, HIGH);
   //delay(150);
   //digitalWrite(A0, LOW);
   //delay(150);
}

TimerCount(); //Cuenta regresiva
 
}

int TimerCount()
{

  digitalWrite(A0, HIGH);
   delay(250);
   digitalWrite(A0, LOW);
   delay(250);
  InputDigit4--;
  delay(80);
  if(InputDigit4 == -1)
  {
    InputDigit4 = 9;
    InputDigit3--;
  }
  if(InputDigit3 == -1)
  {
    InputDigit3 = 9;
    InputDigit2--;
  }
   if(InputDigit2 == -1)
  {
    InputDigit2 = 9;
    InputDigit1--;
  }
  data[0] = display.encodeDigit(InputDigit1);
  data[1] = display.encodeDigit(InputDigit2);
  data[2] = display.encodeDigit(InputDigit3);
  data[3] = display.encodeDigit(InputDigit4);

 
}


 void IfZero()  //Aqui se activa el bizzer intermitente cuando el contador llega a cero
 {
 if(InputDigit1 == 0 && InputDigit2 == 0 && InputDigit3 == 0 )
 {
   digitalWrite(A0, HIGH);
   delay(100);
   digitalWrite(A0, LOW);
   delay(100);
 }
 
 }

  int Scan_4x3_keypad()
{
  int keypadVal = 15;
  //----------Find 3,6,9,* ----
  digitalWrite(A3, LOW);
  digitalWrite(A2, HIGH);
  digitalWrite(A1, HIGH);
  if(digitalRead(9) == LOW) 
  keypadVal = 3;
  if(digitalRead(8) == LOW)
  keypadVal = 6; 
  if(digitalRead(7) == LOW)
  keypadVal = 9;
  if(digitalRead(6) == LOW)
  keypadVal = 10;// 10 = #
  //---------------------------

  //----------Find 2,5,8,0 ----
  digitalWrite(A3, HIGH);
  digitalWrite(A2, LOW);
  digitalWrite(A1, HIGH);
  if(digitalRead(9) == LOW)
  keypadVal = 2;
  if(digitalRead(8) == LOW)
  keypadVal = 5;
  if(digitalRead(7) == LOW)
  keypadVal = 8;
  if(digitalRead(6) == LOW)
  keypadVal = 0;
  //---------------------------

  //----------Find 1,4,7,* ----
  digitalWrite(A3, HIGH);
  digitalWrite(A2, HIGH);
  digitalWrite(A1, LOW);
  if(digitalRead(9) == LOW)
  keypadVal = 1;
  if(digitalRead(8) == LOW)
  keypadVal = 4;
  if(digitalRead(7) == LOW)
  keypadVal = 7;
  if(digitalRead(6) == LOW)
  keypadVal = 11;// * = 11

  return keypadVal;
  //---------------------------
}


A ver si podéis echarme una mano.

PD: Hay algún apartado de presentaciones en el foro y tal? No lo he encontrado ni en español ni en internacional.

Muchas gracias desde el sur!!
Unos dias se nace y otros se aprende...

Retuit

Hola,

¿Alguien puede ayudarme o darme referencias para subsanar este problema que tengo?

Muchas gracias!!
Unos dias se nace y otros se aprende...

Retuit

He estado viendo y supongo que debo usar Millis y no delay, pero es algo complicado para mi. Estoy empezando en esto y agradecería algo de ayuda, por favor.

Un saludo!!
Unos dias se nace y otros se aprende...

IgnoranteAbsoluto

Efectivamente Retuit, necesitas millis() y máquinas de estado. No se parece mucho a lo que tú estás tratando de hacer, pero en el post Orientación para proyecto timer puse como puesta de solución varias versiones de un programa de un conteo regresivo a la vez hacía un par de cosas más. Tal vez el código te sirva para hacerte una idea de cómo hacer lo que quieres. Por ejemplo, el parpadeo del LED de mi código podría ser el pitido del buzzer que tú quieres hacer.

Es más para que tengas una idea de cómo hacerlo que el que adaptes mi código al tuyo. Casi siempre es mejor empezar de cero inspirándote en otro código que tratar de adaptar ese otro código a tu necesidad.

Retuit

Muchísimas gracias, compañero.

Voy a echarle un vistazo a tu post y os cuento. :D

He empezado con un libro de C, que se supone que es el pilar, aunque no es tan igual como yo pensaba. o quizás aún no he llegado a la parte que toca este tema.

Os comento cuando lo ejecute y lo adapte.

Un saludo!!
Unos dias se nace y otros se aprende...

David1980

@Retuit
hola disculpe por colgarme de este post, pero es innecesario abrir otro topic, porque básicamente necesito justamente este código, ya lo probe y funciona muy bien, solo me gustaría que me digan como modificar el este código para usar la tecla # para iniciar el contador descendente, y el * para volver pausar el tiempo...
pd: lei el post de orientation de IgnoranteAbsoluto, pero yo recién estoy empezando a programar, y e elegido arduino por ser algo mas sencillo de aprender... espero no haber quebrado ninguna regla, un saludo...



Moderador:
No repitas lo que se lee arriba

surbyte

Si un hilo tiene mas de 4 meses sin movimientos entonces debes abrir uno nuevo.
Por esa razón se ha cerrado. Solo el autor tiene el derecho de continuarlo.

Go Up