da Delay a Millis

Tutto sull'Arduino e la sua grande famiglia... Atmel AVR, Microchip PIC, ecc...

Moderatori: ragno, tapino, alez, zulu, davidea

Rispondi
Emanuele1993
Messaggi: 4
Iscritto il: 08 dic 2016, 09:31

da Delay a Millis

Messaggio 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:
Emanuele:)
lukkino
Messaggi: 1086
Iscritto il: 20 gen 2007, 09:49

Re: da Delay a Millis

Messaggio 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
VDRBOX: GA-K8NS, AMD Sempron 2600+, Hauppauge Nexus 2.1, LFS
Emanuele1993
Messaggi: 4
Iscritto il: 08 dic 2016, 09:31

Re: da Delay a Millis

Messaggio 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
Emanuele:)
lukkino
Messaggi: 1086
Iscritto il: 20 gen 2007, 09:49

Re: da Delay a Millis

Messaggio 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
VDRBOX: GA-K8NS, AMD Sempron 2600+, Hauppauge Nexus 2.1, LFS
Emanuele1993
Messaggi: 4
Iscritto il: 08 dic 2016, 09:31

Re: da Delay a Millis

Messaggio 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
Emanuele:)
Rispondi