ayuda crear "bomba" con arduino

Hola les cuento, necesito hacer un trabajo que es similar a la funcion de una bomba, necesito ingresar 4 numeros cualquiera a traves del monitor serial y que estos me aparescan en un display de 7 segmentos de 4 digitos multiplexado y de aí que comience una cuenta regresiva. Soy muy nuevo en esto de arduino y no se me ocurre como hacer que los numeros que introdusco por el monitor serial me aparescan en el display...ya tengo la parte de reloj, que me falta hacer que me cuente hacia atras. Si me pueden ayudar se los agradeceria un monton.

int digit1 = 10; // Display pin
int digit2 = 11; // Display pin
int digit3 = 12; // Display pin
int digit4 = 13; // Display pin

int segA = 2; //Display pin
int segB = 3; //Display pin
int segC = 4; //Display pin
int segD = 5; //Display pin
int segE = 6; //Display pin
int segF = 7; //Display pin
int segG = 8; //Display pin

void setup() {
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);

pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT);

pinMode(13, OUTPUT);
}

void loop() {

displayNumber(millis()/50);

}

void displayNumber(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500

#define DIGIT_ON HIGH
#define DIGIT_OFF LOW

long beginTime = millis();

for(int digit = 4 ; digit > 0 ; digit--) {

//Turn on a digit for a short amount of time
switch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
break;
}

//Turn on the right segments for this digit
lightNumber(toDisplay % 10);
toDisplay /= 10;

delayMicroseconds(DISPLAY_BRIGHTNESS);
//Display digit for fraction of a second (1us to 5000us, 500 is pretty good)

//Turn off all segments
lightNumber(10);

//Turn off all digits
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
}

while( (millis() - beginTime) < 10) ;
//Wait for 20ms to pass before we paint the display again
}

//Given a number, turns on those segments
//If number == 10, then turn off number
void lightNumber(int numberToDisplay) {

#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH

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;
}
}

Tienes que leer el puerto serie por si le envias algun numero y luego ese numero cargarlo en una variable.

La variable la divides entre 10000 ,1000, 100 y entre 10 y sacas el digito de las decenas centenas etc...

otra opcion es convertirlo a string y coger el caracter que ocupe cada digito para luego asignarlo al display.

La cuenta atras es un bucle simplemente en el que la variable la decrementas, ej a=a-1 con un delay de 1 segundo ya la tienes.

Si lo ves complicado, ves haciendolo primero con un digito y luego cuando avances ya le añades el resto pero asi consigues definir la estructura.

Al final te quedara algo parecido al proyecto Dharma :smiley:

Hola, entendi las ideas que me das, pero no logro saber como "llevarlas" al arduino, avance en algo pero lo hice con subrutinas, pero creo que tus ideas me harian el programa mas corto, como puedo mostrar en el display los numeros que guardo en el array??

int segmentoA = 2;
int segmentoB = 3;
int segmentoC = 4;
int segmentoD = 5;
int segmentoE = 6;
int segmentoF = 7;
int segmentoG = 8;

int digit1 = 10;
int digit2 = 11;
int digit3 = 12;
int digit4 = 13;
int letra;

void setup()
{
pinMode(segmentoA,OUTPUT);
pinMode(segmentoB,OUTPUT);
pinMode(segmentoC,OUTPUT);
pinMode(segmentoD,OUTPUT);
pinMode(segmentoE,OUTPUT);
pinMode(segmentoF,OUTPUT);
pinMode(segmentoG,OUTPUT);

pinMode(digit1,OUTPUT);
pinMode(digit2,OUTPUT);
pinMode(digit3,OUTPUT);
pinMode(digit4,OUTPUT);

Serial.begin(9600);
delay(500);
}

void loop(){
if(Serial.available()>0)
{
letra=Serial.read();
Serial.write(letra);
if(letra=='1')
{
display1();
one();
}
}
}

void one(){
digitalWrite( 2, HIGH); // A
digitalWrite( 3, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(5, HIGH); // D
digitalWrite(6, HIGH); // E
digitalWrite( 7, HIGH); // F
digitalWrite( 8, HIGH); // G
}

void two(){
digitalWrite( 2, LOW); // A
digitalWrite( 3, LOW); // B
digitalWrite( 4, HIGH); // C
digitalWrite(5, LOW); // D
digitalWrite(6, LOW); // E
digitalWrite( 7, HIGH); // F
digitalWrite( 8, LOW); // G
}

void three(){
digitalWrite( 2, LOW); // A
digitalWrite( 4, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(5, LOW); // D
digitalWrite(6, HIGH); // E
digitalWrite( 7, HIGH); // F
digitalWrite( 8, LOW); // G
}

void four(){
digitalWrite( 2, HIGH); // A
digitalWrite( 3, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(5, HIGH); // D
digitalWrite(6, HIGH); // E
digitalWrite( 7, LOW); // F
digitalWrite( 8, LOW); // G
}

void five(){
digitalWrite( 2, LOW); // A
digitalWrite( 3, HIGH); // B
digitalWrite( 4, LOW); // C
digitalWrite(5, LOW); // D
digitalWrite(6, HIGH); // E
digitalWrite( 7, LOW); // F
digitalWrite( 8, LOW); // G
}

void six(){
digitalWrite( 2, LOW); // A
digitalWrite( 3, HIGH); // B
digitalWrite( 4, LOW); // C
digitalWrite(5, LOW); // D
digitalWrite(6, LOW); // E
digitalWrite( 7, LOW); // F
digitalWrite( 8, LOW); // G
}

void seven(){
digitalWrite( 2, LOW); // A
digitalWrite( 3, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(5, HIGH); // D
digitalWrite(6, HIGH); // E
digitalWrite( 7, HIGH); // F
digitalWrite( 8, HIGH); // G
}

void eight(){
digitalWrite( 2, LOW); // A
digitalWrite( 3, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(5, LOW); // D
digitalWrite(6, LOW); // E
digitalWrite( 7, LOW); // F
digitalWrite( 8, LOW); // G
}

void nine(){
digitalWrite( 2, LOW); // A
digitalWrite( 3, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(5, LOW); // D
digitalWrite(6, HIGH); // E
digitalWrite( 7, LOW); // F
digitalWrite( 8, LOW); // G
}

void zero(){
digitalWrite( 2, LOW); // A
digitalWrite( 3, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(5, LOW); // D
digitalWrite(6, LOW); // E
digitalWrite( 7, LOW); // F
digitalWrite( 8, HIGH); // G
}

void display1(){
digitalWrite(digit2,LOW);
digitalWrite(digit3,LOW);
digitalWrite(digit4,LOW);
digitalWrite(digit1,HIGH);
}

void display2(){
digitalWrite(digit1,LOW);
digitalWrite(digit3,LOW);
digitalWrite(digit4,LOW);
digitalWrite(digit2,HIGH);
}

void display3(){
digitalWrite(digit1,LOW);
digitalWrite(digit2,LOW);
digitalWrite(digit4,LOW);
digitalWrite(digit3,HIGH);
}

void display4(){
digitalWrite(digit1,LOW);
digitalWrite(digit2,LOW);
digitalWrite(digit3,LOW);
digitalWrite(digit4,HIGH);
}