[Risolto] Programma per gestione led

Ciao a tutti,
vorrei creare un programma per controllare una striscia led rgb da arduino. Tramite un potenziometro vorrei selezionare 1 dei 10 giochi di luci prestabiliti dopo di che premendo un pulsante avviare il gioco di luce selezionato e farlo ripetere fino a che non ne venga selezionato un altro.
Ecco un esempio di quello che vorrei fare:

int pulasnte = 13;
int potenziometro = 0;

void setup(){
  pinMode(pulsante, INPUT);
}

void loop(){
  potenziometro = analogRead(A0);
  
  if(potenziometro < 100){
  appena premo il pulsante fai partire questo gioco di luce
}

if(100 < potenziometro < 200){
  appena premo il pulsante fai partire questo gioco di luce
}

if(100 < potenziometro < 300){
  appena premo il pulsante fai partire questo gioco di luce
}
}

Il problema è che così non funziona, infatti riesco a selezionare il gioco di luce ma a farlo partire solo se tengo premuto il pulsante.

Qualcuno mi può dare qualche dritta?

Grazie
Leo

bhe...quello è uno pseudo codice...così si capisce poco di cosa sbagli...posta il codice per intero e ci diamo un occhio

Ecco la bozza del programma che avevo fatto:

int pot = 0;
int pulsante = 10;
int R = 5;
int G = 6;
int B = 7;


void setup() {
  pinMode(pulsante, INPUT);
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);

}

void loop() {
  pot = analogRead(A0);
// 1
  if (pot < 100){
    if(pulsante == HIGH){
    digitalWrite(R, HIGH);
    delay(1000);
    digitalWrite(R, LOW);
    digitalWrite(B, HIGH);
    delay(1000);
    digitalWrite(B, LOW);
    digitalWrite(G, HIGH);
    delay(1000);
    digitalWrite(G, LOW);
    }
  }
// 2
  if (100 < pot > 200){
    if(pulsante == HIGH){
    digitalWrite(R, HIGH);
    delay(1000);
    digitalWrite(R, LOW);
    delay(1000);
    }
  }
// 3
  if (200 < pot > 300){
    if(pulsante == HIGH){
    digitalWrite(G, HIGH);
    delay(1000);
    digitalWrite(G, LOW);
    delay(1000);
    }
  }
// 4
  if (300 < pot > 400){
    if(pulsante == HIGH){
    digitalWrite(B, HIGH);
    delay(1000);
    digitalWrite(B, LOW);
    delay(1000);
    }
  }
// 5
  if (400 < pot > 500){
    
  }
// 6
  if (500 < pot > 600){
    
  }
// 7
  if (600 < pot > 700){
    
  }
// 8
  if (700 < pot > 800){
    
  }
// 9
  if (800 < pot > 900){
    
  }
// 10
  if (900 < pot > 1000){
    
  }

}

Leo

ciao LeoTer01

allora abbiamo dei piccoli problemi :slight_smile:

allora è normale che succeda ciò... il problema principale sta su come gestisci la lettura del pulsante fa un semplice if(pulsante==HIGH) non va assolutamente bene... prova a cercare un po su internet come utilizzare al meglio pulsanti su Arduino... ci sono N domande sul forum a riguardo, è tutto molto documentato :slight_smile:
leggiti anche qualcosa su come fare un filtro antirimbalzo ... anche qui ci sono N post sul forum da cui prendere spunto :slight_smile:

Buon studio :slight_smile:

MD

Si, infatti avevo intutito che il problema fosse in quel punto. Ma non avevo idea di che funzione utilizzare. Intanto vado a dare un occhiata in giro per il web, comunque mi farebbe anche piacere avere il vostro parere, nel caso in cui a qualcuno venisse qualche idea!

Leo

La soluzione al problema penso sia chiara ... però seguendo un po' la filosofia del forum ... si cerca di da una mano a capire dov'è il problema e non scrivere direttamente il codice corretto, ma dare spunti... così che tu ti possa fare le ossa e arrivarci tu stesso ... è molto più costruttivo e funzionale per te...

se proprio non ne vieni a capo, allora si può pensare di farti uno sketch di esempio completo :slight_smile:

MD

Anche questo non va bene:
if (a < x < b)

Va suddiviso in due condizioni legate da AND:
if (x > a && x < b)

Non è che su nozioni come leggere un pin digitale sia inopportuno mostrare un esempio :slight_smile:
Credo che uno debba ragionare con la sua testa nel trovare la soluzione, nel creare un algoritmo ecc..
Ma se ha problemi con le nozioni base del linguaggio, oltre a suggerigli una guida non vedo il motivo di non indicargli la funzione o soluzione giusta :wink: :slight_smile:

Equilibrio è il segreto dell'universo :slight_smile: non dargli la pappa pronta, ma neanche non evitare di dargli nessuna informazione :wink:

SukkoPera:
Anche questo non va bene:
if (a < x < b)

Va suddiviso in due condizioni legate da AND:
if (x > a && x < b)

Grazie mille, infatti anche questo mi creava non pochi problemi. Ora funziona a dovere.

Comunque ho deciso di rinunciare al pulsante per l'invio del gioco di luce in quanto mi complicava anche la parte hardware, lasciando soltanto il potenziometro per la selezione e la partenza automatica del gioco di luce.

Leo

Se dovesse interessare a qualcuno ecco il prgramma funzionante grazie ai vostri consigli:

int pot = 0;
int R = 5;
int G = 6;
int B = 3;

void setup() {
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  pot = analogRead(A0);
Serial.println(pot);
// 1
  if (pot < 100){
    digitalWrite(R, HIGH);
    delay(1000);
    digitalWrite(R, LOW);
    digitalWrite(B, HIGH);
    delay(1000);
    digitalWrite(B, LOW);
    digitalWrite(G, HIGH);
    delay(1000);
    digitalWrite(G, LOW);
  }
// 2
  if (pot > 100 && pot < 200){
    digitalWrite(R, HIGH);
    delay(1000);
    digitalWrite(R, LOW);
    delay(1000);
  }
// 3
  if (pot > 200 && pot < 300){
    digitalWrite(G, HIGH);
    delay(1000);
    digitalWrite(G, LOW);
    delay(1000);
  }
// 4
  if (pot > 300 && pot < 400){
    digitalWrite(B, HIGH);
    delay(1000);
    digitalWrite(B, LOW);
    delay(1000);
  }
// 5
  if (pot > 400 && pot < 500){
    
  }
// 6
  if (pot > 500 && pot < 600){
    
  }
// 7
  if (pot > 600 && pot < 700){
    
  }
// 8
  if (pot > 700 && pot < 800){
    
  }
// 9
  if (pot > 800 && pot < 900){
    
  }
// 10
  if (pot > 900 && pot < 1022){
    
  }
 }

Leo

Giusto per completezza, l'if si potrebbe semplificare così:

if (x < 100) {
} else if (x < 200) {
} else if (x < 300) {
...

Ragionaci ;).