Pages: [1] 2   Go Down
Author Topic: seriale e effetti luce con led  (Read 1394 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 2
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Italy
Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

La mia board: ARDUINO UNO R3
Il mio blog

Offline Offline
Full Member
***
Karma: 2
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22944
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged


Offline Offline
Full Member
***
Karma: 2
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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   smiley-sad
Logged

Marche
Offline Offline
Edison Member
*
Karma: 34
Posts: 2276
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: August 02, 2012, 09:37:02 am by Pelletta » Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie mille ora ci provo  smiley
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22944
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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   smiley-sad
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  smiley-wink
Logged


Offline Offline
Full Member
***
Karma: 2
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho scritto questo ma non funziona
Code:
//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);
}
}


   
   
 
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-sad
Logged

Marche
Offline Offline
Edison Member
*
Karma: 34
Posts: 2276
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le booleane dichiarale fuori dal loop
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ook ci provo subito  smiley
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

così in base al tasto premuto esegue un determinato programma
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22944
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged


Pages: [1] 2   Go Up
Jump to: