Go Down

Topic: seriale e effetti luce con led (Read 1 time) previous topic - next topic

chry2000

ciao a tutti ! ho pensato di fare un programma con visual basic che mi invia sulla seriale delle lettere cosi quando arduino legge queste lettere fa cambiare gli effetti luce il problema è che non funziona ho provato anche a inviare anche le lettere tramite il serial monitor ma non funziona lo stesso
questo è il codice
Code: [Select]

void setup(){
pinMode(8,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
Serial.begin(9600);
}
void loop(){
int tempo;
int sr;
tempo = 100;
sr = Serial.read();
if(sr='a'){
    digitalWrite(7,LOW);
    digitalWrite(8,HIGH);
    delay(tempo);
    digitalWrite(8,LOW);
    digitalWrite(2,HIGH);
    delay(tempo);
    digitalWrite(2,LOW);
    digitalWrite(3,HIGH);
    delay(tempo);
    digitalWrite(3,LOW);
    digitalWrite(4,HIGH);
    delay(tempo);
    digitalWrite(4,LOW);
    digitalWrite(5,HIGH);
    delay(tempo);
    digitalWrite(5,LOW);
    digitalWrite(6,HIGH);
    delay(tempo);
    digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
    delay(tempo);
}
  if(sr='b'){
    digitalWrite(8,LOW);
    digitalWrite(7,HIGH);
    delay(tempo);
    digitalWrite(7,LOW);
    digitalWrite(6,HIGH);
    delay(tempo);
    digitalWrite(6,LOW);
    digitalWrite(5,HIGH);
    delay(tempo);
    digitalWrite(5,LOW);
    digitalWrite(4,HIGH);
    delay(tempo);
    digitalWrite(4,LOW);
    digitalWrite(3,HIGH);
    delay(tempo);
    digitalWrite(3,LOW);
    digitalWrite(2,HIGH);
    delay(tempo);
    digitalWrite(2,LOW);
    digitalWrite(8,HIGH);
    delay(tempo);
  }
if(sr='c'){
  digitalWrite(7,LOW);
    digitalWrite(8,HIGH);
    delay(tempo);
    digitalWrite(8,LOW);
    digitalWrite(2,HIGH);
    delay(tempo);
    digitalWrite(2,LOW);
    digitalWrite(3,HIGH);
    delay(tempo);
    digitalWrite(3,LOW);
    digitalWrite(4,HIGH);
    delay(tempo);
    digitalWrite(4,LOW);
    digitalWrite(5,HIGH);
    delay(tempo);
    digitalWrite(5,LOW);
    digitalWrite(6,HIGH);
    delay(tempo);
    digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
   digitalWrite(8,LOW);
    digitalWrite(7,HIGH);
    delay(tempo);
    digitalWrite(7,LOW);
    digitalWrite(6,HIGH);
    delay(tempo);
    digitalWrite(6,LOW);
    digitalWrite(5,HIGH);
    delay(tempo);
    digitalWrite(5,LOW);
    digitalWrite(4,HIGH);
    delay(tempo);
    digitalWrite(4,LOW);
    digitalWrite(3,HIGH);
    delay(tempo);
    digitalWrite(3,LOW);
    digitalWrite(2,HIGH);
    delay(tempo);
    digitalWrite(2,LOW);
    digitalWrite(8,HIGH);
    delay(tempo);
}
}


   
   
 

qualcuno sa perchè non funziona

Ciao, per verificare un'uguaglianza bisogna usare il doppio uguale (esempio: if(sr == 'a')), mentre te hai usato un solo uguale che equivale ad un'assegnazione, facendo risultare sempre vere le condizioni.
Ciao.
La mia board: ARDUINO UNO R3
Il mio blog

chry2000

ciao! grazie mille ora funziona ma ho un problema : l effetto funziona una sola volta io invece vorrei che se invio una volta sola la "c" continui sempre a ripetere un effetto se invio la lettera "a" voglio che mi continui a fare un altro effetto
conosci qualche cosa per farcelo fare?

leo72

Devi strutturare in maniera differente il tuo programma.
Adesso cosa fa: legge la lettera ed esegue l'effetto, poi torna a leggere la lettera ecc...
Tu invece devi crearti prima una routine per eseguire l'effetto, poi memorizzarlo in un'altra variabile.
Quindi il tuo ciclo diventa: leggi la seriale. Se c'è una lettera modifichi la variabile che contiene lo schema. Poi esegui la routine che esegue il gioco di luce, indipendentemente dal fatto che sia arrivata una lettera oppure no.


chry2000

grazie per la risposta purtoppo ancora non so fare le routine non c è un tutorial su come imparare a farle su google non ho trovato niente   :(

pelletta

#5
Aug 02, 2012, 04:35 pm Last Edit: Aug 02, 2012, 04:37 pm by Pelletta Reason: 1
Crei una funzione e una variabile boleana per ogni effetto.
Imposti le variabili a false.
Leggi la seriale: se arriva "a" la prima boleana diventa vera e le altre false.
Se arriva "b" diventa vera la seconda variabile e le altre false, ecc.
Dentro ad ogni funzione contenente gli effetti fai il controllo della variabile quindi se è vera inizia l'effetto corrispondente, se falsa la funzione non verrà eseguita.
Le variabili si aggiorneranno solo quando arriva qualcosa sulla seriale, nel frattempo rimarrà in esecuzione soltanto un effetto.
Te la cavi con degli "if"
Buon lavoro

chry2000


leo72


grazie per la risposta purtoppo ancora non so fare le routine non c è un tutorial su come imparare a farle su google non ho trovato niente   :(

Esistono eccome. Sono le centinaia di corsi e guide di C gratuiti in italiano e inglese che ci sono sparsi per la rete, basta scaricarne uno e cominciare ad approfondire  ;)

chry2000

ho scritto questo ma non funziona
Code: [Select]
//ArduiLed è stato scritto da Christian

void setup(){
pinMode(8,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
Serial.begin(9600);
}
void loop(){
  boolean A = false;
  boolean B = false;
  boolean C = false;
int tempo;
int sr;
tempo = 100;
sr = Serial.read();
if(sr=='1'){
  A=true;
  B=false;
  C=false;
}
if(sr=='2'){
  B=true;
  A=false;
  C=false;
}
if(sr=='3'){
  C=true;
  B=false;
  A=false;
}
if(A==true){
    digitalWrite(7,LOW);
    digitalWrite(8,HIGH);
    delay(tempo);
    digitalWrite(8,LOW);
    digitalWrite(2,HIGH);
    delay(tempo);
    digitalWrite(2,LOW);
    digitalWrite(3,HIGH);
    delay(tempo);
    digitalWrite(3,LOW);
    digitalWrite(4,HIGH);
    delay(tempo);
    digitalWrite(4,LOW);
    digitalWrite(5,HIGH);
    delay(tempo);
    digitalWrite(5,LOW);
    digitalWrite(6,HIGH);
    delay(tempo);
    digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
    delay(tempo);
}
  if(B==true){
    digitalWrite(8,LOW);
    digitalWrite(7,HIGH);
    delay(tempo);
    digitalWrite(7,LOW);
    digitalWrite(6,HIGH);
    delay(tempo);
    digitalWrite(6,LOW);
    digitalWrite(5,HIGH);
    delay(tempo);
    digitalWrite(5,LOW);
    digitalWrite(4,HIGH);
    delay(tempo);
    digitalWrite(4,LOW);
    digitalWrite(3,HIGH);
    delay(tempo);
    digitalWrite(3,LOW);
    digitalWrite(2,HIGH);
    delay(tempo);
    digitalWrite(2,LOW);
    digitalWrite(8,HIGH);
    delay(tempo);
  }
if(C==true){
    digitalWrite(8,HIGH);
    delay(tempo);
    digitalWrite(8,LOW);
    digitalWrite(2,HIGH);
    delay(tempo);
    digitalWrite(2,LOW);
    digitalWrite(3,HIGH);
    delay(tempo);
    digitalWrite(3,LOW);
    digitalWrite(4,HIGH);
    delay(tempo);
    digitalWrite(4,LOW);
    digitalWrite(5,HIGH);
    delay(tempo);
    digitalWrite(5,LOW);
    digitalWrite(6,HIGH);
    delay(tempo);
    digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
   digitalWrite(8,LOW);
    digitalWrite(7,HIGH);
    delay(tempo);
    digitalWrite(7,LOW);
    digitalWrite(6,HIGH);
    delay(tempo);
    digitalWrite(6,LOW);
    digitalWrite(5,HIGH);
    delay(tempo);
    digitalWrite(5,LOW);
    digitalWrite(4,HIGH);
    delay(tempo);
    digitalWrite(4,LOW);
    digitalWrite(3,HIGH);
    delay(tempo);
    digitalWrite(3,LOW);
    digitalWrite(2,HIGH);
    delay(tempo);
    digitalWrite(2,LOW);
    digitalWrite(8,HIGH);
}
}


   
   
 

chry2000

ho cambiato i numeri che invia la seriale con le lettere ma succede sempre la stessa cosa di prima cioè lo ripete una sola volta  :(

pelletta

Le booleane dichiarale fuori dal loop


chry2000

grazie mille a tutti  ! funziona alla grande devo mettere gli altri effetti e ovviamente altre booleane
grazie a tutti ! ciao!

jacock

non è più semplice farlo con il case?
http://arduino.cc/en/Reference/SwitchCase

così in base al tasto premuto esegue un determinato programma

leo72

La struttura del programma è arzigogolata.


Devi strutturare in maniera differente il tuo programma.
Adesso cosa fa: legge la lettera ed esegue l'effetto, poi torna a leggere la lettera ecc...
Tu invece devi crearti prima una routine per eseguire l'effetto, poi memorizzarlo in un'altra variabile.
Quindi il tuo ciclo diventa: leggi la seriale. Se c'è una lettera modifichi la variabile che contiene lo schema. Poi esegui la routine che esegue il gioco di luce, indipendentemente dal fatto che sia arrivata una lettera oppure no.


Quindi una cosa così, ottimizzato anche col suggerimento di jacock:
Code: [Select]

byte programma;

void loop(){
char sr=0;
if (Serial.available()) { //controllo che ci siano caratteri sulla seriale
  sr = Serial.read(); //leggo il byte
  if (sr >= '1' && sr <='3') { //controllo che sia un valore valido
    programma = sr; //cambio il programma
  }
}

switch (sr) {
  case '1':
    programma1();
    break;
  case '2':
    programma2();
    break;
  case 3:
    programma3();
    break;
}
}
void programma1() {
  ....
}

void programma2() {
  ...
}

void programma3() {
  ...
}



Fatto questo, ti scarichi una guida, ti studi il C, poi vai ne Reference del linguaggio e ti studi i metodi di Arduino, poi prendi l'esempio BlinkWithoutDelay presente nell'IDE e lo studi, e dopo rivedi il tuo programma in modo da farlo non bloccante durante l'esecuzione.

Go Up