Luci alternate con comando if-else

Ciao a tutti sono nuovo nel forum e da poco sto facendo pratica con arduino uno... XD
Sto seguendo dei tutorial su youtube e vorrei far accendere due led in modo alternato usando però il comando if-else...
Una volta compilato il codice nell'ambiente di sviluppo dice che è corretto ma una volta caricato su Arduino non esegue il ciclo da me richiesto...o meglio pensato :sweat_smile:
Questo è il codice

int box;
void setup(){
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
}
void loop(){
  
  box=digitalRead(12);
  digitalWrite(box,HIGH);
  delay(3000);
if (box==HIGH)
{
  digitalWrite(13,LOW);
  
 }
 else
 {
   digitalWrite(13,HIGH);
 } 
}

cosa ho sbagliato?
Il mio progetto è quello di far accendere prima un led per un tot di tempo(quello collegato al pin12 per 3000millisecondi) e dopo poichè si spegne si deve accendere l'altro led collegato al pin13.
So che posso semplicemente giocare con "delay" e basta ma vorrei imparare ad usare il comando if-else
Grazie :slight_smile:

Come mai leggi lo stato del pin 12, se lo hai dichiarato OUTPUT?

Perche stavo guardando un video di niktorthenat su youtube e ho preso spunto da un suo progetto :roll_eyes:

Ho provato ma mi da errore…

C:\Program Files\Arduino\hardware\arduino\cores\arduino/Arduino.h: In function 'void loop()':
C:\Program Files\Arduino\hardware\arduino\cores\arduino/Arduino.h:99: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'
progetto1:8: error: at this point in file

Ah ecco ...
All'inizio devi porre un led acceso e l'altro spento, questo nel setup.
Dentro il loop controlli se il led a è acceso, lo spegni ed accendi il b, altrimenti (else) spegni il b ed accendi a. Chiuso il ciclo if, metti il delay di 3000.

Scrivi il listato e postalo, poi lo correggiamo insieme. :wink:

int box;
void setup(){
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
}
void loop(){
  
  box=digitalRead(12);
  digitalWrite(box,HIGH);
  delay(3000);
if (box==HIGH)
{
  digitalWrite(11,LOW);
  
 }
 else
 {
   digitalWrite(11,HIGH);
   
 } 
 
}

Adesso pero non si accende nulla...

C'è un errore di concetto: confondi l'uscita con il suo stato!

  box = digitalRead(12);    // in box c'è lo stato dell'uscita 12 (HIGH=1 o LOW=0)
  digitalWrite(box, HIGH); // qui comandi l'uscita box (quindi 0 od 1) in modo che sia HIGH

quindi? scusami ma sto praticamente imparando ora a programmare con Arduino...
dato che l'HTML non serve a nulla in questo caso... :cold_sweat:

int box;
void setup(){
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
}
void loop(){
  
  box=digitalRead(12);
  digitalWrite(box,HIGH);
  
  digitalWrite(11,LOW);
 
if (box==HIGH)
{
  digitalWrite(11,LOW);
  
 }
 else
 {
   digitalWrite(11,HIGH);
   
 } 
delay(3000);
}

Ora è cosi ma si accende solo il led collegato al pin 11

coppolino:
Ciao a tutti sono nuovo nel forum e da poco sto facendo pratica con arduino uno... XD

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Grazie per il consiglio :slight_smile:
Ho messo la descrizione nella sezione da te consigliata :slight_smile:
intanto aspetto :wink:
p.s. se qualcuno può aiutarmi il prima possibile poiche (come detto nella descrizione) ho gli esami integrativi e come argomento facoltativo dell'esame di informatica e sta vorrei portare proprio Arduino come argomento con un modellino...ho creato un semaforo ma vorrei riuscire a creare un qualcosa di più complesso,sopratutto per quanto riguarda la programmazione...con ciò non voglio usare nessuno per i miei scopri ma solo essere aiutato per capire in cosa sbaglio,sia chiaro :slight_smile: Grazie XD

