Controllo led ( gestione manuale e automatica)

ciao a tutti,
Vorrei capire come gestire dei led sia in manuale ( Tramite un pulsante) sia in modo automatico
( fotoresistenza).
Precisamente, vorrei gestire l accensione manuale con il pulsante e in seguito se esso è premuto per 3 secondo si passa alla gestione tramite fotoresistenza.

Bah.... qualcuno che si presenta ancor prima di fare una domanda....

Bravo, meriti pure anche delle risposte

Intendi che il led si accende solo quando premi il pulsante o
che ogni volta che premi il pulsante il led alternativamente si accende o spegne ?

I led si accendono o si spengono on automatico grazie ad una Foto resistenza.
Vorrei implementare un pulsante , in modo da poter gestire le luci manualmente.
Come faccio a passare da una gestione automatica a manuale?

Che tipo di LED sono e come vengono pilotate?
Ciao Uwe

@Mirko00: ma tu vuoi che una modalità escluda l'altra o vuoi che, assieme alla possibilità di accendere il LED con la fotoresistenza, ci sia anche la possibilità di accenderlo manualmente ? ? ? Perché sono due cose diverse ...

Guglielmo

Imposta una variabile booleana ignorafotores = false inizialmente.
Quando premi il pulsante, accendi il LED e metti a true ignorafotores.
Quando leggi la fotresistenza, accendi o spegni il LED in base al valore letto solo quando ignorafotres è false, se invece ignorafotores è true, allora... ignora la lettura.
Quando premi il pulsante la seconda volta (occhio ai rimbalzi), spegni il LED e metti ingorafotores a false.

Una modalità che escluda l altra

Grazie,
come faccio a scrivere nel programma che se ignorafotores è falsa sotto un certo valore si accendono le luci?

if (!ignorafotores && (valorefotores < 99)) {
  accendi le luci
}

per contestualizzarla rispetto al tuo sketch bisognerebbe vedere lo sketch...

int FotoPin = 1;
int FotoValue;

boolean ignoraFotoValue = false;
const byte led = 8;   
const byte puls = 13; 
char val; 
int button = 0;          

void setup() { 
 Serial.begin(9600);
 pinMode(led, OUTPUT);
 pinMode(puls, INPUT);
   
}
 
void loop() {
  const byte button = digitalRead(puls);
  delay(10); // debounce

 
if (button == 1) {  
    digitalWrite(led, HIGH);   // accende il led  
  boolean ignoraFotoValue = true;
}  
  
  else {  
    digitalWrite(led, LOW);
    boolean ignoraFotoValue = false;  
  }  
 
 
 
  FotoValue = analogRead(FotoPin);
  Serial.println(FotoValue);
  if ((ignoraFotoValue = false) &&(FotoValue < 300)) {
    digitalWrite(led, HIGH);
    

} else {
    digitalWrite(led, LOW);
    
}
 delay(500);
}

da uno sguardo veloce:

  if ((ignoraFotoValue = false) &&(FotoValue < 300)) {

se usi solo = è un'assegnazione e non un confronto. dovresti usare ==
in ogni caso, essendo boolean non serve fare confronti con true o false.
puoi usare semplicemente

 !ignoraFotoValue

Ho provato in entrambi i modi ma non funziona.
Ho sbagliato di sicuro qualcosa nel prrogramma.

  1. elimina tutte le righe vuote che NON servono a una ceppa di nulla. Non è un temino da fare più bello se più lungo.

  2. usa CTRL+T nell'IDE che indenta meglio

  3. la cosa più importante. La struttura logica non mi garba.
    Se la parte della fotoresistenza non deve essere controllata quando premi il pulsante, allora con l'if SALTA tutta quella parte. Inutile leggere la fotoresistenza se non interessa.

if (ignoraFotoValue = false) 
{ FotoValue = analogRead(FotoPin);
  Serial.println(FotoValue);
  if (FotoValue < 300) 
  { digitalWrite(led, HIGH);
  } else 
  { digitalWrite(led, LOW);
  }
}
  1. ma che pulsante è ? Se è di quelli che premi ma poi se togli il dito quello ritorna a posizione di riposo, devi tenerlo tu premuto perchè ti dia sempre 1. Perchè la tua richiesta di tenerlo premuto per 3 secondi per passare a modalità "fotoresistenza" non l'hai mica implementata. :frowning:
    Dovrai farlo con un pezzo di codice che sfrutta millis() (solo dopo passati 3000 millisecondi cambi lo stato di ignoraFotoValue)
  1. errato:
const byte button = digitalRead(puls);

elimina quel const e quel byte

button = digitalRead(puls);

primo perchè hai già dichiarato button come int all'inizio, secondo perchè se leggi il pulsante che può essere o 1 o 0 NON è di certo costante (non ha senso)

P.S. stò cacchio di editor del forum che mette righe vuote a cavolo lo odio profondamente !!

Ciao , grazie dell' aiuto.
Ho fatto il programma seguendo le indicazioni però è sorto un nuovo problema.
Quando il pulsante è premuto il led è acceso e la fotoresistenza non legge, ma quando il pulsante non è premuto la fotoresistenza non legge ( invece dovrebbe).
programma:

int FotoPin = 1;
int FotoValue;
int led = 8;
int puls = 13;
boolean ignoraFotoValue = false;
char val;
int button = 0;
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(puls, INPUT);
}
void loop() {
button = digitalRead(puls);
delay(10);
if (button == 1) {
digitalWrite(led, HIGH);
boolean ignoraFotoValue = true;
}
else {
digitalWrite(led, LOW);
}
if (ignoraFotoValue = false)
{
FotoValue = analogRead(FotoPin);
Serial.println(FotoValue);
if (FotoValue < 300)
{ digitalWrite(led, HIGH);
} else
{ digitalWrite(led, LOW);
}
}
delay(1000);
}

Quando premi il pulsante una volta, metti

boolean ignoraFotoValue = true;

po chi lo rimette come false ?

Poi, @Mirko scusa ma forse dovresti prima leggerti un manualetto sul C.
Questa è una cavolata:

if (button == 1) {
digitalWrite(led, HIGH);
boolean ignoraFotoValue = true;
}

Quella ignoraFotoValue è dichiarata li, dentro a graffe quindi per il C è "locale", nasce li e muore con la graffa chiusa.
Le variabili DEVI dichiararle o all'inizio della loop() o meglio fuori da loop() e setup(), all'inizio (non è una regola, per te che sei neofita di programmazione la semplifico così, un testo di C ti spiegherebbe meglio)

Sono a livello 0 per quanto riguarda la programmazione.
Comunque adesso grazie a voi del forum forse sono riuscito a capire.
Vi farò sapere!

Cerca in internet un ebook (pdf) free "Programmare Arduino Tiziana Marsella"
E' free scritto da una prof. per i suoi studenti

Qui link: PDF

finalmente sono riuscito a realizzare il programma.
Grazie nid69ita