leo72:
Mi spieghi i 3 led come li piloti? Vedo che li hai messi 2 su un pin ed il 3° su un secondo pin, ma tutti e 3 usano poi una stessa R. Inoltre sul 3° pin c'è anche un deviatore.
allora il deviatore sarebbe lo switch che attiva la bomba, quando la bomba è attiva uno dei led deve essere acceso.
gli altri 2 led sarebbero i puntini tra i display a segmenti (una cosa molto scenica)
ho visto che a volte la resistenza viene messa anche così, è sbagliato? 
metto il codice "grezzo" (fatto in una mezzoretta e non verificato ma lo compila correttamente)
int latchpin = 15; // uso gli analogici
int clockpin = 14;
int datapin = 16;
int ledpunti = 13;
int buzzer = 12;
int piuminuti = 5;
int menominuti = 4;
int piusecondi = 3;
int menosecondi = 2;
unsigned long piuminutilast;
unsigned long menominutilast;
unsigned long piusecondilast;
unsigned long menosecondilast;
int delaytime = 350;
int minuti = 5;
int secondi = 0;
int attiva = 19; // A5
boolean stat = 0;
byte numero[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0x9E, 0xE0, 0xFE, 0xF6};
unsigned long tempo;
unsigned long start;
unsigned long lastshift;
unsigned long puntilast;
boolean puntistat = 0;
void setup() {
pinMode(latchpin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(datapin, OUTPUT);
pinMode(piuminuti, INPUT);
pinMode(menominuti, INPUT);
pinMode(piusecondi, INPUT);
pinMode(menosecondi, INPUT);
pinMode(attiva, INPUT);
pinMode(ledpunti, OUTPUT);
pinMode(buzzer, OUTPUT);
piuminutilast = millis();
menominutilast = millis();
piusecondilast = millis();
menosecondilast = millis();
}
void loop() {
if(digitalRead(attiva) == HIGH && stat == 0) { // si attiva la bomba
stat = 1;
start = millis();
tempo = ((minuti*60)+secondi)*1000;
lastshift = millis();
}
if(digitalRead(attiva) == LOW && stat == 1) { // bomba disinnescata
stat = 0;
}
if(millis()-start >= tempo && stat == 1) { // bomba innescata e timer scaduto suona finchè non viene disarmata
while(digitalRead(attiva) == HIGH) {
digitalWrite(buzzer, HIGH);
}
}
if(stat == 0) { // se la bomba non è armata si può procedere alla regolazione
puntistat = 1; // i led rimangono accesi
if(digitalRead(piuminuti) == HIGH && millis()-piuminutilast >= delaytime) {
if(minuti < 99) minuti++;
else minuti = 0;
}
if(digitalRead(menominuti) == HIGH && millis()-menominutilast >= delaytime) {
if(minuti > 0) minuti--;
else minuti = 99;
}
if(digitalRead(piusecondi) == HIGH && millis()-piusecondilast >= delaytime) {
if(secondi < 59) secondi++;
else secondi = 0;
}
if(digitalRead(menosecondi) == HIGH && millis()-menosecondilast >= delaytime) {
if(secondi > 0) secondi--;
else secondi = 59;
}
// check pulsanti + e -, nel caso secondi sia = 60 allora secondi = 0, nel caso minuti siano = 99 non vai oltre, se minuti = 0 non vai sotto, ricorda debounce e di usare shiftout per scirvere il valore dei minuti e secondi
}
if(stat == 1) { // se la bomba è armata fa il countdown
if(minuti > 0 && secondi > 0) {
if(millis()-lastshift >= 1000) {
lastshift = millis();
if(secondi == 0 && minuti != 0) {
minuti--;
secondi = 59;
}
else secondi--;
}
}
if(millis()-puntilast >= 1000) {
puntistat = !puntistat;
puntilast = millis();
}
}
if(puntistat == 1) digitalWrite(ledpunti, HIGH);
else digitalWrite(ledpunti, LOW);
scrivi(minuti, secondi); // aggiorna il contatore
}
void scrivi(int minu, int sec) {
byte dascrivere[] = {0xFC,0xFC,0xFC,0xFC}; // metto tutto a zero
dascrivere[0] = numero[(minu/10)]; // separo la cifra delle decine da quella delle unità
dascrivere[1] = numero[(minu-(minu/10))]; // separo la cifra delle unità da quella delle decine
dascrivere[2] = numero[(sec/10)]; // separo la cifra delle decine da quella delle unità
dascrivere[3] = numero[(sec-(sec/10))]; // separo la cifra delle unità da quella delle decine
for(int i=0; i=3; i++) {
digitalWrite(latchpin, HIGH);
shiftOut(datapin, clockpin, MSBFIRST, dascrivere[i]); // se i caratteri sono errati modificare MSBFIRST in LSFBFIRST
digitalWrite(latchpin, LOW);
}
}