Ciao ragazzi, io avrei bisogno di far suonare un buzzer dopo (per esempio 20) secondi dello switch da 0 a 1 di un servomotore..qualche buon anima che ha voglia di scrivermi passo passo che variabili /funzioni inserire ? sono un neofita
prova a dare un occhiata al programma di esempio (file-->esempi-->digital-->blinkwhitoutdelay)
son piu che certo che sarà un ottima fonte di ispirazione ![]()
poi provia abuttare giu un codice, se funziona ottimo, sennò ce lo poasti e vediamo come procedere, ma la prima mossa spetta a te! ![]()
premesso che Martinix ha assolutamente ragione... giusto per darti uno spunto, in linea di massima potresti fare:
- all'inizio dichiari una variabile che memorizza l'istante di partenza
unsigned long inizio = 0;
- nel codice, dove fai suonare il buzzer
if (condizione switch) { // qui metti la condizione da verificare per far suonare il buzzer
// codice che fa suonare il buzzer...
// poi salvi il momento in cui parte il buzzer
inizio = millis();
}
- infine verifichi se sono passati i 20 secondi
if ((millis() - inizio) >= 20000) {
//codice che spegne il buzzer
}
do per scontato che tu abbia già scritto lo sketch che gestisce il servo, ecc...
@mattprex92: Per capire come funziona e come applicare la funzione millis(), devi a studiare prima QUI, poi QUI ed infine leggere anche QUI e QUI ... vedrai che ti sarà tutto più chiaro ![]()
Guglielmo
Grazie mille ragazzi, siete davvero esaustivi
fratt:
premesso che Martinix ha assolutamente ragione... giusto per darti uno spunto, in linea di massima potresti fare:
- all'inizio dichiari una variabile che memorizza l'istante di partenza
unsigned long inizio = 0;
- nel codice, dove fai suonare il buzzer
if (condizione switch) { // qui metti la condizione da verificare per far suonare il buzzer
// codice che fa suonare il buzzer...
// poi salvi il momento in cui parte il buzzer
inizio = millis();
}
- infine verifichi se sono passati i 20 secondiif ((millis() - inizio) >= 20000) {
//codice che spegne il buzzer
}do per scontato che tu abbia già scritto lo sketch che gestisce il servo, ecc...
inserisco la parte di codice nel quale mi interessa implementarci il millis..
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
if(keypadPin == userPin)\confronto un codice da me inizializzato con quello inserito dal'l utente
{
printOpen();
digitalWrite(GREENLED,HIGH);
servo.write(0);
digitalWrite(BUZZERPIN,HIGH);\ ed è qui che vorrei inserire il millis*
digitalWrite(LIGHTSPIN,HIGH);
lcd.clear();
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
*appena la condizione è soddisfatta , come il servo ruota anche il buzzer suona , io vorrei fare in modo che il buzzer suonasse dopo per esempio 20 secondi dopo la rotazione del servo..senza però tenere in stand by l' intero programma ( come nel caso del delay) ho letto tutti i link postati da guglielmo , sono molto utili , ma nel mio caso specifico qui voi che fareste per rendere questa operazione il piu semplice possibile?
cosi velocemente priam di pertire per casa puoi mettere il buzzere in un altro IF assestante, dove diventa vero se due casi son "verificati", ovvero se il servo si è messo (e li ci metti un flag nel if tuo) in più un'altro controllo sul tempo (20 secondi) quindi if flag == 1 && time => 20000 ......
una cosa del genere..
Martinix:
cosi velocemente priam di pertire per casa puoi mettere il buzzere in un altro IF assestante, dove diventa vero se due casi son "verificati", ovvero se il servo si è messo (e li ci metti un flag nel if tuo) in più un'altro controllo sul tempo (20 secondi) quindi if flag == 1 && time => 20000 ......una cosa del genere..
Credo di aver capito cosa intendi , molto interessante , se magari quando hai tempo potresti scrivermelo come esempio sul codice che ho postato io mi faresti un enorme favore ...
così al volo, senza provarlo...
da qualche parte devi prevedere anche di azzerare il falg del servo
unsigned long inizio = 0;
boolean servoAcceso = false;
boolean buzzerAcceso = false;
if(keypadPin == userPin)\\confronto un codice da me inizializzato con quello inserito dal'l utente
{
printOpen();
digitalWrite(GREENLED,HIGH);
servo.write(0);
servoAcceso = true;
inizio = millis()
// digitalWrite(BUZZERPIN,HIGH);\\ ed è qui che vorrei inserire il millis*
digitalWrite(LIGHTSPIN,HIGH);
lcd.clear();
}
// SE il servo è acceso AND il buzzer è spento AND sono passati 20 secondi = accendi il buzzer
if (servoAcceso && !buzzerAcceso && ((millis() - inizio) > 20000)) {
digitalWrite(BUZZERPIN,HIGH);\\ suona
buzzerAcceso = true;
inizio = millis();
}
// SE il buzzer è acceso AND sono passati 15 secondi = spegni il buzzer
if (buzzerAcceso && ((millis() - inizio) > 15000)) {
digitalWrite(BUZZERPIN,LOW);\\ spegni
buzzerAcceso = false;
}
if(keypadPin == userPin)
{
printOpen();
digitalWrite(GREENLED,HIGH);
servo.write(0);
servoAcceso = true;
inizio = millis();
digitalWrite(LIGHTSPIN,HIGH);
lcd.clear();
if(servoAcceso && buzzerAcceso && ((millis() - inizio) > 20000))
{
digitalWrite(BUZZERPIN,HIGH);
buzzerAcceso = true;
inizio = millis();
}
pinInput();
if(keypadPin == "####")
{
digitalWrite(BUZZERPIN,LOW);
digitalWrite(GREENLED,LOW);
digitalWrite(LIGHTSPIN,LOW);
digitalWrite(REDLED,HIGH);
servo.write(90);
delay(300);
digitalWrite(REDLED,LOW);
lcd.setCursor(0, 0);
lcd.print("CHIUSURA");
lcd.setCursor(0, 1);
lcd.print("IN CORSO");
}
}
else if(keypadPin == adminPin)
{
lcd.setCursor(0, 0);
lcd.print("ADMIN MODE");
delay(1500);
lcd.setCursor(0, 0);
lcd.print("vecchio user pin:");
pinInput();
if(keypadPin == userPin)
{
lcd.setCursor(0, 0);
lcd.print("nuovo user pin:");
pinInput();
userPin = keypadPin;
}
}
else
{
lcd.setCursor(0, 0);
lcd.print("###CODICE###");
lcd.setCursor(0, 1);
lcd.print("###ERRATO!###");
digitalWrite(REDLED,HIGH);
delay(1000);
digitalWrite(REDLED,LOW);
lcd.clear();
}
E' come se non entrasse manco a verificare la condizione per accendere il buzzer...
unsigned long inizio = 0;
boolean servoAcceso = false;
boolean buzzerAcceso = false; sono state dichiarate correttamente in globali..
Causa molta inesperienza e complice stanchezza ho sicuramente cannato qualcosa..magari anche di ovvio....
@mattprex92: in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).
Guglielmo
E come può entrarci?
inizio = millis();
digitalWrite(LIGHTSPIN,HIGH);
lcd.clear();
if(servoAcceso && buzzerAcceso && ((millis() - inizio) > 20000))
{
Tra quando dai un valore a inizio e quando controlli se sono passati 20 secondi passerà a malapena qualche millisecondo, per cui la condizione non sarà mai vera!
per come l'ho pensata io, l'if servoAcceso va messa fuori dall'if keypadPin.
inoltre nell'if servoAcceso dovrebbe andare un ! (NOT) davanti a buzzerAcceso.
però sarebbe meglio vedere l'intero sketch perché non è detto che la mia soluzione vada bene nel tuo caso... dipende dalla logica dell'intero programma...
Io vorrei che cominciasse a contare quando soddisfa la prima condizione (keypadpin= userpin) qui il servo fa la prima rotazione...dopo 20 secondi attiva il pin del buzzer , ed il buzzer suona finche non entro nella sottocondizione (keypadPin=####) dove rimetto il buzzerpin a LOW..Questa che ho postato è la parte di codice dove "ragiona" il resto sono solo dichiarazioni di funzioni tipo il pininput() per l' inserimento della key oppure per il PrintOpen() per stampare a schermo qualcosa preimpostato prima..
E settaggio dei pin (LOW or HIGH) in setup..
Altrimenti con la libreria timer.h?
prova a spostare questo if
if(servoAcceso && !buzzerAcceso && ((millis() - inizio) > 20000))
{
digitalWrite(BUZZERPIN,HIGH);
buzzerAcceso = true;
}
nel loop() fuori dall'altro if.
niente da far..
così a pezzi risulta difficile capire dov'è il problema.
prova a postare l'intero sketch.
sicuro di aver copiato correttamente lo sketch?
a me non lo compila proprio... c'è qualche problema sulle graffe.