Fotoresistenza [Risolto]

Salve a tutti.
Sono nuovo in questo forum e da circa qualche mese ho conosciuto arduino alle serali per il diploma di perito elettronico.
Bene....
Effettivamente non so neache come mi devo rivolgere a voi quindi passo direttamente alla mia domanda....

Come da titolo la famosa fotoresistenza.
Ho trovato questo schetch in internet:

void setup() {
  Serial.begin(9600);
}
 
void loop() {
 int LEDsensorValue = analogRead(0);
 Serial.println(LEDsensorValue);
}

che ho trasformato in:

int FTR=A0;
int StatoFTR;

void Set_IO()
{
  pinMode(FTR, INPUT);
}

void LeggiFTR()
{
  StatoFTR=analogRead(FTR);
}

void setup()
{
  Set_IO();
  Serial.begin(9600);
}

void loop()
{
  LeggiFTR();
  Serial.println(StatoFTR);
}

e funziona... almeno da seriale...
il problema ora è che quando io provo a fargli fare qualcos' altro non riesco a farglielo fare.

tipo:

int Rele1=11;
int Rele2=12;
int Rele3=13;
int FTR=A0;
int StatoFTR;

void Set_IO()
{
  pinMode(FTR, INPUT);
  pinMode(Rele1, INPUT);
  pinMode(Rele2, INPUT);
  pinMode(Rele3, INPUT);
}

void LeggiFTR()
{
  StatoFTR=analogRead(FTR);
}

void Stato0()
{
  digitalWrite(Rele1, LOW);
  digitalWrite(Rele2, LOW);
  digitalWrite(Rele3, LOW);
}

void Stato1()
{
  digitalWrite(Rele1, HIGH);
  digitalWrite(Rele2, HIGH);
  digitalWrite(Rele3, HIGH);
}

void Stato2()
{
  digitalWrite(Rele1, HIGH);
  digitalWrite(Rele2, LOW);
  digitalWrite(Rele3, LOW);
}

void Stato3()
{
  digitalWrite(Rele1, HIGH);
  digitalWrite(Rele2, HIGH);
  digitalWrite(Rele3, HIGH);
}

void setup()
{
  Set_IO();
  Serial.begin(9600);
}

void loop()
{
  LeggiFTR();
  Serial.println(StatoFTR);
 
  if(StatoFTR<=400)
  {
    Stato1();
  }
 
  if(StatoFTR<=250)
  {
    Stato2();
  }
 
  if(StatoFTR<=150)
  {
    Stato3();
  }
}

ovvero comandare un paio di relè a seconda della luce che c'è.

cosa sto sbagliando?

Supposizioni:

  • se utilizzo if(StatoFTR==cifra) per poter accendere il relè dovrebbe esserci esattamente quella luminosità il chè rende la pratica impossibile

  • se utilizzo if(StatoFTR<=cifra) o if(StatoFTR>=cifra) non mi funziona

quindi sto sbagliando istruzione o per lo meno il modo di usarla...

consigli?

Ringrazio chiunque legga e mi presti attenzione.

Ancora Grazie.

Visto che ci colleghi dei relè ( o Led ), devi impostare i Pin come uscite

  // pinMode(FTR, INPUT); // Non serve dichiarare il pin di Input con l'AnalogRead
  pinMode(Rele1, OUTPUT);
  pinMode(Rele2, OUTPUT);
  pinMode(Rele3, OUTPUT);

Si errore grossolano ma non funziona lo stesso....

si attivano tutti e tre insieme ( o si accendono tutti e tre insieme) al minimo variare di luminosità...

Ricordatevi i tag CODE per includere il codice degli sketch nei post :wink:

Perché i 3 "IF" sono in cascata, quindi se la lettura è inferiore a 400, vedi che tutti e 3 i controlli sono veri.

Spiega cosa vuoi fare: vuoi accendere i 3 relé a seconda della quantità di luce rilevata (poca luce = 1 relé; un pò di luce = 2 relé; più luce = 3 relé) oppure vuoi accendere solo 1 dei relé a seconda della luce che leggi?
Nel codice che hai postato tu stai realizzando la prima condizione.

