Pagina 1 di 1

da Delay a Millis

Inviato: 08 dic 2016, 09:42
da Emanuele1993
Ragazzi buon giorno, ho realizzato un piccolo progettino usando la funzione delay non sapendo che quest ultima blocca il programma e che arduino non può eseguire nessun altro processo in quel tempo scritto accanto al delay. Questo fa si che al cambiamento di stato del sensore il tutto non accada immediatamente, ma con ritardi. potete aiutarmi a scriverlo con il millis? ho fatto svariate prove, ma senza alcun risultato. ecco il programma:

Codice: Seleziona tutto

int sensore = 9;
int piezo = 11;

void setup() {
  pinMode(sensore, INPUT);
  pinMode(piezo, OUTPUT);
}


void loop() {


  if (digitalRead(sensore = LOW)) {
    tone(piezo, 1397 , 600); //pin,frequenza(fa-re),durata
    tone(piezo, 1175, 600);
    delay(12000);

  } else if (digitalRead(sensore = HIGH)) {
    tone(piezo, 1397 , 600); //pin,frequenza(fa-re),durata
    tone(piezo, 1175, 600);
    delay(2000);
  }
}
Qualcuno gentilmente riuscirebbe a farmelo capire? :help: :help: :help:

Re: da Delay a Millis

Inviato: 10 dic 2016, 10:03
da lukkino
Ciao

Iniziamo con il correggere il codice... quando richiami una funzione non puoi passare un parametro valorizzandolo... mi spiego:

Quando scrivi

Codice: Seleziona tutto

if (digitalRead(sensore = LOW))
tu richiami la funzione digitalRead passando il parametro del pin sensore e valorizzando a livello basso LOW... non otterai nessun risultato da quello che hai scritto...

Devi scrivere in questo modo

Codice: Seleziona tutto

if (digitalRead(sensore) == LOW)
e

Codice: Seleziona tutto

} else if (digitalRead(sensore) ==HIGH) {
Dopo aver corretto questo codice esattamente come deve funzionare il sistema? Cioè deve suonare sempre e cambiare stato quando avviene un evento sul sensore?

Ora come ora se il livello del sensore è basso hai un ritardo di 12 secondi, se è alto hai un ritardo di 2 secondi

Ciao

Re: da Delay a Millis

Inviato: 10 dic 2016, 22:42
da Emanuele1993
Esatto..deve trasmettere gli stessi suoni impostati solo che con il sensore spento,questi devono suonare entrambi ogni 12 sec;a sensore acceso entrambi ogni 2 sec.
Grazie

Re: da Delay a Millis

Inviato: 11 dic 2016, 10:24
da lukkino
Ti allego qui del codice

Codice: Seleziona tutto

int sensore = 9;
int piezo = 11;


// variabile per gestire il ritardo nel suono
int ritardo = 0;

// intervallo massimo del loop di arduino
int loop_delay = 100;


// setup iniziale
void setup() {
  pinMode(sensore, INPUT);
  pinMode(piezo, OUTPUT);
}


// ciclo principale
void loop() {
    
    // leggo il sensore
    int valore_sensore = digitalRead(sensore);
    
    // eseguo suono  se ritardo è nullo
    if(sensore == HIGH) {
        if(ritardo == 0) {
            tone(piezo, 1397 , 600); //pin,frequenza(fa-re),durata
            tone(piezo, 1175, 600);
            ritardo = loop_delay * 20; // 2 secondi (100 * 20 vedi valore di loop_delay)
        }
    } else {
        if(ritardo == 0) {
            tone(piezo, 1397 , 600); //pin,frequenza(fa-re),durata
            tone(piezo, 1175, 600);
            ritardo = loop_delay * 120; // 12 secondi (100 * 120 vedi valore di loop_delay)
        }
    }
    
    // attendo un periodo massimo prima di rifare il loop
    delay(loop_delay);
    
    // decremento la variabile ritardo
    ritardo -= loop_delay;
    if(ritardo < 0) {
        ritardo = 0;
    }
}
Non l'ho testato per cui vedi se ti da errori o funziona

Ciao

Re: da Delay a Millis

Inviato: 11 dic 2016, 17:24
da Emanuele1993
Grazie mille...ovviamente ho visto che non è stato realizzato con la logica millis, ma con il loop delay(non conoscevo questa funzione).grazie ancora,il prima possibile lo proverò :D