5 PRAGMA EXTERNAL_EEPROM
10 CADS=3
20 SETIO=&H800F
30 LCDCLEAR
40 CONSTANT CAD_V_Batt=1
50 CONSTANT CAD_TEMP=2
60 CONSTANT CAD_W_Power=3
70 ' da 0 fino a 60 volt v_AD : 1023 = Volt : 60 v_AD*60.0/1023
80 CONSTANT CONV_V_Batt=60.0/1023
90 ' da 0 a 300 e passa gradi t_AD : 1023 = Watt : 300 t_AD*300.0/1023 t_AD*3.0/10.23
100 CONSTANT CONV_TEMP=5.0/10.23
110 ' watt con fondoscala 5100 w w_AD : 1023 = Watt : 5100 w_AD*5100/1023 w_AD*51.0/10.23
120 CONSTANT CONV_W_Power=51.0/10.23
125 CONSTANT SOGLIA_SUP_BATT=853 ' Circa 50,02 Volt
126 CONSTANT SOGLIA_INF_BATT=760 ' Circa 44,57 Volt
135 DIM VBatt_Array(5) AS WORD
140 CONSTANT VBatt_Array_LEN=5
145 CONSTANT CICLI_LETTURE=50
150 CLR a,t,T1,T2,T3,
160 CONSTANT PSTART=22
170 CONSTANT PSTOP=33
180 ' Variabili
190 CLR Temp,Watt,STATUS_RELE,CHECK_RELE,IDX_Letture,IDX_VBatt
200 GOSUB :GET_V_Batt ' Legge il primo valore
210 VBatt_Array(2)=VBatt_Array(1) ' Inizializza l'array al primo valore
220 VBatt_Array(3)=VBatt_Array(1)
230 VBatt_Array(4)=VBatt_Array(1)
240 VBatt_Array(5)=VBatt_Array(1)
260 CONSTANT PIN_SECURE=3
270 CONSTANT PIN_INVERTER=4
280 CONSTANT PIN_ENELCASA=5
500 :MAIN_LOOP
510 GOSUB :GET_DATA
520 GOSUB :SHOW_DATA
530 GOSUB :CHECK_STATUS
540 GOSUB :SET_RELE
550 GOTO :MAIN_LOOP
1000 :GET_DATA
1010 GOSUB :GET_V_Batt
1020 GOSUB :GET_TEMP
1030 GOSUB :GET_POWER
1040 IDX_Letture++
1050 IF IDX_Letture < CICLI_LETTURE THEN 1070
1060 CLR IDX_Letture
1070 RETURN
1100 :SHOW_DATA
1101 '4x16
1110 IF STATUS_RELE THEN 1150
1120 LCDPOS=&H11
1130 LCDWRITE="ENEL ON "
1140 GOTO 1230
1150 LCDPOS=&H11
1160 LCDWRITE="FOTOVOLTAICO ON"
1230 ' La seconda riga
1300 LCDPOS=&H31
1310 LCDWRITE="TEMPERATURA"
1320 LCDPOS=&H3B
1330 LCDWRITE="=" & LEFT(Temp&"",4)
1400 LCDPOS=&H41
1410 LCDWRITE="TENS BATT"
1420 LCDPOS=&H4B
1430 LCDWRITE="V="& LEFT(VBatt_Array(IDX_VBatt)*CONV_V_Batt&"",4)
1500 RETURN
2000 :CHECK_STATUS
2010 IF INPBIT(PIN_SECURE) THEN 2050 ' se è maggiore di zero allora INVERTER SPENTO! EMERGENZA FOTOV_ON=0 ENEL_ON=0
2020 GOSUB :CHECK_BATT ' Controlla lo stato delle batterie e setta CHECK_RELE nel modo corretto
2030 GOTO 2070
2050 :INVERTER_SPENTO
2060 CHECK_RELE=0 ' Imposta CHECK_RELE per spegnere tutto
2070 RETURN
2110 :CHECK_BATT
2111 ' Se CHECK_RELE 0 spostare a 1 solo se le batterie sono a 50 V
2112 ' Se CHECK_RELE 1 invece controllare che le batterie siano sopra i 44,57
2120 IF CHECK_RELE THEN 2150
2125 ' Se i rele erano spenti deve accendere se le batterie sono a 50 Volt
2130 CHECK_RELE = (VBatt_Array(IDX_VBatt)>=SOGLIA_SUP_BATT)
2140 GOTO 2200
2150 ' se le ultime 5 letture sono state superiori alla soglia inferiore CHECK_RELE vale 1 se tutte le letture sono state inferiori 0
2160 CHECK_RELE = (VBatt_Array(1)>SOGLIA_INF_BATT) OR (VBatt_Array(2)>SOGLIA_INF_BATT) OR (VBatt_Array(3)>SOGLIA_INF_BATT) OR (VBatt_Array(4)>SOGLIA_INF_BATT) OR (VBatt_Array(5)>SOGLIA_INF_BATT)
2200 RETURN
2510 :SET_RELE 'CONSTANT PIN_INVERTER=4 CONSTANT PIN_ENELCASA=5
2515 IF STATUS_RELE = CHECK_RELE THEN 2620 ' La situazione non è mutata non occorre far nulla
2520 IF CHECK_RELE THEN 2570 ' Se occorre accendere vai ad accendere ;
se no spegni
2530 OUTBIT(PIN_INVERTER)=0 ' comando rele enel fotovoltaico spento rele' n.1
2540 WAITS 3 ' Attendo 3 secondi tra la conversione
2550 OUTBIT(PIN_ENELCASA)=0 ' comando rele enel casa spento rele' n.2
2560 GOTO 2610
2570 :ACCENDI
2580 OUTBIT(PIN_ENELCASA)=1 ' comando rele enel fotovoltaico acceso rele' n.2
2590 WAITS 3 ' Attendo 3 secondi tra la conversione '
2600 OUTBIT(PIN_INVERTER)=1 ' comando rele enel casa acceso rele' n.1
2610 STATUS_RELE = CHECK_RELE
2620 RETURN
3000 :GET_V_Batt
3010 IF IDX_Letture MOD (CICLI_LETTURE/VBatt_Array_LEN) = 0 THEN 3020 ELSE 3050
3020 IDX_VBatt=IDX_Letture/(CICLI_LETTURE/VBatt_Array_LEN)+1 'Incrementa l'indice ogni 100 cicli
3030 VBatt_Array(IDX_VBatt)=CADSIND(CAD_V_Batt)
3050 RETURN
3100 :GET_TEMP
3110 Temp=CADSIND(CAD_TEMP)
3120 Temp=Temp*CONV_TEMP
3130 RETURN
3200 :GET_POWER
3210 Watt=CADSIND(CAD_W_Power)
3220 Watt=Watt*CONV_W_Power
3230 RETURN