Vai al contenuto
PLC Forum


Giochi Di Luce


Messaggi consigliati

Inserito:

buonasera a tutti

avrei bisogno del vostro aiuto per la realizzazione di un proggetto da fare.

vorrei realizzare 3 giochi di luce gestiti da un commutatore a 3 uscite in modo che in posizione 1 fa un gioco, in posizione 2 fa un altro gioco e in posizione 3 fa un altro gioco ancora.

per testarlo uso un cavallotto che funziona da contatto al posto del commutatore.

far accendere un led con il contatto 1 ci sono riuscito ma mi sono fermato.nella prova l'interruttore 1 accende un led e il 2 dovrebbe fare una intermittenza ma una volta compilato il programma lampeggia sempre il led senza che io do comandi.

qui c'è il codice

int int1 = 2;
int int2 = 3;
int val1 = 0;
int val2 = 0;


void setup()
{
  pinMode(2,INPUT);
  pinMode(13,OUTPUT);
}
void loop()
{
val1 = digitalRead(int1);
val2 = digitalRead(int2);
if (val1 == LOW)
{
  digitalWrite(13,HIGH);
}
val1 = digitalRead(int1);
if (val1 == HIGH)
{
  digitalWrite(13,LOW);
}
val1 = digitalRead(int1);
val2 = digitalRead(int2);
if (val2 == LOW)
{
  digitalWrite(13,HIGH);
  delay(500);
  digitalWrite(13,LOW);
  delay(500);
}
}

Inserita:

Non hai programmato il pin 3. Poi basta leggere gli ingressi all'inizio di loop le altre letture le puoi togliere.

Ciao.

Inserita:

grazie per l'aiuto ma non funziona, come hai detto te che mi ero dimenticato il pin 3 durante la riscrittura, lampeggia in qualsiasi condizione.

allora ho modificato il programma ma adesso lampeggia sempre tranne quando per avere un livello logico basso cioè LOW, metto il pin2 a massa che si spegne tutto,

ecco il codice

int int1 = 2;
int int2 = 3;
int val1 = 0;
int val2 = 0;


void setup()
{
  pinMode(3,INPUT);
  pinMode(2,INPUT);
  pinMode(13,OUTPUT);
}
void loop()
{
val1 = digitalRead(int1);
val2 = digitalRead(int2);
if ((val1 == HIGH) && (val2 == HIGH))
{
  digitalWrite (13,LOW);
}
if ((val1 == LOW) && (val2 == HIGH))
{
  digitalWrite(13,HIGH);
}
if ((val1 == HIGH) && (val2 == LOW))
{
  digitalWrite(13,HIGH);
  delay(500);
  digitalWrite(13,LOW);
  delay(500);
}
}
Inserita:

Se provi mettendo val1 = 0, val2 = 1 ecc. invece di digitalRead il programma funziona.

Quindi è possibile che sia un problema hardware. Hai messo delle resistenze di pull up sugli ingressi?

Inserita:

per fare questi giochi e' adatto il WFSM, che implementa macchine a stati finiti

C'e' un blog a tal riguardo e la libreria che ho scritto io

Inserita:

secondo me a logica umana deve funzionare, l'unica cosa che magari faccio confusione con gli stati di imput.

un pin settato come input e a un livello logico alto vuol dire collegato a 5v, mentre a livello logico basso va collegato a massa? giusto?

intantonfaccio qualche ricerca in merito al WFSM.

magari puo tornare utile

Inserita:

lo trovi in questa sezione del forum

Io no nuso delay bloccanti nei programmi

Con il WFSM puoi intersecare diversi sequenziatori tra loro , legarli ect

Inserita:
int int1 = 2;
int int2 = 3;
int val1 = 0;
int val2 = 0;


void setup()
{
  pinMode(3,INPUT);
  pinMode(2,INPUT);
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
}
void loop()
{
  val1 = digitalRead(int1);
  val2 = digitalRead(int2);
  if(val1 == LOW)
  {
    digitalWrite (13,HIGH);
  }
  else if (val2 == LOW)
  {
    digitalWrite(13,HIGH);
    delay(500);
    digitalWrite(13,LOW);
    delay(500);
  }
  else digitalWrite(13,LOW);
}

Ho modificato il programma: in posizione 1 (val1 = 0) il led è acceso, in posizione 2 (val2 = 0) lampeggia, negli altri casi è spento.

Era quello che volevi?

Ciao.

Inserita:

esatto l'ho provato e a spanne direi che vunziona.

ultima domanda, volendo aggiungere ancora un int3 devo mettere un altro else if giusto?

Inserita:

ho aggiunto un altro else if in coda al precedente ma è come non riconoscesse il pin 4(cioè int3).dove sbaglio?

Inserita:

si+esatto

Inviato dall'app. Mobile di PLC Forum da GT-I8190N

Inserita:
int int1 = 2;
int int2 = 3;
int int3 = 4;
int val1 = 0;
int val2 = 0;
int val3 = 0;


void setup()
{
  pinMode(3,INPUT);
  pinMode(2,INPUT);
  pinMode(4,INPUT);
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
}
void loop()
{
  val1 = digitalRead(int1);
  val2 = digitalRead(int2);
  val3 = digitalRead(int3);
  if(val1 == LOW)
  {
    digitalWrite (13,HIGH);
  }
  else if (val2 == LOW)
  {
    digitalWrite(13,HIGH);
    delay(500);
    digitalWrite(13,LOW);
    delay(500);
  }
  else if (val3 == LOW)
  {
    digitalWrite(13,HIGH);
    delay(100);
    digitalWrite(13,LOW);
    delay(500);
  }
  else digitalWrite(13,LOW);
}