Altra cosa, potresti mettere lo schemino dei collegamenti? Non è che forse hai sbagliato qualcosa? Anche se lenta, la risposta della fotoresistenza dovrebbe essere lineare.

si vorrei accendere i rele a seconda della luminosità dell' ambiente....

per quanto riguarda gli if in cascata era propio quello che temevo credo che dovrei usare un for ma ancora non so farlo...

la fotoresistenza è collegata come segue:

Vcc => R1=10k => Segnale e Fotoresistenza => GND

approposito.
Mi dite per piacere come devo postare gli sketch?
scusate ma è la prima volta che posto in un forum e a quanto pare postando gli sketch ho fatto qualcosa...

Non il "for" ma l'if..else.
Vuoi accendere il relé 1 con lettura analogica da 0 a 150, poi il relé 2 da 150 a 250 e dopo il relé 3 da 250 a 400 fai così:
(pseudocodice):

if (lettura<= 150) {
  relé 1 on
  relé 2/3 off
} else if (lettura > 150 and lettura <= 250) {
  relé 2 on
  relé 1/3 off
} else if (lettura >250 and lettura <= 400) {
  relé 3 on
  relé 1/2 off
} else {
  tutto off
}

Il codice si include usando il tag [ CODE ] [/ CODE] (senza gli spazi, che ottieni anche premendo l'icona con i simboli "<>" che c'è sopra alle emoticon.

grazie!!!!!

provo subito....

hmm... scusa l' ignoranza ma praticamente in codice un if else si traduce così o sbaglio?

if((lettura>150) && <=250)
{
fai questo 
}
else if((lettura>250) && <350)
{
fai quest' altro
}

ecc

I tag erano senza gli spazi :wink:

Sì, l'if..else è come ti ho fatto vedere.
Ti consiglio di scaricarti una delle centinaia di guide sulla programmazione in C che si trovano in italiano in rete e studiarla perché mi pare che ti manchino un pò le basi del linguaggio :wink: :wink:

si effettivamente mi mancano un po le basi... ho cominciato da poco a programmare...
e si... ho visto che ho sbagliato nuovamente postando...
comunque smanetto un poco poi ti faccio sapere.
Grazie tante per ora!

IIIIIIIHHHHHHHHHHHHHAAAAAAAAAA!!! :smiley: :smiley: :smiley:
Funziona!

Grazie Tante!

Di seguito riporto il mio programmino modificato: (Spero di farlo bene stavolta...)

PS. Come lo metto risolto al post?

int Rele1=11;
int Rele2=12;
int Rele3=13;
int FTR=A0;
int StatoFTR;

void Set_IO()
{
  //pinMode(FTR, INPUT);
  pinMode(Rele1, OUTPUT);
  pinMode(Rele2, OUTPUT);
  pinMode(Rele3, OUTPUT);
}

void LeggiFTR()
{
  StatoFTR=analogRead(FTR);
}

void Stato0()
{
  digitalWrite(Rele1, LOW);
  digitalWrite(Rele2, LOW);
  digitalWrite(Rele3, LOW);
}

void Stato1()
{
  digitalWrite(Rele1, HIGH);
  digitalWrite(Rele2, LOW);
  digitalWrite(Rele3, LOW);
}

void Stato2()
{
  digitalWrite(Rele1, HIGH);
  digitalWrite(Rele2, HIGH);
  digitalWrite(Rele3, LOW);
}

void Stato3()
{
  digitalWrite(Rele1, HIGH);
  digitalWrite(Rele2, HIGH);
  digitalWrite(Rele3, HIGH);
}

void setup()
{
  Set_IO();
  Serial.begin(9600);
}

void loop()
{
  LeggiFTR();
  Serial.println(StatoFTR);
 
  if(StatoFTR<=150)
  {
    Stato3();
  }
  else
  if((StatoFTR>=150) && StatoFTR<=250)
  {
    Stato2();
  }
  else
  if((StatoFTR > 250) && StatoFTR<=400)
  {
    Stato1();
  }
  else
  if(StatoFTR >= 400)
  {
    Stato0();
  }
}

imaster:
PS. Come lo metto risolto al post?

Editando il primo post ... dato che sei quello che l'ha aperto, puoi modificare anche il titolo (edit completo, non quickedit)