ciao a tutti, ho un problema che sembra semplice ma mi sta complicando un po.
ho un progetto creato con sensore a tasteggio (quelli gialli in vendita appositamente x arduino)
devo fare in modo che (in questa sequenza):
il sensore rileva l'oggetto
passano 20 secondi e rifa' un altro controllo
in quel caso se il sensore è sempre "attivo" fa uscire un segnale di output
attende tot secondi che gli imposto (esempio 3 secondi)
rimanda lo stesso segnale di output e cosi via sempre ogni 3 secondi
se invece
il sensore rileva l'oggetto
e dopo 10 secondi l'oggetto si sposta lui non fa nulla
dato che arduino fa costantemente il loop del programma...è possibile farlo?
si all'incirca il concetto l'ho capito ..ma nn riesco a capire come possa funzionare nel mio caso
ti allego come l'ho fatto io.
funziona nel senso che se passo la mano davanti al sensore e la tolgo non succede nulla, se la tengo fissa sul sensore lui fa passare 20 secondi, attiva l'uscita.... poi attende tot secondi esempio 5 secondi (funzione stato_inc / stato_dec) e poi riattende i 20 secondi...riattiva l'uscita e cosi via.
in pratica fa all'inizio solo 20.....poi dopo sempre 20 + 5
invece a me serve che se passo la mano attende 20 secondi , attiva...poi attende tot secondi impostati (esempio 5secondi) riattiva...poi altri tot secondi ..riattiva e cosi via.
void loop() {
//INIZIO FUNZIONE *********************************************************************************
while (digitalRead(FOTOCELLULA_PIN) == LOW) //riceve il segnale della fotocellula
{
delay(20000); //tempo di attesa di 20 secondi dopo la rilevazione della fotocellula
mode = ACTIVE;
if (digitalRead(FOTOCELLULA_PIN) == LOW)
digitalWrite(FOTOCAMERA_PIN, HIGH); // da il contatto del 4N25
digitalWrite(LED_PIN, HIGH); // accende il led notifica
delay(500); //mantiene per 0.5 secondi
digitalWrite(FOTOCAMERA_PIN, LOW); // toglie contatto del 4N25
delay(tempo * 1000); //ritardo in millisecondi = 1 secondo
digitalWrite(LED_PIN, LOW); // spegne il led notifica
}
stato_inc = digitalRead(pulsante_inc); //
if (stato_inc != last_stato_inc) {
if (stato_inc == LOW) {
tempo = tempo + 1; // incrementa di 1 secondo
}
}
last_stato_inc = stato_inc;
stato_dec = digitalRead(pulsante_dec); //
if (stato_dec != last_stato_dec) {
if (stato_dec == LOW) {
tempo = tempo - 1; // decrementa di 1 secondo
if ( tempo <= 1 ) {
tempo = 1 ;
}
}
}
last_stato_dec = stato_dec ;
if ((mode == ACTIVE) && (digitalRead(FOTOCELLULA_PIN) == LOW))
{
digitalWrite(FOTOCAMERA_PIN, LOW); // toglie il contatto del 4N25
digitalWrite(LED_PIN, LOW);
mode = STANDBY;
}
// FUNZIONE AUMENTO DECREMENTO PULSANTI (stato_inc / stato_dec ) *********************************************************************************
lcd.setCursor(7, 1);
lcd.print(tempo);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print("Sec.");
lcd.setCursor(15, 1);
lcd.write(2);
}
Manca tutta la parte di inizializzazione di variabili. Il codice così non può compilare per cui non è possibile testarlo, almeno nella sintassi.
Hai messo un while con un delay di 20 secondi. E' eccessivo. Devi usare la funzione millis() in modo da non bloccare il programma per un tempo così lungo.
C'è un IF senza parentesi graffe. E' voluto?
l'if mi sa che l'ho dimenticato ma la funzione gira lo stesso..
per quanto riguardo il while ho provato a leggere un po ma mi vado ad incasinare
EDIT
adesso ho risolto impostando solo il tempo iniziale coi pulsanti.
in pratica imposto 20 secondi...se passo la mano sopra x 15 secondi e la tolgo non accade nulla
se la lascio per piu di 20 secondi attiva l'uscita 1 vola...e poi la riattiva dopo altri 20 secondi e cosi via
cosi va gia bene...
perfetto! cosi in pratica attende i 20 secondi iniziali...e poi se il sensore è sempre "attivo" attente il tempo che gli viene impostato tramite pulsanti.
è ottimo grazie!!!
ora devo solo vedere se riesco a creare uno spazio per altri due tasti (o mettere uno switch utilizzando i 2 tasti come fossero 4) e impostare entrambi i tempi di attesa
Ti consiglio di aggiungere un pulsante di STOP forzato da verificare all'interno dei due cicli.
E' probabile che tu voglia interrompere la procedura se qualcosa non va bene.