Ho provato questo esempio e funziona.

Inserita:

a vederlo cosi mi sembra come lo avevo fatto io, magari ho tralasciato qualche passaggio. quando torno da lavoro provo. intanto grazie

Inviato dall'app. Mobile di PLC Forum da GT-I8190N

Inserita:

non mi funziona. è un mistero, questo è il mio codice pressoche uguale al tuo,

int int1 = 2;
int int2 = 3;
int int3 = 4;
int val1 = 0;
int val2 = 0;
int val3 = 0;

void setup()
{
  pinMode(4,INPUT);
  pinMode(3,INPUT);
  pinMode(2,INPUT);
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
}

void loop()
{
  val1 = digitalRead(int1);
  val2 = digitalRead(int2);
  val3 = digitalRead(int3);

  if (val1 == LOW)
  {
    digitalWrite(13,HIGH);
  }
  
else if (val2 == LOW)
{
  digitalWrite(13,HIGH);
  delay(500);
  digitalWrite(13,LOW);
  delay(500);
}

else if (val3 == LOW)
{
  digitalWrite(13,HIGH);
  delay(2000);
  digitalWrite(13,LOW);
  delay(2000);
}
else 
      digitalWrite(13,LOW);

}



Inserita:

Hai collegato a vcc tutti gli ingressi meno int3 collegato invece a massa?

Inserita:

no,e ora spiego il motivo.

il proggetto completo sarebbe stato tramite un commutatore 1 2 3 4, in base alla posizione dello stesso, quello di cambiare i giochi di luce, che sarebbero in posizione 1 tutto spento; in posizione 2, tramite led rgb, quello di fare una sequenza di colori; in posizione 3, effettuare un aumento di intensita fino al 100% per poi passare a un altro colore;mentre la terza posizione di fare un aumento di intensita e una volta arrivato al massimo va in diminuzione fino a arrivare a 0 per poi cambiare colore.

per questo motivo non avrei potuto collegare tutti i pin tranne quello interessato a +vcc, visto la semplicita nel reperire un commutatore con contatti n.o.

pensavo che per testare il tutto senza parte hardware(uscita di potenza, led e commutatore) avrei potuto fare una cosa del genere del tipo di collegare il pin interessato a massa e lasciare senza collegamenti gli altri 2 pin.

magari casco in queste cose che per certe persone possono essere banali, ma iniziando da zero per me non è molto semplice.

Inserita:

Gli ingressi lasciati liberi di solito sono in uno stato indefinito e sono sensibili ai disturbi. Per questo motivo si usa collegare agli ingressi un resistore verso massa (pull-down) o un resistore verso vcc (pull-up) in modo da fissare il livello logico dell'ingresso. Nel nostro caso servono delle resistenze di pull-up che tengono gli ingressi a livello alto. Un valore normalmente usato è di 10K Ohm, andrebbe bene anche da 20K, 30K o anche 100K. Aumentando il valore si riduce la potenza dissipata ma diminuisce l'immunità al rumore. I microcontrollori di solito permettono di collegare dei pull-up o pull-down interni, selezionabili da programma.

Ciao.

Inserita:

Ah ecco, allora non mi resta che mettere nel setup i pin di ingresso a livello logico alto giusto? Appena riesco provo

Inserita:

fantastico, funziona tutto alla perfezione, e quando non ci sono pin di input collegati il led è spento, proprio come volevo.

adesso provo a inserire i vari giochi di luce...

grazie mille

Inserita:

eccomi di nuovo con un nuovo problema :angry:

ho fatto un gioco di luce con un led rgb da usare in una posizione dei pin in ingresso ma fa cio che vuole lui e non io.

ho unserito un goto in modo che quando il pin non è piu a livello basso si spegne e fino a qui tutto funzionava,

poi da quando ho inserito questo rgb e avvio il programma, con tutti i pin high quindi deve stare spento, sta acceso fisso, mentre se porto il pin il low, cioe deve eseguire il codice, fa una sequenza random. io invece vorrei che facesse un umento una diminuzione e cambio colore. quindi ad esempio luce blu da 0 a 255, poi da 255 a 0 per poi passare al verde, stesso gioco e poi rosso,per poi cominciare di nuovo dal blu.

dove sbaglio?

mi peoccupa poi la fase iniziale quando dovrebbe stare spento invece esce un arancione fisso.

come componenti questa volta ho usato un 2n2222 per colore quindi 3,e basta, niente resistenze avendo collegato il collettore all'uscita 3,3v di arduino

Inserita:

Senza listato e senza schema è difficile scoprire quello che non va.

In c è meglio non usare il goto se non in casi eccezionali.

Ciao.

Inserita:

Hai ragione solo che sono uscito di casa veloce e mi sono dimenticato. Domani quando torno posto subito. Riguardo il goto ho letto in molte discussioni che lo sconsigliato però per uno ai primi gattonamenti come me è stata l'unica cosa che ho trovato e che soprattutto ha funzionato. Appena sono col pc posto il codice

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...