cambio di stato sensore non immediato, aiutooo:)

salve ragazzi, sono nuovo del forum e sono alla scoperta di questo linguaggio di programmazione da qualche mese. ho scritto questo questo programma:

int sensore = 9;
int piezo = 11;


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


void loop() {

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


}else if(digitalRead(sensore=HIGH)){
delay(2000);
tone(piezo, 1397 ,600);    
tone(piezo, 1175, 600);   
}}

e' un sensore di movimento collegato ad un buzzer che emetterà dei suoni. piccolo problema, quando cambia di stato(il sensore(I/0) , questo deve attendere sempre i delay presenti in programma non cambiando quindi il suo stato immediatamente, mi aiutate? Grazieeeee :) :) :)

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Emanuele1993: void loop() { if(digitalRead(sensore=LOW)) { delay ( 12000);

Sintassi errata, ammessa dal C ma non è quel che volevi fare; giusta è:

if(digitalRead(sensore)==LOW)

Consigli: 1.dentro l'IDE usa CTRL+T 2. non usare "int sensore = 9;" ma "const byte sensore=9;"

P.S. delay(12000) vuol dire 12 secondi di attesa!! Arduino è BLOCCATO per 12 secondi!!

>Emanuele1993: … prima di tutto, come ti ha chiesto Nid e nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO

… poi, sempre come ti ha detto Nid, in conformità al suddetto 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) …

… infine, NO, qui noi aiutiamo a correggere gli errori segnaladoli e spiegando cosa c’è che non va, ma … NON facciamo il lavoro per gli altri … mi spiace … :confused:

Guglielmo

Inoltre, #emanuele, io quello che vuoi fare, come lo spieghi al primo post, mica l’ho capito.

scusatemi ora mi sono presentato, ho modificato il messaggio. Grazie per avermi avvisato. comunque, voglio che un buzzer suoni con intervalli di tempo differenti in base allo stato del sensore di vibrazione. se quest'ultimo è spento il buzzer deve suonare delle note ogni 12 sec, se è acceso, ogni 2. il problema è che al cambiamento di stato, da spento ad acceso ed esempio, sono costretto ad aspettare 12 sec a causa del delay. io voglio che questo cambiamento sia immediato, come posso ovviare a questo problema? Grazie

Devi studiarti come si usa la millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che poi ti sarà molto più chiaro come fare ... ;)

Guglielmo

P.S.: Tu stai attualmente usando la delay(), che è una istruzione bloccante, con la millis() dovrai cambiare un po' la logica del programma, ma avrai molta più flessibilità NON avendo "blocchi" nel programma.

va bene,grazie lo stesso..

Emanuele1993: ... solo che nella simulazione con un software ...

... le simulazioni lasciano il tempo che trovano, specie se di mezzo ci sono funzioni come millis().

Il simulatore normalmemnte è infinitamente più lento della vera MCU ... ... che simulatore usi ?

Guglielmo

vitronics simulator per arduino

... se avessi letto le note che accompagnano quel simulatore avresti visto che, come ti dicevo, è MIGLIAIA di volte più lento della vera MCU, quindi .... scordati di simularci qualsiasi cosa usi millis().

Prendi Arduino, mette tante belle Serial.print() nel tuo codice per fare debug e ... provalo nella realtà.

Guglielmo

Ah ... per come vedo che la stai usando ... sarà il caso che ti ristudi bene come si usa la funzione millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che va usata in modo diverso.

Guglielmo

Mi può aiutare almeno a capire dove sto sbagliando? Non voglio che mi scriva il programma(non ci sarebbe alcuna soddisfazione)ma che mi dia qualche input per capire dove sbaglio...

Scusa ... guarda come stai usando tu la millis() e guarda i link che ti ho messo io ... ... ti sembra che la stai usando allo stesso modo ? ? ? ::)

Guglielmo

Io mi trovo meglio usando una variabile di stato. In pratica una piccola macchina a stati finiti. Prova a leggere qui: http://www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/

L'importante è il concetto. Tu hai 2 stati in base allo stato del buzzer. Prima leggi lo stato del buzzer e in base a quello setti lo stato, assegnando anche un tempo di attesa ad un'altra variabile e azzerando . Poi in base allo stato fai un ciclo (unico) con millis tipo quello dell'esempio blinkwithoutdelay con in parametri stabiliti prima.

Poi... se nel codice CONTINUI a fare lo stesso errore che ti ho corretto, come pensi di risolvere ? E' SBAGLIATA: if (digitalRead(sensore = LOW)) { così è corretta: if(digitalRead(sensore)== LOW) {

:)grazie per l aiuto:):)ora provo a studiare qualcosa e a risolvere per poi postare qualcosa

Non conosco la Tone() , ma mi pare sia bloccante, ovvero mentre suona Arduino non può fare altro, un pò come la delay(). Ma nel reference non leggo nulla al riguardo.

Fa niente tanto anche nell altro stato i suoni e il loro valore sono uguali…

nid69ita: Non conosco la Tone() , ma mi pare sia bloccante, ovvero mentre suona Arduino non può fare altro ...

... si, se imposti la durata e non usi la noTone(). Comunque, se si cerca su Google ("arduino tone non blocking"), ci sono librerie per fare quello che fa la Tone() NON bloccanti ;)

Guglielmo

Se non riesci a correggere neppure questo, la vedo dura proseguire: if (digitalRead(sensore == HIGH)) è ancora SBAGLIATA, le parentesi tonde NON le puoi mettere a casaccio