if e else

salve a tutti,sono nuovo e mi presento.
mi chiamo massimo e chatto da viterbo.
sto facendo amicizia con arduino,mi sto impegnando ma non è così semplice come mi aspettavo.
vi pongo subito il mio problema:

void setup (){
pinMode(A0,INPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(A2,HIGH);
digitalWrite(A1,LOW);
Serial.begin(9600);
 }
void loop (){
Serial.println(analogRead(A0));
delay(1000);
if (analogRead(A0) < 500)
digitalWrite(13,LOW);
delay(500);
digitalWrite(13,HIGH);
delay(500);
else
digitalWrite(13,LOW);
}

questo è quello che vorrei far fare ad un sensore ir...
ma mi da errore
perchè non posso mettere nessun delay dopo "if"???
in questo modo mi da errore!!!

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo 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... Grazie.
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.

Studiati bene la sinatssi del IF .. ELSE perché ... manca qualche cosa ... :wink:

Guglielmo

{chissà cosa manca...}

Un entrata analogica non puó essere definita come entrata digitale se la vuoi usare come analogica.

Cosa intendi per sensore IR? Uno di quelli per ricevere i comandi di un telecomando a IR?

Ciao Uwe

Forse volevi fare questo?

void loop ()
{
Serial.println(analogRead(A0)); delay(1000);

if(analogRead(A0)<500)
  {
  digitalWrite(13,LOW); delay(500);
  digitalWrite(13,HIGH); delay(500);
  }
else digitalWrite(13,LOW);
}

Se non metti le parentesi graffe dopo if o else, come conseguenza viene eseguita solo la prima istruzione; ciò che segue viene eseguito comunque.

grazie e scusate se non ho letto il regolamento anticipatamente.
mi sono appena presentato sull'apposita pagina.
grazie per le risposte e....ops! le graffe { }
per sensore ir intendo quello di prossimità, con un diodo e un fotodiodo.
può arrivare a rilevare oggetti fino a 20 cm.
rileggerò ossessivamente questa parte riguardante l'if e l'else,
riproverò lo sketch

> maxtesla79: ti è già stato detto nel post#1, comunque ... ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post iniziale (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie.

Guglielmo

ok ho racchiuso il vecchio codice e oggi ho provato il nuovo sketch.
funziona come volevo!
grazie per la vostra pazienza.

void setup (){
  pinMode(A0,INPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(A2,HIGH);
digitalWrite(A1,LOW);
Serial.begin(9600);
  }
void loop (){
 Serial.println(analogRead(A0));
 delay(1000);
 if (analogRead(A0) < 500)
 {digitalWrite(13,LOW);
 delay(500);
 digitalWrite(13,HIGH);
 delay(500);}
 else digitalWrite(13,LOW);
 }

Dovresti farlo anche nel primo messaggio.

in realtà ci ho provato,credo di aver fatto come spiega gpb01, ma si vedono solo i segni ">" "<" all'inizio e alla fine dello sketch.
sicuramente ho tralasciato qualcosa.

maxtesla79:
in realtà ci ho provato,credo di aver fatto come spiega gpb01, ma si vedono solo i segni ">" "<" all'inizio e alla fine dello sketch.

Emmm ... quelli sono i simboli che vedi sul "bottone" che devi premere per inserire i TAG ... come ti ho scritto "sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra" :slight_smile:

Guglielmo

Devi scrivere
par.quadra aperta code par.quadra chiusa

all'inizio e
par.quadra aperta /code par.quadra chiusa

alla fine del codice.

.... oppure selezioni il il testo interessato e poi fai clic su </>

Adesso è sistemato anche nel primo messaggio.

grazie per i vostri consigli.
sono molto emozionato,sto ampliando lo sketch e fa quasi quello che voglio.
se pigio il pulsante parte il loop ma se lo mollo si ferma tutto....
stasera farò una ricerca al riguardo.
questo "arducoso" è pazzesco!!!!

int green_led=7;
int red_led=8;
int pulsante=9;
int stato_pulsante=0;
void setup (){
  pinMode(A0,INPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(13,OUTPUT);
  pinMode(red_led,OUTPUT);
  pinMode(green_led,OUTPUT);
  pinMode(pulsante,INPUT);
  digitalWrite(A2,HIGH);
  digitalWrite(A1,LOW);
  Serial.begin(9600);
}
void loop (){
  Serial.println(analogRead(A0));
  delay(100);
  stato_pulsante=digitalRead(pulsante);
  if(analogRead(A0)<500&&stato_pulsante==1)
  {digitalWrite(green_led,HIGH);
  digitalWrite(red_led,LOW);
  digitalWrite(13,HIGH);
  delay(50);
  digitalWrite(13,LOW);
  delay(300);}
  else digitalWrite(13,LOW);
  digitalWrite(red_led,HIGH);
  digitalWrite(green_led,LOW);
}

In realtà il loop "parte sempre", ovvero si ripete sempre, essendo - appunto - un loop.
Sei tu che leggi sempre, ad ogni giro, il pulsante con:

stato_pulsante=digitalRead(pulsante);

se vuoi creare un sistema che cambia stato quando lo premi e lo lasci, devi agire diversamente.

Per prima cosa occorre eliminare i delay, infatti se premi - rilasci il pulsante, il programma se ne accorge solo se mentre è premuto sta eseguendo l'istruzione sopra citata, quindi devi fare in modo che tale istruzione venga eseguita con la maggiore frequenza possibile o devi usare un interrupt.

P.S.
Guarda fra gli esempi il codice di blink without delay

ok,sono arrivato a questo:

int green_led=7;
int red_led=8;
int pulsante=9;
int stato=0;
int val=0;
void setup (){
  pinMode(A0,INPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(13,OUTPUT);
  pinMode(red_led,OUTPUT);
  pinMode(green_led,OUTPUT);
  pinMode(pulsante,INPUT);
  digitalWrite(A2,HIGH);
  digitalWrite(A1,LOW);
  Serial.begin(9600);
}
void loop (){
  Serial.println(analogRead(A0));
  delay(100);
  if(val==1) {
    (stato=1-stato);
  }
  stato=digitalRead(pulsante);
  if(analogRead(A0)<500&&stato==1)
  {digitalWrite(green_led,HIGH);
  digitalWrite(red_led,LOW);
  digitalWrite(13,HIGH);
  delay(50);
  digitalWrite(13,LOW);
  delay(300);}
  else digitalWrite(13,LOW);
  digitalWrite(red_led,HIGH);
  digitalWrite(green_led,LOW);
}

il problema è che vorrei far partire il loop con una sola pressione del pulsante, mantenendo il led verde acceso fino a che l'infrarosso non sente più l'ostacolo e quindi allo stop del loop stesso e all'inversione dei pin led.
così com'è adesso devo mantenere il pulsante premuto e comunque i led si accendono entrambi a fasi alterne.

Grazie paulus!
Mi sono accorto solo ora della pagina 2.....
XD
Seguirò il tuo consiglio!