In pratica dicendo digitalRead nn leggi lo stato ma lo leggi come se fosse un input
quindi dovresti creare una variabile e cambiarne il valore ogni volta che cambia lo stato senza usare digitalRead

simonenascivera:
In pratica dicendo digitalRead nn leggi lo stato ma lo leggi come se fosse un input
quindi dovresti creare una variabile e cambiarne il valore ogni volta che cambia lo stato senza usare digitalRead

Sei sicuro di questo? Lo hai provato con uno sketch di test?
A me sembra che il digitalread legga il bit di un registro che esso sia IN o OUT poco importa

Ok…ma devo crearne un’altra oltre quella che ho gia?

Sul sito di arduino dice puoi usarlo solo con input

simonenascivera:
http://arduino.cc/en/Reference/digitalRead
Sul sito di arduino dice puoi usarlo solo con input

In realtà anche se il pin è in output, puoi usare digitalRead() per sapere se è HIGH o LOW (senza dovertelo ricordare tramite una variabile) :wink:

@coppolino, come ti è stato detto, questo è un grosso errore:

box=digitalRead(12);
digitalWrite(box,HIGH);

Leggi dal pin 12 se c'e' HIGH o LOW, in realtà leggi se c'e' 1 oppure 0. Questo valore lo metti in box e poi scrivi sul pin "box" ovvero sul pin 0 o 1 che tra l'altro sono quelli della seriale rx/tx !!!
Hai un pò di confusione.
Ti consiglio di cercare e scaricare da internet i due PDF gratuiti ed in italiano della prof. Tiziana Marsella:

Anche la guida ufficiale di Banzi è ottima per iniziare e costa poco:

P.S. nell IDE usa tasto CTRL+T per sistemare il codice (indentare)

Si so di avere ancora molta confusione anche perche non conoscono il C e sto cercando di imparare con Arduino qualcosa…
In ogni caso se metto digitalWrite me lo segna come errore…

La digitalWrite vuole per forza 2 valori.

Questo il tuo codice funzionante, confrontalo con il tuo e trova le differenze:

int box;
const byte pinLed1=12;
const byte pinLed2=13;

void setup(){
  pinMode(pinLed2,OUTPUT);
  pinMode(pinLed1,OUTPUT);
}

void loop(){
  box=digitalRead(pinLed1);
  if (box==HIGH)
  { digitalWrite(pinLed2,HIGH);
    digitalWrite(pinLed1,LOW);
  }
  else
  { digitalWrite(pinLed2,LOW);
    digitalWrite(pinLed1,HIGH);
  } 
  delay(1000);
}

Chiedo scusa a @Pablos e a @nid69ita

e per cosa? per il digitalread()?
Ma figurati, non ti devi scusare, se qualcuno aveva un dubbio su questa funzione, ora non ce l'ha più :smiley:

ciao

visto che vuoi conoscere l'uso dell'IF
questo pezzo di codice

box=digitalRead(pinLed1);
  if (box==HIGH)
  { digitalWrite(pinLed2,HIGH);
    digitalWrite(pinLed1,LOW);
  }

può essere anche scritto così per semplificare la scrittura

  if (digitalRead(pinLed1)){ 
   digitalWrite(pinLed2,1);
    digitalWrite(pinLed1,0);
  }

come vedi non c'è == .... e non ho caricato inutilmente lo stato su una variabile box che tanto non la useremo più, esso sta a significare "SE il PIN è TRUE"

opz 1) if (digitalRead(pinLed1)){ //se è VERO
opz 2) if (digitalRead(pinLed1)==HIGH){
opz 3) if (digitalRead(pinLed1)==1){
opz 4) if (digitalRead(pinLed1)==TRUE){

opz 1) if (!digitalRead(pinLed1)){ //se NON è VERO
opz 2) if (digitalRead(pinLed1)==LOW){
opz 3) if (digitalRead(pinLed1)==0){
opz 4) if (digitalRead(pinLed1)==FALSE){