10 ' VALORI DI TEMPERATURA, TENSIONE, CORRENTE E WATT BATTERIA,
11 ' TENSIONE, CORRENTE E WATT PANNELLI
12 ' WATT CONTATORE ALTERNATA PRELEVATA
13 ' MEDIATI SU UNA COSTANTE ELE_MEDIA
14 ' CONTROLLO CARICO AL SUPERAMENTO SOGLIA MAX
15 ' CONTROLLO SWITCH ENEL/FV
16 ' Stef 08/03/2013 Version 2.03
29 'PRAGMA EXTERNAL_EEPROM
30 PRAGMA EXTENDED8K_EEPROM
31 CONSTANT ELE_MEDIA=3000 ' EFFETTUA LA MEDIA DI x VALORI LETTI (tempo lettura 30sec)
32 CONSTANT R1=10000 ' Resistenza da 10 K
33 CONSTANT R2=1330 ' Resistenza da 1,33 K
34 CONSTANT FAT_PROP = 1.0*(R1+R2)/R2
35 CONSTANT FAT_CORR_V=1.010 'correzione +1,0%
36 CONSTANT FAT_CORR_A=1.015 'correzione +1,5%
37 CONSTANT FAT_TEMP=488.75855 '5V = 5000mV/1023 step... 10mV/°C
38 CONSTANT FAT_CTOV=0.004888
39 CONSTANT FAT_SEN30=0.06615
40 CONSTANT FAT_SEN75=0.02805
41 CONSTANT ATTESA_MAX_RISPOSTA=1
42 CONSTANT PATHLOG="LOG/"
43 CONSTANT FINE_STRINGA_RASP="##"
44 CONSTANT WH_IMP=1.0*1000/2000 'Impulsi per wh --> 2000; 1kwh = 1000wh
45 CONSTANT MAX_POT_REG=30*24 'Max Watt Regolatore: 30A x 24V
46 CONSTANT WATT_CARICO=60 'Lampadina 24V da 60W
47 CONSTANT PIN_CARICO_ESTERNO=15
48 'CONSTANT PIN_ENEL_FV=14
49 'CONSTANT SOGLIA_INVERTER=65
50 'CONSTANT SOGLIA_ENEL=40
51 CONSTANT SEPARATORE=";"
52 CONSTANT LIVELLO_BATT_BASSO=23.00
53 CONSTANT LIVELLO_BATT_ALTO=25.00
70 SETIO=&H600FF
75 CADS=5
80 LCDCLEAR
85 DT="#"
90 LCD_IDX=1
95 BATTERIA_BASSA=FALSE
100 'PASSO1: controllo sincronizzazione tra PPTEA e RASP
110 GOSUB :SINCRONIZZO
150 'PASSO 2: setto la data del RASP prendendola da Internet
155 :RIPETI_P2 RASP_COM="<SETDATEWEB>" & FINE_STRINGA_RASP & CR_LF_RASP 'Settiamo la data del RASP da WEB
160 GOSUB :COMANDO_RASP
165 IF (RASP_RET = 1) AND (RASP_OUT = "<OK>"
THEN :PASSO3
170 GOSUB :SINCRONIZZO
172 'USBOUT="RASP_OUT="&RASP_OUT & "-<SETDATEWEB> RASP_RET:" & RASP_RET & CR_LF
175 GOTO :RIPETI_P2 'se rasp non risponde ripeto
200 'PASSO 3: prendo la data del RASP
205 :PASSO3 RASP_COM="<DATE>" & FINE_STRINGA_RASP & CR_LF_RASP 'prendo la data dal raspberry
210 GOSUB :COMANDO_RASP
215 IF RASP_RET = 1 THEN :ASSEGNO_DATA
220 GOSUB :SINCRONIZZO
222 'USBOUT="RASP_OUT="&RASP_OUT & "-<DATE> RASP_RET:" & RASP_RET & CR_LF
225 GOTO :PASSO3 'se rasp non risponde ripeto
230 :ASSEGNO_DATA SETDATE=RASP_OUT
250 'PASSO 4: setto la directory dei LOG
255 :PASSO4 RASP_COM="<SDPATH>" & PATHLOG & FINE_STRINGA_RASP & CR_LF_RASP
257 'USBOUT="<SDPATH> "&RASP_FILE&CR_LF
260 GOSUB :COMANDO_RASP 'setto directory LOG su raspberry
265 IF (RASP_RET = 1) AND (RASP_OUT = "<OK>"
THEN :MAIN
270 GOSUB :SINCRONIZZO
272 'USBOUT="RASP_OUT="&RASP_OUT & "-<SDPATH> RASP_RET:" & RASP_RET & CR_LF
285 GOTO :PASSO4 'se rasp non risponde ripeto
299 'A questo punto comincio il ciclo principale con seriale sincronizzata e date allineate tra RASP e PPTEA
300 :MAIN FDATE=DATE_ONLY
305 MYDT=DATE
310 IF DT = MYDT THEN :NOCREA
315 :CREA RASP_DATA=MYDT
320 GOSUB :CREA_NOME_FILE
325 IF RASP_RET = 0 THEN :NOCREA
330 RASP_COM="<SDFILE>" & RASP_FILE & FINE_STRINGA_RASP & CR_LF_RASP
332 'USBOUT="<SDFILE> "&RASP_FILE&CR_LF
333 'WAITS 5
335 GOSUB :COMANDO_RASP 'apro nuovo file su raspberry
340 IF (RASP_RET = 1) AND (RASP_OUT = "<OK>"
THEN :NOMEOK
345 GOSUB :SINCRONIZZO
350 GOTO :CREA 'se rasp non risponde ripeto
355 :NOMEOK DT=MYDT
365 WF=0.0 'resetto il contatore watt ogni volta che viene creato nuovo file
370 WB=0.0
375 WI=0.0
380 SETCOUNTER
500 :NOCREA CLR RASP_DATA, RASP_FILE, RASP_COM, MYDT
505 GOSUB :CALCOLO_VALORI_FV
510 'USBOUT="DATE FINE CALCOLO:" & DATE &CR_LF
520 'CLR RASP_COM, RASP_FILE
1000 FDATE=DATE_AND_TIME
1005 :RISCRIVI RASP_COM="<SDWRITE>" & DATE
1010 RASP_COM=RASP_COM & SEPARATORE
1015 RASP_COM=RASP_COM & LEFT(TM, 4)
1020 RASP_COM=RASP_COM & SEPARATORE
1025 RASP_COM=RASP_COM & LEFT(VF, 5)
1030 RASP_COM=RASP_COM & SEPARATORE
1035 RASP_COM=RASP_COM & LEFT(AF, 5)
1040 RASP_COM=RASP_COM & SEPARATORE
1045 RASP_COM=RASP_COM & LEFT(VB, 5)
1050 RASP_COM=RASP_COM & SEPARATORE
1055 RASP_COM=RASP_COM & LEFT(AB, 5)
1060 RASP_COM=RASP_COM & SEPARATORE
1065 RASP_COM=RASP_COM & LEFT(WF, 6)
1070 RASP_COM=RASP_COM & SEPARATORE
1075 RASP_COM=RASP_COM & LEFT(WB, 6)
1080 RASP_COM=RASP_COM & SEPARATORE
1085 RASP_COM=RASP_COM & LEFT(WI, 6)
1090 RASP_COM=RASP_COM & FINE_STRINGA_RASP
1095 RASP_COM=RASP_COM & CR_LF_RASP
1100 'IF ERROR THEN :PERRORE
1102 'USBOUT="MEM2:" & MEMORY & CR_LF
1105 GOSUB :COMANDO_RASP 'scrivo riga su file raspberry
1110 IF (RASP_RET = 1) AND (RASP_OUT = "<OK>"
THEN :OK_COM
1112 'USBOUT="RASP_OUT="& RASP_OUT & "-SDWRITE RASP_RET:" & RASP_RET & CR_LF
1115 GOSUB :SINCRONIZZO
1120 CLR RASP_COM
1125 GOTO :RISCRIVI
1130 :OK_COM CLR RASP_COM
1132 'USBOUT="DATE FINE COMANDI WRITE:" & DATE &CR_LF
1198 'GESTIONE DISPLAY
1199 LCDCLEAR
1200 LCDPOS=&H11
1205 IF LCD_IDX = 4 THEN :LCD4
1210 IF LCD_IDX = 3 THEN :LCD3
1215 IF LCD_IDX = 2 THEN :LCD2
1220 LCDWRITE="PV " & LEFT(VF,5) & "V " & LEFT(AF,5) & "A"
1225 LCDPOS=&H21
1230 LCDWRITE="BT " & LEFT(VB,5) & "V " & LEFT(AB,5) & "A"
1235 LCD_IDX+=1
1240 GOTO :MAIN 'RICICLO
1245 :LCD2 LCDWRITE="Tm " & LEFT(TM,5) & "C"
1250 LCDPOS=&H21
1255 LCDWRITE="PV " & LEFT(WF,6) & "Wh"
1260 LCD_IDX+=1
1265 GOTO :MAIN 'RICICLO
1270 :LCD3 LCDWRITE="DC " & LEFT(WB,6) & "Wh"
1271 ':LCD3 LCDWRITE="DC " & LEFT(WF-WB,6) & "W"
1275 LCDPOS=&H21
1280 LCDWRITE="AC " & LEFT(WI,6) & "Wh"
1285 LCD_IDX+=1
1290 GOTO :MAIN 'RICICLO
1295 :LCD4 LCDWRITE="CARICO EST:" & INPBIT(PIN_CARICO_ESTERNO) '& " "
1300 LCDPOS=&H21
1305 LCDWRITE="FOTOVOLT. :" & INPBIT(PIN_ENEL_FV) '& " "
1310 LCD_IDX=1
1315 GOTO :MAIN 'RICICLO
1317 'FINE GESTIONE DISPLAY
1500 ':PERRORE
1510 'USBOUT="ERRORE:"&ERROR
1520 END
2000 :CALCOLO_VALORI_FV
2001 'USBOUT="INIZIO CALCOLO_VALORI_FV:"& DATE & CR_LF
2005 RESET_TIMER
2010 'SETCOUNTER
2015 TM=0.0 'Temperatura
2020 VF=0.0 'Volt pannelli
2025 VB=0.0 'Volt batterie
2030 AF=0.0 'Ampere pannelli
2035 AB=0.0 'Ampere batteria
2045 FOR TMR=1 TO ELE_MEDIA
2050 TM+=CADS1
2055 VB+=CADS2
2060 VF+=CADS3
2065 AF+=CADS4
2070 AB+=CADS5
2075 NEXT TMR
2080 TM*=5.0/ELE_MEDIA/1023*100
2085 VB*= FAT_CORR_V*FAT_CTOV /ELE_MEDIA*FAT_PROP 'PARTITORE TENSIONE DA 0 a 50V
2090 VF*= FAT_CORR_V*FAT_CTOV/ELE_MEDIA*FAT_PROP 'PARTITORE TENSIONE DA 0 a 50V
2092 'USBOUT="AB:" & AB & ":" & ELE_MEDIA & ":" & AB/ELE_MEDIA & CR_LF
2095 AF= (AF/ELE_MEDIA)*(FAT_CTOV/FAT_SEN30)-(2.5/FAT_SEN30) 'SENSORE CORRENTE +/- 30A
2100 AB= (AB/ELE_MEDIA)*(FAT_CTOV/FAT_SEN75)-(2.5/FAT_SEN75) 'SENSORE CORRENTE +/- 75A
2105 TMR=TIMER
2106 CNT=COUNTER
2108 SETCOUNTER
2110 WI+=(WH_IMP*CNT)
2112 'USBOUT="WattAC:" & WH_IMP & "#" & TMR & "#" & CNT & "#" & (WH_IMP*CNT) & CR_LF
2115 WF_IST=VF*AF
2120 WB_IST=VB*AB
2200 'CONTROLLO WATT SUPERA MAX E ACCENSIONE CARICO ESTERNO
2205 IF WF_IST >= MAX_POT_REG THEN :LIMITO_POT
2210 USCITA = INPBIT(PIN_CARICO_ESTERNO) 'riuso variabile TMR per controllo rele carico esterno
2215 IF (USCITA = 0) OR ((USCITA = 1) AND ((WF_IST + WATT_CARICO) >= MAX_POT_REG)) THEN :POT_OK
2220 OUTBIT(PIN_CARICO_ESTERNO) = 0 'SPENGO
2225 GOTO :POT_OK
2230 :LIMITO_POT OUTBIT(PIN_CARICO_ESTERNO) = 1 'Devo limitare la potenza in ingresso regolatore quindi ACCENDO relè con carico
2232 'FINE CONTROLLO WATT
2235 :POT_OK WF+=WF_IST*TMR/3600
2300 'STACCO SOLARE QUANDO SONO SOTTO SOGLIA
2301 IF VB < LIVELLO_BATT_BASSO THEN :STACCO_SOLARE
2303 'STACCO SOLARE QUANDO SONO SOTTO SOGLIA
2304 IF VB > LIVELLO_BATT_ALTO THEN :ATTACCO_SOLARE
2307 'SE IL LIVELLO BATTERIA E' NEL RANGE E BATTERIA BASSA ALLORA NON FACCIO NULLA
2310 'IF BATTERIA_BASSA = TRUE THEN :CONTROLLO_ENEL_FV
2315 GOTO :FINE_CALCOLO_VALORI_FV
2500 :STACCO_SOLARE
2502 'SE IL FLAG BATTERIA E' GIA BASSO ALLORA SALTO
2505 IF BATTERIA_BASSA = TRUE THEN :FINE_CALCOLO_VALORI_FV
2507 'SE IL FLAG BATTERIA E' ALTO ALLORA METTO BASSO E PASSO ENEL
2510 BATTERIA_BASSA=TRUE
2515 OUTBIT(PIN_ENEL_FV)=0 'PASSO AD ENEL
2520 GOTO :FINE_CALCOLO_VALORI_FV
2540 :ATTACCO_SOLARE
2542 'SE IL FLAG BATTERIA E' GIA ALTO ALLORA SALTO
2545 IF BATTERIA_BASSA = FALSE THEN :FINE_CALCOLO_VALORI_FV
2547 'SE IL FLAG BATTERIA E' BASSO ALLORA METTO ALTO E PASSO SOLARE
2550 BATTERIA_BASSA=FALSE
2555 OUTBIT(PIN_ENEL_FV)=1 'PASSO A SOLARE
2560 GOTO :FINE_CALCOLO_VALORI_FV
2700 :FINE_CONTROLLO WB+=WB_IST*TMR/3600
2705 :FINE_CALCOLO_VALORI_FV CLR USCITA, TMR, WF_IST, WB_IST
2710 RETURN
3000 :CREA_NOME_FILE
3010 C=LEN(RASP_DATA)
3020 POS=INSTR("/", RASP_DATA)
3030 IF POS = 0 THEN :ERR_CREA_NOME_FILE
3040 RASP_FILE=LEFT(RASP_DATA, POS-1)
3050 RASP_DATA=RIGHT(RASP_DATA, C-POS)
3060 C=LEN(RASP_DATA)
3070 POS=INSTR("/", RASP_DATA)
3080 IF POS = 0 THEN :ERR_CREA_NOME_FILE
3090 RASP_FILE="PPTEA_"&RIGHT(RASP_DATA, C-POS)&LEFT(RASP_DATA, POS-1)&RASP_FILE & ".txt"
3100 RASP_RET=1
3110 RETURN
3120 :ERR_CREA_NOME_FILE
3130 RASP_RET=0
3140 RETURN
3500 :COMANDO_RASP
3510 RASPSEND=RASP_COM
3512 'PRINT "<send-RASP>" '& RASP_COM
3513 'USBOUT="RASP_COM="&RASP_COM &CR_LF
3514 'WAITS 1
3520 RESET_TIMER
3530 :RIPETI RASP_OUT=RASPRECEIVE
3540 IF TIMER > ATTESA_MAX_RISPOSTA THEN :NO_RESPONCE
3550 IF RASP_OUT="" THEN :RIPETI
3552 'USBOUT="Comando H="&H&CR_LF
3560 RASP_RET=1
3570 GOTO :END
3580 :NO_RESPONCE
3590 RASP_RET=0
3600 SERIALCLOSE
3602 'USBOUT="BEEP"&CR_LF
3610 :END
3620 RETURN
4000 :SINCRONIZZO
4005 'SERIALCLOSE
4010 :RIPETI_PING RASP_COM="<PING>" & FINE_STRINGA_RASP & CR_LF_RASP 'Controllo sincronizzazione PPTEA-RASP
4020 GOSUB :COMANDO_RASP
4030 IF (RASP_RET = 1) AND (RASP_OUT = "<PONG>"
THEN :FINE_SINCRO
4040 SERIALCLOSE
4042 'USBOUT="RASP_OUT="& RASP_OUT & "-ping RASP_RET:" & RASP_RET & CR_LF
4048 'il prossimo comando mi serve per poter ridefinire il nome file nel caso in cui la mancata comunicazione sia stata
4049 'causata dal riavvio RASP o dalla caduta del programma python; altrimenti i log andrebbero sul file di default
4050 DT="#"
4060 GOTO :RIPETI_PING 'se rasp non risponde <PONG> rieseguo <PING>
4070 :FINE_SINCRO RETURN