Salve a tutti, sono entrato da poco a far parte del mondo di Arduino e mi servirebbe un aiuto.
E' possibile memorizzare in una variabile il primissimo valore (=quantità della luce) che le fotoresistenze rilevano? Se si, come?
Salve a tutti, sono entrato da poco a far parte del mondo di Arduino e mi servirebbe un aiuto.
E' possibile memorizzare in una variabile il primissimo valore (=quantità della luce) che le fotoresistenze rilevano? Se si, come?
E' possibile memorizzare in una variabile il primissimo valore (=quantità della luce) che le fotoresistenze rilevano? Se si, come?
Ni, cioè spiega meglio cosa intendi per primissimo valore, qui noi siamo abituati male, vogliamo il dettaglio, il tempo espresso in una unità, entro quanto tempo deve essere disponibile il dato.
mmmm....le foto resistenza non sono rapidissime nel variare la proprio resistenza, quindi può essere che il primissimo
è in realtà un valore falsato. La domanda fa supporre l'intensità della luce che investe la fotoresistenza non è costante nel tempo.
Ciao.
Quello che vorrei fare io è (per esempio):
valoreMinimo = valoreQuantitaLuceRegistrataDaFotoresistenzaConLuceSpenta;
valoreMassimo= valoreQuantitaLuceRegistrataDaFotoresistenzaConLuceAccesa;
Potrei aggiungere un bottone che, alla prima pressione registra valoreMinimo, alla seconda pressione registra valoreMassimo.. Ma si può fare..?? E senza l'aggiunta di esso c'è qualche altro modo?
Grazie per la risposta.
Eleinad:
Salve a tutti, sono entrato da poco a far parte del mondo di Arduino e mi servirebbe un aiuto.
Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:
Potrei aggiungere un bottone che, alla prima pressione registra valoreMinimo, alla seconda pressione registra valoreMassimo.. Ma si può fare..?? E senza l'aggiunta di esso c'è qualche altro modo?
Se vuoi che sia l'utente a iniziare la procedura tramite pressione di pulsanti allora ti servono i due pulsanti con R di pullup
(esterna o interna), se ti serve memorizzare valoreMinimo e massimo in eeprom ti devi studiare come scrivere e leggere valori da eeprom.
Senza pulsanti e utente dovrebbe essere fattibile, ma non conosco quali siano le finalità e non riesco a ragionare senza.
Intanto si potrebbe pensare di scrivere un codice che entra in funzione solo quando il sensore rileva una variazione, ciò si
realizza tramite due variabili oldAdcRaw e newAdcRaw. Dentro il loop acquisisci da adc e lo salvi in newAdcRaw, alla fine del loop oldAdcRaw = newAdcRaw;
Ora hai due valori "di luce" che possono essere identici o differire, se sono identici non serve eseguire codice. Mentre se sono differenti significa che c'è stata una variazione esegui del codice.
// dichiara qui le variabili new.. old.. ecc
void setup () {
newAdcRaw = 0;
oldAdcRaw = 0;
}
void loop() {
newAdcRaw = analogRead(A0);
if ( newAdcRaw != oldAdcRaw ) {
// c'è una variazione di luce
// scrivi qui il codice per accendere e poi spegnere il led, o se preferisci spedisci via seriale una stringa breve
}
oldAdcRaw = newAdcRaw;
}
Per testare il codice di questa funzionalità fai in modo di accendere un led per brevissimo tempo (di modo che tu possa distinguere l'accensione)
Se effettui la sottrazione tra newAdcRaw e oldAdcRaw ricavi di quanto sono diversi, es newAdcRaw vale 255 e oldAdcRaw vale 25. 255 - 55 = 200.
Ora con una if ( questo - quello > 180) esegui codice quando i due valori distano almeno 181.
Spero di averti dato spunto.
Ciao.
Posto il codice cercando di rendere le idee più chiare su ciò che vorrei fare:
const int pinLEDverde = 9;
const int pinLEDblu = 10;
const int pinLEDrosso = 11;
const int pinSENSOREverde = A0;
const int pinSENSOREblu = A1;
const int pinSENSORErosso = A2;
int valoreRosso = 0;
int valoreVerde = 0;
int valoreBlu = 0;
int valoreSENSORErosso = 0;
int valoreSENSOREblu = 0;
int valoreSENSOREverde = 0;
//funzione di massimo
int massimo (int a, int b, int c) {
int max = a;
if(b>max) {
max=b;
} else if(c>max) {
max=c;
}
return max;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(pinLEDverde, OUTPUT);
pinMode(pinLEDblu, OUTPUT);
pinMode(pinLEDrosso, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
valoreSENSORErosso = analogRead(pinSENSORErosso);
delay(5);
valoreSENSOREblu = analogRead(pinSENSOREblu);
delay(5);
valoreSENSOREverde = analogRead(pinSENSOREverde);
valoreRosso = valoreSENSORErosso/4; //in termini di CICLO DI LAVORO
valoreBlu = valoreSENSOREblu/4; //(tra 0 e 255: 255= massima luminosità per tutto il tempo; 0=led spento; 127=led sfumato, periodo del ciclo di lavoro a metà)
valoreVerde = valoreSENSOREverde/4;
Serial.print("Valore del sensore mappato rosso: ");
Serial.print(valoreRosso);
Serial.print("\t verde: ");
Serial.print(valoreVerde);
Serial.print("\t blu: ");
Serial.println(valoreBlu);
int tensMax = massimo(valoreRosso,valoreBlu, valoreVerde);
if((70-tensMax) <= 0) { //70 = ciclo massimo (tra le 3 fotoresistenze) di lavoro della luce rilevata in stanza1
analogWrite(pinLEDrosso,0);
analogWrite(pinLEDverde,0);
analogWrite(pinLEDblu,0);
} else {
analogWrite(pinLEDrosso,255/tensMax);
analogWrite(pinLEDverde,255/tensMax);
analogWrite(pinLEDblu,255/tensMax);
}
}
Come si può vedere, inserisco manualmente i valori che le fotoresistenze acquisiscono quando la luce è accesa nelle due stanze; invece di procedere in questo modo poco efficiente, mi basterebbe trovare un modo per (come da titolo topic) memorizzare in una variabile il valore della luce accesa in quel momento in quella stanza, per poterla riusare al fine di definire se il led deve essere acceso (in caso di luce spenta) o spento (in caso di luce accesa).
In poche parole vorrei, dopo aver acceso la luce della stanza:
-premere (per esempio) un bottone, che salva così i valori registrati dalle 3 fotoresistenze nell'istante in cui lo premo (dato che utilzzo 3 fotoresistenze) ;
-a questo punto il programma si calcola il massimo valore registrato dalle 3 fotoresistenze e lavorerà con esso (insomma, tale valore sarà messo al posto di quel "70" in modo tale da poter utilizzare il progetto per qualsiasi stanza).
Potrei semplificare la questione utilizzando una solo fotoresistenza, risparmiandomi così di calcolare ogni volta il valore massimo registrato..
Spero di essere stato il più chiaro possibile..!
Fai come dici: inizia a scrivere lo sketch considerando un solo fotoresistore, quando è a posto vediamo insieme di ampliarlo per gestirle tutte e tre.
PS: Perché ne hai 3? Sono puntate in direzioni diverse?
Uso 3 fotoresistenze perchè sul soffitto ho più luci, quindi ho pensato che con 3 fotoresistenze riuscissi a registrare la luce "media" proveniente da più direzioni, anche se forse non ha molto senso..
Comunque, ho aggiornato il mio codice con una sola fotoresistenza:
const int pinLEDverde = 9;
const int pinLEDblu = 10;
const int pinLEDrosso = 11;
const int pinSensore = A0;
const int pinBottone = 7;
int valoreRosso = 0;
int valoreVerde = 0;
int valoreBlu = 0;
int valoreSensore = 0;
int valoreMemoAccesa = 0;
int bottoneDaPremere = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(pinLEDverde, OUTPUT);
pinMode(pinLEDblu, OUTPUT);
pinMode(pinLEDrosso, OUTPUT);
pinMode(pinBottone, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
bottoneDaPremere = digitalRead(pinBottone);
int premuto = 0;
Serial.print("premuto: ");
Serial.println(premuto);
if (bottoneDaPremere == HIGH && premuto == 0) {
valoreMemoAccesa = analogRead(pinSensore);
premuto = 1;
Serial.print("premuto nell'if: ");
Serial.println(premuto);
Serial.print("valore memorizzato: ");
Serial.println(valoreMemoAccesa);
}
while (bottoneDaPremere == HIGH && premuto == 1) {
valoreSensore = analogRead(pinSensore);
//in termini di CICLO DI LAVORO
//(tra 0 e 255: 255= massima luminosità per tutto il tempo; 0=led spento; 127=led sfumato, periodo del ciclo di lavoro a metà)
valoreRosso = valoreSensore/4; //R
valoreBlu = valoreSensore/4; //B
valoreVerde = valoreSensore / 4; //G
Serial.print("Valore del sensore mappato: ");
Serial.println(valoreRosso);
if ((valoreMemoAccesa - valoreSensore) <=0) {
analogWrite(pinLEDrosso, 0);
analogWrite(pinLEDverde, 0);
analogWrite(pinLEDblu, 0);
} else {
analogWrite(pinLEDrosso, valoreMemoAccesa / valoreSensore);
analogWrite(pinLEDverde, valoreMemoAccesa / valoreSensore);
analogWrite(pinLEDblu, valoreMemoAccesa / valoreSensore);
Serial.print("valore scritto nel led: ");
Serial.println(analogRead(pinLEDrosso));
}
}
}
Così funziona! L'unica cosa che non capisco è per quale motivo quando oscuro il fotoresistore per fare "l'effetto buio", il led sfarfalla...
Ora devo trovare un modo per "resettare" lo stato di "valoreMemoAccesa" magari tramite un'altra pressione del bottone, in modo tale da rendere il progetto riutilizzabile ogni due pressioni sul bottone.. Un aiutino?
Grazie per la risposta!