// feb 2018, azurirano apr 2019. // prikazuje podatke o ulaznom naponu solara, izlazu smps, struji , snazi i temperaturi // juri mppt tacku preko snage #include #define BACKLIGHT_PIN 3 // =============================================================================================== // =============================================================================================== byte solar[8] = //ikona solar { 0b11111,0b10101,0b11111,0b10101,0b11111,0b10101,0b11111,0b00000 }; byte battery[8] = //baterija { 0b01110,0b11011,0b10001,0b10001,0b10001,0b10001,0b10001,0b11111 }; byte energy[8] = // munja { 0b00010,0b00100,0b01000,0b11111,0b00010,0b00100,0b01000,0b00000 }; byte temp[8] = //termometar { 0b00100,0b01010,0b01010,0b01110,0b01110,0b11111,0b11111,0b01110 }; byte pwm[8] = { B11100, B10100, B10101, B10101, B10101, B10101, B00101, B00111 }; // =============================================================================================== // =============================================================================================== // =============================================================================================== // =============================================================================================== float citaj_napon(int pina) { int x=0; float n=0; for(x=0;x<10;x++) // funkcija cita i sumira napon, razdelnik je 18k-1k { n = n + (analogRead(pina) * (5.0 / 1023.0)); } n = n/10; n =n *19.4; return n; } // =============================================================================================== // =============================================================================================== float citaj_struju(int pinb) { int y=0; float s=0, s1=0; for(y=0;y<10;y++) { s=s + analogRead(pinb); // struja merena preko ACS758 BI strujnog hall senzora } s = s/10; s1= abs((512-s)/8); s1=s1-0.595; return s1; } // =============================================================================================== // =============================================================================================== int k=0, l=0, m=0, djuti=1, dt=0; float snaga=0, starasnaga=0, vfn=0, starivfn=0, vbat=0, struja=0, starastruja=0, vpod=14.3; // podesiti ovde radni napon baterije !!! double T=0; LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); void setup() { pinMode(3,OUTPUT); // MPPT kontrola drugog atmega na optokapleru pinMode(13,OUTPUT); pinMode(A0,INPUT); // vout acs hall senzora pinMode(A1,INPUT); // napon fn panela pinMode(A2,INPUT); // napon bat pinMode(A3,INPUT); // ntc termistor 100k sa otpornikom na divideru od 100k digitalWrite(13,LOW); lcd.begin (16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.home (); lcd.createChar(1,solar); // NAPRAVI KARAKTERE SOLARA BATERIJE ITD lcd.createChar(2, battery); lcd.createChar(3, energy); lcd.createChar(4,temp); lcd.createChar(5,pwm); // =========================================== // =========================================== lcd.setBacklight(HIGH); starivfn=citaj_napon(A1); starastruja=citaj_struju(A0); starasnaga=starivfn*starastruja; } // =========================================== // =========================================== void loop() { for(k=0;k<10;k++) { T=T+analogRead(A3); // temp. odokativno. ne sviđa mi se kompleksni logaritamski proračun } // svakako je namestiti empirijski T=T/10.00; T=T/16; // =========================================== vbat=citaj_napon(A2)-0.1; vfn=citaj_napon(A1); struja=citaj_struju(A0); snaga=vfn*struja; if ( (T<60) && (vbatvbat+43.00) && (struja<7.00)) // moj sistem ima najbolju snagu u opsegu ulaznog napona 55V-77V { if( snaga>starasnaga && vfn>=starivfn ) { djuti++; analogWrite(5,djuti); digitalWrite(13,HIGH); } } else { djuti--; analogWrite(5,djuti); digitalWrite(13,LOW); }; // else racva glavne if petlje. if (djuti<=1) {djuti=1;}; // koriguj granicne vrednosti duty-ja. if (djuti>=254) {djuti=254;}; starivfn=vfn; starasnaga=snaga; starastruja=struja; digitalWrite(13,LOW); // =========================================== // =========================================== m++; if(m>50 ) // ispisuj displej svaki 50ti prolaz kroz petlju. to je brzo, mozda ipak svaki 80ti put.... { lcd.setCursor(0,0); lcd.write(1); lcd.setCursor(1,0); if (vfn<10) {lcd.setCursor(2,0);}; lcd.print(vfn,0); lcd.setCursor(3,0); lcd.print("V"); lcd.setCursor(0,1); lcd.write(2); lcd.setCursor(1,1); lcd.print(vbat,1); lcd.setCursor(5,1); lcd.print("V"); lcd.setCursor(6,0); lcd.write(3); lcd.setCursor(7,0); lcd.print(struja,1); lcd.setCursor(10,0); lcd.print("A"); lcd.setCursor(12,0); if(snaga<10.00) { lcd.print(" "); lcd.setCursor(14,0); }; if((snaga<100.00)&&(snaga>=10)) { lcd.print(" "); lcd.setCursor(13,0); }; lcd.print(snaga,0); lcd.setCursor(15,0); lcd.print("W"); lcd.setCursor(7,1); lcd.write(4); lcd.setCursor(8,1); if(T<10.00 && T>=0.00) { lcd.print(" "); lcd.setCursor(9,1); }; lcd.print( T , 0); lcd.setCursor(10,1); lcd.print("C"); lcd.setCursor(12,1); lcd.write(5); dt= map(djuti,0,255,0,100); lcd.setCursor(13,1); if (dt<10) { lcd.print(" "); lcd.setCursor(14,1); }; lcd.print(dt); lcd.setCursor(15,1); lcd.print("%"); } if (m>50) {m=0;}; }