Sono in dovere:
A portata di mano ho i schemi buttati giù su carta .....poi appena ho tempo li aggiornerò.



Arriva anche il software Arduino.........please wait
<div class=spoiler align=center><div class=code_top align=left>
SPOILER (<a href=javascript:spoiler()>clicca per visualizzare)</div><div class=code align=left>//----------------------------------------------------------
//LIBRERIE DA CARICARE
#include <eeprom.h>
#include <time.h>
#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER 'T' // Header tag for serial time sync message
#define TIME_REQUEST 7 // ASCII bell character requests a time sync message
#include <liquidcrystal.h>
#include <dfr_key.h>
//----------------------------------------------------------
//---------------------------------------------------------
//ASSEGNAZIONE PIN e CARATTERI SPECIALI LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define BACKLIGH_PIN 10
byte heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};
byte gradi[8] = {
0b00010,
0b00101,
0b00010,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
byte frownie[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b00000,
0b01110,
0b10001
};
byte armsDown[8] = {
0b00100,
0b01010,
0b00100,
0b00100,
0b01110,
0b10101,
0b00100,
0b01010
};
byte armsUp[8] = {
0b00100,
0b01010,
0b00100,
0b10101,
0b01110,
0b00100,
0b00100,
0b01010
};
int Rele1 = 11;
int Rele2 = 12;
int Luci_Notturne = 13;
//----------------------------------------------------------
//-----------------------------------------------------------
// VARIABILI
DFR_Key keypad;
String keyString = "";
int localKey = 0; //Select-1;Left-2;Up-3;Down-4;Right-5;
int pagina = 0; //PAGINA DEFAULT DA VISUALIZZARE SULL'LCD
float Soglia_Rele1 = 27.8;
float Soglia_Rele2 = 27.9;
float Soglia_Rilascio = 24.5;
float Tens_Batt_Max = 0;
float Tens_Batt_Min = 30;
float Temp_Batt_Max = 0;
float Temp_Batt_Min = 100;
int Reset_Val = LOW;
int Controllo = LOW;
int Settaggi = LOW;
int Salvare = LOW;
int READADRS = 0;
int PagTens = 1;
int PagTemp = 1;
int PagTerm = 1;
int PagStor = 1;
int RegOra = 1;
int Timeout = 0;
int pag = 7;
//-------VALORI INIZIALI DELLO STORICO
int ADRS = 61;//DEFAULT 1 ;NOTE:INSERIRE 1 + 20 X (GIORNI GIA' SALVATI) ES:61 LASCIA IN MEMORIA I PRIMI 3 GIORNI
byte TOFF1=6;//DEFAULT 0
byte TOFF2=0;//DEFAULT 0
byte VOFF1=24;//DEFAULT 0
byte VOFF2=0;//DEFAULT 0
byte TRL11=0;//DEFAULT 0
byte TRL12=0;//DEFAULT 0
byte TRL21=0;//DEFAULT 0
byte TRL22=0;//DEFAULT 0
byte TON1=0;//DEFAULT 0
byte TON2=0;//DEFAULT 0
byte VON1=0;//DEFAULT 0
byte VON2=0;//DEFAULT 0
//------------------------------------------------------------
void setup()
{
lcd.createChar(0, heart);
lcd.createChar(1, gradi);
lcd.createChar(2, frownie);
lcd.createChar(3, armsDown);
lcd.createChar(4, armsUp);
setTime(13,29,00,06,11,2012);
lcd.begin(16, 2);
pinMode(Luci_Notturne, INPUT);
pinMode(Rele1, OUTPUT);
digitalWrite(Rele1,LOW);
pinMode(Rele2, OUTPUT);
digitalWrite(Rele2,LOW);
pinMode(BACKLIGH_PIN, OUTPUT);
digitalWrite(BACKLIGH_PIN, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Controllo Solare");
lcd.setCursor(0,1);
lcd.print("By ElettroshockNow");
delay(1000);
/*
OPTIONAL
keypad.setRate(x);
Sets the sample rate at once every x milliseconds.
Default: 10ms
*/
keypad.setRate(50);
}
void loop()
{
//--------------------------------------------------------------
/*misura-campiona-converte il valore ampere dall ' ACS712
collegato a A1
Tabella conversione sensore +-5 A = 0.02642
+-20A = 0.04887
+-30A = 0.07405
*/
//float amper = 0;
//for(int i = 0; i < 50; i++) {
// amper = amper + ((analogRead(A1) -512) * 0.04887) / 50;
//}
//--------------------------------------------------------------
//------------MISURAZIONE TENSIONE BATTERIA------------------
float Tens_Batt = 0;
for(int i = 0; i < 50; i++) {
Tens_Batt = Tens_Batt + (analogRead(A1) * 0.04);
}
Tens_Batt = Tens_Batt/50;
if (Tens_Batt > Tens_Batt_Max ) Tens_Batt_Max=Tens_Batt;
if (Tens_Batt < Tens_Batt_Min ) Tens_Batt_Min=Tens_Batt;
//-------------------------------------------------------------
//------------MISURAZIONI TEMPERATURE-------------------
float Temp_Batt = 0;
for(int i = 0; i < 50; i++) {
Temp_Batt = Temp_Batt + (analogRead(A5) * 0.488758) / 50 ;
}
if (Temp_Batt > Temp_Batt_Max ) Temp_Batt_Max=Temp_Batt;
if (Temp_Batt < Temp_Batt_Min ) Temp_Batt_Min=Temp_Batt;
float Temp_inH2O = 0;
for(int i = 0; i < 50; i++) {
Temp_inH2O = Temp_inH2O + (analogRead(A6) * 0.488758) / 50 ;
}
float Temp_outH2O = 0;
for(int i = 0; i < 50; i++) {
Temp_outH2O = Temp_outH2O + (analogRead(A7) * 0.488758) / 50 ;
}
//--------------------------------------------------------------
//--------------CONTROLLO RELE'---------------------------------
if (Tens_Batt > Soglia_Rele1 & Controllo==HIGH) digitalWrite(Rele1,HIGH);
if (Tens_Batt > Soglia_Rele2 & Controllo==HIGH) digitalWrite(Rele2,HIGH);
if((Tens_Batt < Soglia_Rilascio | digitalRead(Luci_Notturne) == HIGH ) & Controllo==HIGH ) {
digitalWrite(Rele1,LOW);
digitalWrite(Rele2,LOW);
}
//-------------------------------------------------------------
//-----------------CREA STORICO e SALVALO-------------------------------
//---------------------ALLE ORE 23:00-------------------------------
if (hour() != 22) Salvare = HIGH;
if (hour()== 22 & Salvare == HIGH) {
EEPROM.write(ADRS,day());
EEPROM.write((1+ADRS),month());
EEPROM.write((2+ADRS),TOFF1);
EEPROM.write((3+ADRS),TOFF2);
EEPROM.write((4+ADRS),VOFF1);
EEPROM.write((5+ADRS),VOFF2);
EEPROM.write((6+ADRS),TRL11);
EEPROM.write((7+ADRS),TRL12);
EEPROM.write((8+ADRS),TRL21);
EEPROM.write((9+ADRS),TRL22);
EEPROM.write((10+ADRS),TON1);
EEPROM.write((11+ADRS),TON2);
EEPROM.write((12+ADRS),VON1);
EEPROM.write((13+ADRS),VON2);
TOFF1=0;TOFF2=0;VOFF1=0;VOFF2=0;TRL11=0;TRL12=0;TRL21=0;TRL22=0;TON1=0;TON2=0;VO
N1=0;VON2=0;
ADRS = ADRS + 20;
Salvare = LOW;
}
if (digitalRead(Luci_Notturne) == LOW & TOFF1==0 & TOFF2==0){
TOFF1=(hour());
TOFF2=(minute());
int intero=Tens_Batt;
VOFF1=intero;
VOFF2= (Tens_Batt - intero)* 100;
}
if (digitalRead(Luci_Notturne) == HIGH & TOFF1!=0 & TOFF2!=0 & TON1==0){
TON1=(hour());
TON2=(minute());
int intero=Tens_Batt;
VON1=intero;
VON2= (Tens_Batt - intero)* 100;
}
if (digitalRead(Rele1) ==HIGH & TRL11==0 & TRL12==0){
TRL11=(hour());
TRL12=(minute());
}
if (digitalRead(Rele2) ==HIGH & TRL21==0 & TRL22==0){
TRL21=(hour());
TRL22=(minute());
}
//------------------------------------------------------------
//-------------------------------------------------------------
//SELEZIONA IL NUMERO PAGINE E LA PAGINA DA VISUALIZZARE
localKey = keypad.getKey();
if (Settaggi==LOW)pag=8;else pag=12;
if (pagina < pag & localKey==3) pagina++;
if (pagina > 0 & localKey==4) pagina--;
//if (pagina==11) digitalWrite(BACKLIGH_PIN, LOW);
//else digitalWrite(BACKLIGH_PIN, HIGH);
if (pagina==4 & localKey==5) Controllo=HIGH;
if (pagina==4 & localKey==2) Controllo=LOW;
if (pagina==8 & localKey==5) Settaggi=HIGH;
if (pagina==8 & localKey==2) Settaggi=LOW;
if (pagina==10 & localKey==5) Soglia_Rele1=Soglia_Rele1+0.05;
if (pagina==10 & localKey==2) Soglia_Rele1=Soglia_Rele1-0.05;
if (pagina==11 & localKey==5) Soglia_Rele2=Soglia_Rele2+0.05;
if (pagina==11 & localKey==2) Soglia_Rele2=Soglia_Rele2-0.05;
if (pagina==12 & localKey==5) Soglia_Rilascio=Soglia_Rilascio+0.05;
if (pagina==12 & localKey==2) Soglia_Rilascio=Soglia_Rilascio-0.05;
if (pagina==5 & localKey==2 & Controllo==LOW){
if(digitalRead(Rele1)==LOW)digitalWrite(Rele1,HIGH);
else digitalWrite(Rele1,LOW);}
if (pagina==5 & localKey==5 & Controllo==LOW){
if(digitalRead(Rele2)==LOW)digitalWrite(Rele2,HIGH);
else digitalWrite(Rele2,LOW);}
//--------------------------------------------------------------
//-----------Reinposta la pagina iniziale -------
//----------- e spegne LCD dopo il Timeout--------------------
Timeout++;
if(localKey==1 |localKey==2 |localKey==3 |localKey==4 |localKey==5) {
Timeout=0;
digitalWrite(BACKLIGH_PIN, HIGH);
}
if(Timeout >200) pagina=0;
if(Timeout >500) {
digitalWrite(BACKLIGH_PIN,LOW);
Settaggi=LOW;}
//--------------------------------------------------------------
delay(100);//ritardo di refresh (attenzione varia anche il Timeout)
//------------------------------------------------------------------------------
----------------------------------------------------------
//GRAFICA LCD
switch (pagina){
case 0 :
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(hour());
if (second()&1 == 1){
lcd.print(":");}
else{
lcd.print(" ");}
if ((minute())<10)lcd.print("0");
lcd.print(minute());
lcd.print(" ");
lcd.print(day());
lcd.print("/");
lcd.print(month());
lcd.print("/");
lcd.print(year());
lcd.setCursor(0, 1);
lcd.print("Batt=");
lcd.print(Tens_Batt,1);
lcd.print("V ");
lcd.print(Temp_Batt,0);
lcd.write(1);
lcd.print("C");
break;
case 1 :
lcd.clear();
lcd.setCursor(0, 0);
switch(PagTens){
case 1:
lcd.print(" TENSIONE");
lcd.setCursor(0, 1);
lcd.print ("BATTERIA=");
lcd.print(Tens_Batt,1); //daa notare il ,1 che significa un decimale)
lcd.print("V");
break;
case 2:
lcd.print ("Tens_Max=");
lcd.print(Tens_Batt_Max,1); //daa notare il ,1 che significa un decimale)
lcd.print ("V");
lcd.setCursor(0, 1);
lcd.print ("Tens_Min=");
lcd.print(Tens_Batt_Min,1); //daa notare il ,1 che significa un decimale)
lcd.print ("V");
break;
case 3:
lcd.print("Push Select for");
lcd.setCursor(0, 1);
lcd.print ("Reset MIN/MAX");
if (localKey==1) {
Tens_Batt_Max = 0;
Tens_Batt_Min = 30;
};
break;
}
if(PagTens < 3 & localKey==5) PagTens++;
if(PagTens > 1 & localKey==2) PagTens--;
if(Timeout > 50) PagTens=1;
PagTemp = PagTerm = RegOra = 1;
break;
case 2 :
lcd.clear();
lcd.setCursor(0, 0);
switch (PagTemp){
case 1:
lcd.print(" TEMPERATURA");
lcd.setCursor(0, 1);
lcd.print ("BATTERIA=");
lcd.print(Temp_Batt,0);
lcd.write(1);
lcd.print("C");
break;
case 2:
lcd.print ("Temp_Max=");
lcd.print(Temp_Batt_Max,1); //daa notare il ,1 che significa un decimale)
lcd.write(1);
lcd.print ("C");
lcd.setCursor(0, 1);
lcd.print ("Temp_Min=");
lcd.print(Temp_Batt_Min,1); //daa notare il ,1 che significa un decimale)
lcd.write(1);
lcd.print ("C");
break;
case 3:
lcd.print("Push Select for");
lcd.setCursor(0, 1);
lcd.print ("Reset MIN/MAX");
if (localKey==1) {
Temp_Batt_Max = 0;
Temp_Batt_Min = 100;
};
break;
}
if(PagTemp < 3 & localKey==5) PagTemp++;
if(PagTemp > 1 & localKey==2) PagTemp--;
if(Timeout > 50) PagTemp=1;
PagTens = PagTerm = RegOra = 1;
break;
case 3 :
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" LUCI NOTTURNE");
lcd.setCursor(0, 1);
if (digitalRead(Luci_Notturne) == HIGH) lcd.print("*****ACCESE*****");
else lcd.print("-----SPENTE-----");
PagTens = PagTemp = PagTerm = RegOra = 1;
break;
case 4 :
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONTROLLO SOLARE");
lcd.setCursor(0, 1);
if (Controllo==LOW) lcd.print ("----MANUALE----");
else lcd.print("***AUTOMATICO***");
PagTens = PagTemp = PagTerm = RegOra = 1;
break;
case 5 :
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RELE'1= ");
if(digitalRead(Rele1) ==LOW) lcd.print("APERTO");
else lcd.print("CHIUSO");
if(Controllo==HIGH) lcd.print(" *");
lcd.setCursor(0, 1);
lcd.print("RELE'2= ");
if(digitalRead(Rele2) ==LOW) lcd.print("APERTO");
else lcd.print("CHIUSO");
if(Controllo==HIGH) lcd.print(" *");
PagTens = PagTemp = PagTerm = RegOra = 1;
break;
case 6 :
lcd.clear();
lcd.setCursor(0, 0);
switch(PagTerm){
case 1 :
lcd.print("PANNELLO SOLARE");
lcd.setCursor(0, 1);
lcd.print (" SANITARIO ");
break;
case 2:
lcd.print("TEMPERATURA H2O");
lcd.setCursor(0, 1);
lcd.print ("INGRESSO=");
lcd.print(Temp_inH2O,1);
lcd.write(1);
lcd.print ("C");
break;
case 3 :
lcd.print("TEMPERATURA H2O");
lcd.setCursor(0, 1);
lcd.print ("USCITA=");
lcd.print(Temp_outH2O,1);
lcd.write(1);
lcd.print ("C");
break;
case 4:
lcd.print("TEMP MAX/MIN IN");
lcd.setCursor(0, 1);
//lcd.print (" Gradi=");
//lcd.print(Temp_inH2O,1);
break;
case 5:
lcd.print("TEMP MAX/MIN OUT");
lcd.setCursor(0, 1);
//lcd.print (" Gradi=");
//lcd.print(Temp_inH2O,1);
break;
}
if(PagTerm < 5 & localKey==5) PagTerm++;
if(PagTerm > 1 & localKey==2) PagTerm--;
if(Timeout > 100) PagTerm=1;
PagTens = PagTemp = RegOra = 1;
break;
case 7 :
lcd.clear();
lcd.setCursor(0, 0);
if (READADRS == 0) {
lcd.print(" STORICO");
lcd.setCursor(0, 1);
if (ADRS == 1)
lcd.print ("NON DISPONIBILE");
else
lcd.print(" DISPONIBILE");
if (localKey==1 & ADRS > 1) READADRS=ADRS - 20;
PagStor = 1;
}
else {
lcd.print("MEMO DEL ");
lcd.print(EEPROM.read(READADRS));
lcd.print(" ");
lcd.print(monthShortStr(EEPROM.read(1+READADRS)));
lcd.setCursor(0, 1);
switch (PagStor){
case 1:
lcd.print("OFF=");
if ((EEPROM.read(2+READADRS))<10)lcd.print("0");
lcd.print(EEPROM.read(2+READADRS));
lcd.print(":");
if ((EEPROM.read(3+READADRS))<10)lcd.print("0");
lcd.print(EEPROM.read(3+READADRS));
lcd.print(" ");
lcd.print(EEPROM.read(4+READADRS));
lcd.print(".");
lcd.print(EEPROM.read(5+READADRS));
lcd.print("V");
break;
case 2:
lcd.print("T=");
if ((EEPROM.read(6+READADRS))<10)lcd.print("0");
lcd.print(EEPROM.read(6+READADRS));
lcd.print(":");
if ((EEPROM.read(7+READADRS))<10)lcd.print("0");
lcd.print(EEPROM.read(7+READADRS));
lcd.print(" T1=");
if ((EEPROM.read(8+READADRS))<10)lcd.print("0");
lcd.print(EEPROM.read(8+READADRS));
lcd.print(":");
if ((EEPROM.read(9+READADRS))<10)lcd.print("0");
lcd.print(EEPROM.read(9+READADRS));
break;
case 3:
lcd.print("ON=");
if ((EEPROM.read(10+READADRS))<10)lcd.print("0");
lcd.print(EEPROM.read(10+READADRS));
lcd.print(":");
if ((EEPROM.read(11+READADRS))<10)lcd.print("0");
lcd.print(EEPROM.read(11+READADRS));
lcd.print(" ");
lcd.print(EEPROM.read(12+READADRS));
lcd.print(".");
lcd.print(EEPROM.read(13+READADRS));
lcd.print("V");
break;
}
}
if (Timeout > 50)READADRS=0;
PagTens = PagTemp = PagTerm = RegOra = 1;
if (localKey==2 & READADRS > 1) READADRS = READADRS - 20;;
if (localKey==5 & READADRS > 1 & (READADRS+20) < ADRS) READADRS = READADRS + 20;;
if (localKey==1)PagStor++;
if (PagStor == 4 )PagStor = 1;
break;
case 8 :
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("----SETTAGGI----");
lcd.setCursor(0, 1);
if (Settaggi==LOW)lcd.print("**NO** SI ");
else lcd.print (" NO **SI**");
PagTens = PagTemp = PagTerm = RegOra = 1;
break;
case 9 :
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(hour());
if (second()&1 == 1){
lcd.print(":");}
else{
lcd.print(" ");}
if ((minute())<10)lcd.print("0");
lcd.print(minute());
lcd.print(" ");
lcd.print(day());
lcd.print("/");
lcd.print(month());
lcd.print("/");
lcd.print(year());
lcd.setCursor(0, 1);
switch (RegOra){
case 1:
lcd.print("--REGOLA ORA ?--");
break;
case 2:
lcd.print("*-*-*-ORA-*-*-*");
if (localKey==5) adjustTime(3540) ;
if (localKey==2) adjustTime(-3540) ;
case 3:
lcd.print("-*-*-MINUTI-*-*-");
if (localKey==5) adjustTime(60);
if (localKey==2) adjustTime(-60) ;
break;
case 4:
lcd.print("-*-*-GIORNO-*-*-");
if (localKey==5) adjustTime(86400);
if (localKey==2) adjustTime(-86400) ;
break;
case 5:
lcd.print("*-*-*-MESE-*-*-*");
if (localKey==5) adjustTime(2592000);
if (localKey==2) adjustTime(-2592000) ;
break;
case 6:
lcd.print("*-*-*-ANNO-*-*-*");
if (localKey==5) adjustTime(31536000);
if (localKey==2) adjustTime(-31536000) ;
break;
}
if(localKey==1) RegOra++;
if(RegOra==7 | Timeout > 50) RegOra=1;
PagTens = PagTemp = PagTerm = 1;
break;
case 10 :
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("- TENS. SOGLIA +");
lcd.setCursor(0, 1);
lcd.print(" RELE'1=");lcd.print(Soglia_Rele1,2);
break;
case 11 :
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("- TENS. SOGLIA +");
lcd.setCursor(0, 1);
lcd.print(" RELE'2=");lcd.print(Soglia_Rele2,2);
break;
case 12 :
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("- TENS. SOGLIA +");
lcd.setCursor(0, 1);
lcd.print(" RILASCIO=");lcd.print(Soglia_Rilascio,2);
break;
}
//------------------------------------------------------------------------------
-----------------------------------
} [/quote]
Per Aquila1 :
Mi sono basato sul datasheet dei LED.
Ad esempio il Led da 10W può essere pilotato in corrente fino a 1000mA e in questo caso emetterà circa 800Lm.
A 800mA dal diagramma emette circa 600Lm più che sufficienti per i miei scopi.
A questo punto con un amperometro in serie al LED regolo il driver (LM2556) in maniera tale da avere 800mA di assorbimento ......
-attendo la climatizzazione...
-confermo la corrente assorbita......
-misuro la tensione ai capi del Led (di solito circa 9,2V).
-A questo punto riduco la tensione e disconnetto l'amperometro
-riconnetto il Led senza l'amperometro
-regolo la tensione hai capi del led (quella misurata in precedenza).
E' vero che risulta pericoloso per il led non avere un feedback sull'assorbimento ma con le dovute tolleranze funziona ....
La non variazione dei Lm è data dal fatto che il driver LM2556 (alimentatore stepdown da 1,5Euro su E---y

) piloterà il led sempre con la stessa tensione indipendentemente da quella in entrata .