Concordo
concordo con quanto dice Claudio_FF se è la ripetizione che non vuoi basta che dopo il random confronti il valore di color una variabile che chiamerai oldColor se il valore delle 2 è diverso
oldColor = color e prosegui
se è uguale ricominci da random....
Ringrazio poi Patrick_M per i suoi consigli, non capisco però quale miglioria possa dare al programma questo:
letture sequenziali su pin analogoci diversi, non funzionano correttamente a causa dell'architettura interna del micro (diciamo così
)
per poterle fare devi appunto farne una a vuoto in modo da dare il tempo al condensatore interno di ricaricarsi la seconda è quella buona ![]()
Silente:
Allora, é abbastanza semplice:
- aggiungo una variabile nella quale mi ricorderò il valore dell'ultimo case eseguito
- inserisco l'intero switch case nel corpo di un if che mi controlla seil valore del ricordo e quelli attuale sono differenti.
- nell'else di quell'if vi metto quello che il programma deve fare se dovrebbe ripetere un case (ammesso che serva)
- aggiorno il ricordo
Questo dovrebbe essere il programma che mi hai proposto, giusto?
if (millis() - zero > tempo ){
zero = millis(); //Tiene in memoria l'ultimo lampeggio
switch (color) {
if(ultimo!= 0){
case 0:
digitalWrite(R, HIGH);
digitalWrite(G, LOW);
digitalWrite(B, LOW);
ultimo = 0;
break;
}
if(ultimo != 1){
case 2:
digitalWrite(R, HIGH);
digitalWrite(G, HIGH);
digitalWrite(B, HIGH);
ultimo = 1;
break;
}
if(ultimo != 2){
case 3:
digitalWrite(R, LOW);
digitalWrite(G, HIGH);
digitalWrite(B, LOW);
ultimo = 2;
break;
}
if(ultimo != 3){
case 4:
digitalWrite(R, HIGH);
digitalWrite(G, LOW);
digitalWrite(B, HIGH);
ultimo = 3;
break;
}
if(ultimo != 4){
case 5:
digitalWrite(R, LOW);
digitalWrite(G, LOW);
digitalWrite(B, HIGH);
ultimo = 4;
break;
}
if(ultimo != 5){
case 6:
digitalWrite(R, LOW);
digitalWrite(G, HIGH);
digitalWrite(B, HIGH);
ultimo = 5;
break;
}
if(ultimo != 6){
case 7:
digitalWrite(R, HIGH);
digitalWrite(G, HIGH);
digitalWrite(B, LOW);
ultimo = 6;
break;
}
if(ultimo != 7){
case 8:
digitalWrite(R, HIGH);
digitalWrite(G, LOW);
digitalWrite(B, LOW);
ultimo = 7;
break;
}
}
}
Se è così purtoppo niente da fare ![]()
Patrick_M:
concordo con quanto dice Claudio_FF se è la ripetizione che non vuoi basta che dopo il random confronti il valore di color una variabile che chiamerai oldColor se il valore delle 2 è diverso
oldColor = color e prosegui
se è uguale ricominci da random....
Si, quello che mi serve è che non si ripeta l'ultimo case eseguito in modo tale che lo stesso colore (es. luce rossa) non si ripeta due volte consecutive. Ma non so proprio come dire ad arduino che, se la variabile oldColor è uguale a color, deve riniziare da random (cioè, solo la parte del "riniziare da random" non so come si fa)
Patrick_M:
letture sequenziali su pin analogoci diversi, non funzionano correttamente a causa dell'architettura interna del micro (diciamo così)
per poterle fare devi appunto farne una a vuoto in modo da dare il tempo al condensatore interno di ricaricarsi la seconda è quella buona
Questa non la sapevo proprio, grazie mille!
Leo
E se io dicessi
int variabiledaseitchare;
int vecchiavariabiledaseitchare;
void setup()
{
Tuttoilsetup();
}
void loop()
{
Calcolovariabiledaswitchare();
//ora la variabile ha il "nuovo" valore
if (variabiledaseitchare!=vecchiavariabiledaseitchare)
{
Interoswitchcase();
}
vecchiavariabiledaseitchare=variabiledaseitchare;
Restodiloop();
}
Be il tuo problema sarebbe più "come generare numeri casuali sempre diversi", e non tanto non eseguire due volte lo stesso case!
In un loop()
Generi un numero casuale finché diverso dal precedente
int color=0;
int oldcolor=0;
void loop(){
do{
color = random(4);
}while(color==oldcolor);//Continua a generare numeri finché sono uguali al precedente
oldcolor=color; // E' uscito dal while perché ha generato un numero diverso dal precedente
// Memorizzo il colore generato per il prossimo numero casuale
}
In questo mono non si ripete lo stesso case due volte, avendo la variabile color di valore sempre diverso
torn24:
Be il tuo problema sarebbe più "come generare numeri casuali sempre diversi", e non tanto non eseguire due volte lo stesso case!In un loop()
Generi un numero casuale finché diverso dal precedenteint color=0;
int oldcolor=0;
void loop(){
do{
color = random(4);
}while(color==oldcolor);//Continua a generare numeri finché sono uguali al precedente
oldcolor=color; // E' uscito dal while perché ha generato un numero diverso dal precedente
// Memorizzo il colore generato per il prossimo numero casuale
}
In questo mono non si ripete lo stesso case due volte, avendo la variabile color di valore sempre diverso
ok, ma non ho capito dove devo inserire tutti i vari case... ![]()
Leo
In un qualunque punto della loop() successivo alla while, o almeno credo che sia così
Grazie mille a tutti, alla fine ho scelto la proposta di torn24 ed ora funziona tutto come dovrebbe. ![]()
Se a qualcuno dovesse tornare utile lascio qui sotto il programma che ho utilizzato:
int color = 0;
int oldColor = 0;
int R = 3;
int G = 5;
int B = 6;
int pR;
long tempo;
long zero;
void setup(){
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
}
void loop(){
pR = map(analogRead(A5), 0, 1023, 30, 5000);
delay(2);
pR = map(analogRead(A5), 0, 1023, 30, 5000);
tempo = pR;
if (millis() - zero > tempo ){
zero = millis();
do{
color = random(7);
}while(color==oldColor);//Continua a generare numeri finché sono uguali al precedente
oldColor=color; // E' uscito dal while perché ha generato un numero diverso dal precedente
switch(color){
case 0:
digitalWrite(R, HIGH);
digitalWrite(G, LOW);
digitalWrite(B, LOW);
break;
case 1:
digitalWrite(R, HIGH);
digitalWrite(G, HIGH);
digitalWrite(B, HIGH);
break;
case 2:
digitalWrite(R, LOW);
digitalWrite(G, HIGH);
digitalWrite(B, LOW);
break;
case 3:
digitalWrite(R, HIGH);
digitalWrite(G, LOW);
digitalWrite(B, HIGH);
break;
case 4:
digitalWrite(R, LOW);
digitalWrite(G, LOW);
digitalWrite(B, HIGH);
break;
case 5:
digitalWrite(R, LOW);
digitalWrite(G, HIGH);
digitalWrite(B, HIGH);
break;
case 6:
digitalWrite(R, HIGH);
digitalWrite(G, HIGH);
digitalWrite(B, LOW);
break;
}
}
Leo
Programma ben fatto, che credo possa essere ottimizzato ancora. Credo sia possibile impegnarci ancora qualcosa dentro e rimuovere lo switch case. Se fossi interessato andiamo avanti, così si possono scoprire cosine interessanti, magari utili in progetti futuri
Silente:
Programma ben fatto, che credo possa essere ottimizzato ancora. Credo sia possibile impegnarci ancora qualcosa dentro e rimuovere lo switch case. Se fossi interessato andiamo avanti, così si possono scoprire cosine interessanti, magari utili in progetti futuri
Certamente! Dici che lo switch case non è quello che fa al caso mio?
Leo
Per quanto riguarda l'analogRead, dopo le esperienze che ho avuto, ormai faccio così e funziona:
analogRead(A0); pot=analogRead(A0);
analogRead(A1); pR=analogRead(A1);
...
Basta fare un primo analogRead senza assegnare il valore a una variabile.
Grazie mille! ![]()
Leo