Sei sulla pagina 1di 5

*****

/* Sergio & Adriano Prenleloup


19/06/2013
*** Luxmetro *** versione 2.2
Utilizzo del LCD ACM1602B
Per utilizzare questo lcd seguite le indicazioni
di Mauro Alfieri www.mauroalfieri.it
Ho collegato il mio lcd nel modo da lui suggerito ed ha funzionato subito
************** Funzioni dei tasti **************************
All'accensione mostra i Lux ambiente e questi variano se si sposta lo strumento.
Tasto OLD

si blocca la lettura ( per poterla registrare)


per riprendere premere nuovamente il tasto OLD

Tasto Min - max

si avvia la visualizzazione e conservazione


dei valori minimo e massimo utile per ambienti
illuminati con lampade diverse e non uniformemente
disposte per uscire premere nuovamente il tastp Min-max

Tasto Lux / Fc

si cambia unit di misura da Lux a FootCandele e viceversa.

*/
#include
#include
// initialize the library with
// the numbers of the interface pins
//
//
//
//

Pin
pin
pin
pin

utilizzati
5 --- RS ( tipo di comando da inviare)
4 --- Enable
0,1,2,3 --- Dati si utilizzano 4 bit

LiquidCrystal lcd(5, 4, 3, 2, 1, 0);


//pulsanti
int Hold_Button = 6; // pulsante old
int MinM_Button = 7; // pulsante min max
int Unit_Button = 8; // pulsante cambio unit
// fotoresistenza
int pinLdr = A0;
// *******************************************
//varabili globali e costanti
const int MODO_AMBIENTE = 0; // costanti selezione
const int MODO_HOLD
= 1; // modo di operativo
const int MODO_MINMAX = 2; // di funzionamento
boolean memorizzato;
float valoreMIN = 0;
float valoreMAX = 0;

// valori lux minimo e massimo

int valoreLdr = 0; // usata per i valori ( 0-1023)


float calibVal = 1;
// calibrazione ( non usata nella 2.2)

float COST_CD = 0.0929; //conversione da lettura a footcandele


float COST_LUX = 1;
//conversione da lettura sensore a lux
float valR = 0;
// valore lettura resistenza
float Vout = 0.0;
//Voltaggio uscita partitore
float Vin = 5.0;
// Vcc (5 Volts) voltaggio arduino
float R_nota = 9900.0; // Valore misurato della resistenza nota (10Komm)
float valore;
// valore lux
float Ldr = 0.0;
// Valore calcolato della resistenza Ldr.
float Ldr_1 = 75000.0; // Valore ldr illuminamento unitario
float Pend = 0.66;
// Valore gamma fotoresistenza
double Lux = 0.0;
// Lux calcolati
//**************************************************
//stato corrente dei bottoni
int stato_bottoni[3];
boolean stato_switch[3];
//stringhe per mostrare la descrizione della lettura mostrata
char* Descrive [] =
{"Lux ambiente","HOLD Lux","Lux-min Lux-max", "Fc ambiente", "Fc HOLD", "Fc-min
Fc-max"};
// ***************************************************
void setup()
{
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// fotoresistenza
pinMode( pinLdr, INPUT);
// Pulsanti
pinMode (Hold_Button, INPUT);
pinMode (MinM_Button, INPUT);
pinMode (Unit_Button, INPUT);
stato_bottoni[0] = 0;
stato_bottoni[1] = 0;
stato_bottoni[2] = 0;
valoreMIN = valoreMAX = LeggiSensore();
memorizzato = false;
valore = LeggiSensore();
}
// ********** lettura pulsanti & antirimbalzo **********************
void aggiornaStato(int bottone, int& statoBottoneVecchio, boolean& statoSwitch)
{
//Si legge lo stato corrente del bottone (se premuto o no)
int statoBottoneCorrente = digitalRead (bottone);
//Se lo stato corrente del bottone cambiato (diverso dal vecchio stato)
//si deve gestire il nuovo stato
if (statoBottoneCorrente != statoBottoneVecchio)
{
//se stiamo passando da rilasciato a premuto allora gestiamo la

//logica antirimbalzo e attiviamo/disattiviamo lo swith


if (statoBottoneCorrente == HIGH)
{
delay(10);
statoSwitch = !statoSwitch;
}
//il nuovo stato diventa lo stato corrente
statoBottoneVecchio = statoBottoneCorrente;
}
}
// *************controllo modo
void controlla()
{
aggiornaStato(Hold_Button,
aggiornaStato(MinM_Button,
aggiornaStato(Unit_Button,
}

funzionamento ******************
stato_bottoni[0], stato_switch[0]);
stato_bottoni[1], stato_switch[1]);
stato_bottoni[2], stato_switch[2]);

// *******************************
int modoOperativo()
{
if (stato_switch[0] == 1)
return MODO_HOLD;
else if (stato_switch[1] == 1)
return MODO_MINMAX;
return MODO_AMBIENTE;
}
// ******************************
// Lettura Ldr calcolo resistenza
// calcolo Lux
// ******************************
float LeggiSensore()
{
valR = 0;
// si leggono 5 valori dalla fotoresistenza
for ( int i = 0; i<= 4; i++)
{
int valoreLdr = analogRead(pinLdr);
delay ( 40 );
valR = valR + valoreLdr;
}
// media dei valori letti
valR = valR/5;
// calcoliamo il valore della resistenza LDR
Vout = (Vin/1024.0 * valR);
// Si converte il valore in Volt
Ldr = ((R_nota * Vin/Vout )- R_nota);
// Si calcola la resistenza
// si calcolano i Lux
Lux = pow((Ldr/Ldr_1), (1.0/-Pend));
return (Lux);
}
// *******************************

float ConvertiLux(float valore)


{
return COST_LUX * valore;
}
// ********************************
float ConvertiCandele(float valore)
{
return COST_CD * valore;
}
// *********************************
void visualizza(int idxMessaggio, float valore1, float valore2)
{
double valoreLCD1;
double valoreLCD2;
int decimali = 0;
// se unit fotocandele converte e visualizza in foot candele
if ( stato_switch[2] == 1)
{
valoreLCD1 = ConvertiCandele(valore1);
valoreLCD2 = ConvertiCandele(valore2);
idxMessaggio = idxMessaggio + 3;
decimali = 2;
}
else
{
valoreLCD1 = ConvertiLux(valore1);
valoreLCD2 = ConvertiLux(valore2);
decimali = 0;
}
// si scrivono i risultati
// con la descrizione lettura
lcd.clear ();
lcd.print(Descrive[idxMessaggio]);
lcd.setCursor(0, 1);
lcd.print ( valoreLCD1, decimali );
if (valore2 > 0)
{
lcd.setCursor(10, 1);
lcd.print ( valoreLCD2, decimali );
}
delay (100);
}
//*********** loop principale **********
void loop()
{
controlla();
int modo = modoOperativo();
switch (modo)
{
case MODO_HOLD:

if (!memorizzato)
{
valore = LeggiSensore();
memorizzato = true;
}
visualizza(1, valore, -1);
break;
case MODO_MINMAX:
memorizzato = false;
valore = LeggiSensore();
if (valore <= valoreMIN)
valoreMIN = valore;
if (valore >= valoreMAX)
valoreMAX = valore;
visualizza(2, valoreMIN, valoreMAX);
break;
case MODO_AMBIENTE:
default:
memorizzato = false;
valore = LeggiSensore();
visualizza(0, valore, -1);
}
}
// *********** end *****************