seriale e effetti luce con led

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

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.

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?

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.

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 :frowning:

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

grazie mille ora ci provo :slight_smile:

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 :frowning:

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 :wink:

ho scritto questo ma non funziona

//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);
}
}

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 :frowning:

Le booleane dichiarale fuori dal loop

ook ci provo subito :slight_smile:

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

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

così in base al tasto premuto esegue un determinato programma

La struttura del programma è arzigogolata.

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.

Quindi una cosa così, ottimizzato anche col suggerimento di jacock:

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.

ormai ho messo tutti gli effetti continuando con lo stesso modo delle booleane anche se è venuto un codice lunghissimo

chry2000:
ormai ho messo tutti gli effetti continuando con lo stesso modo delle booleane anche se è venuto un codice lunghissimo

conosco gente che per riempire un array di 1000 elementi in ordine crescente, si stava mettendo a fare un assegnazione per ogni elemento...
devi ottimizzare il codice, e non pensare a quanto tempo ci metti...