//#include <Servo.h>//Zapojeni//Sledování slunce://-RC6 - PD1//-RC7 - PD0//Měření energie//-RC6 - PD3//-RC7 - PD7//Meteorologická část//-RC6 - PB1//-RC7 - PB0//Zbyle propojeni//definici zapadleho slunce pro blok mereni energie//PC1 (A1) -RB1 (log.1 noc)//pin pro odpojeni SD karty//PC0 (A0) - GND(mereni) - VCC (mozno odpojit)//GPS modul//RXD -signed int AZIMUT, azimutOD=0; //promena pro hodnotu azimutu Slunceint ELEVACE, elevaceOD=0; //promena pro hodnotu elevace Slunce#include <TinyGPS.h>#include <SoftwareSerial.h>#include <SD.h>#include <math.h>#include <stdlib.h>TinyGPS gps;SoftwareSerial ss(5, 6); //pro pripojeni modulu GPS (PD5 PD6)char filename[10]; //pro ulozeni naszvu souboruchar dataGPS[130];char dataUvodni[60];char dataNATACENI[10];float flat, flon; //zemepisna sirka, delkaunsigned long age;int year;byte month, day, hour, minute, second, hundredths;byte day2=0;unsigned long fix_age;int c=0;SoftwareSerial so1Serial(7, 3);SoftwareSerial so2Serial(8, 9);File myFile;int odchylka=5; //definuje po jakém kroku se má sledovat sluncevoid setup(){int count=0;Serial.begin(9600);ss.begin(9600);pinMode(10, OUTPUT); //sd kartaso1Serial.begin(9600);so2Serial.begin(9600);if (!SD.begin(4)) { //inicializace SD karty//Serial.println("inicializace se nepovedla");return;//nastaveni preruseni na pinu PD2//pro detekci vysouvani kartyattachInterrupt(0, off, HIGH);interrupts();}//Serial.println("inicializace provedena");}//uzavre zapis na SD karte//pro opetovne zapnuti je potreba resetovat//mikropocitacvoid off (void){while(true){myFile.close();while(true);}}int stupne (float rad) //prevod rad na stupne{int a =(int) ((rad/3.14)*180);return a;}float rad (float stup) //prevod stupne na rad{float a = ((stup/180)*3.14);return a;}//provede vypocet dnu od zacatku rokuint den (int m, int d) //vstupem je mesic a den{switch (m) {case 1: d=d;break;case 2: d=31+d;break;case 3: d=58+d;break;case 4: d=89+d;break;case 5: d=119+d;break;case 6: d=150+d;break;case 7: d=180+d;break;case 8: d=211+d;break;case 9: d=242+d;break;case 10: d=262+d;break;case 11: d=303+d;break;case 12: d=333+d;break;default:printf("chyba");break;}//Serial.println("Den: ");//Serial.println(d);return d;}float deklinace (float d) //vstupem je den v roce{float b = 0.98630137;d=((rad(23.45))*sin(rad(b*(d-81))));//Serial.println("Deklinace");//Serial.println(d,4);return d;}float lstm (int gmt) //vstupem je GMT dane lokality{float a;a=((rad(15))*gmt);//Serial.println("lstm");//Serial.println(a,10);return a;}float eot (float d) //vstupem je den v roce{float a;a=rad(0.98630137*(d-81));a=9.87*sin(2*a)-7.53*cos(a)-1.5*sin(a);//Serial.println("eot");// Serial.println(a,10);return a;}float tc (int delka, float lstm, float eot) //vstupem je zemepisná delka, LSTM, EoT{float a;a=4*(float)(delka-lstm)+eot;//Serial.println("tc");//Serial.println(a);return a;}float lst (float lt, float tc) //vstupem je den GMT dane lokality{float a;a=lt+(tc/60);return a;//Serial.println("lst");// Serial.println(a);}float hra (float lst) //vstupem je den v roce{lst=(rad(15))*(lst-12);//Serial.println("hra");//Serial.println(lst,4);return lst;}//vstupem je mesic, den, hodina, minuty, GMT, zemepisna sirka ve stupnichvoid poziceSL(int m, int d, int h, int minu, int gmt, float sirka, float delka){float den1;float ele,azi,deklin, lstm1, eot1, tc1, lst1, hra1;float lt = h+((float)minu/60);//Serial.println("lt");//Serial.println(lt);den1=(float) den(m,d);deklin=deklinace(den1);lstm1=lstm(gmt);eot1=eot(den1);tc1=tc(delka, lstm1, eot1);lst1=lst(lt,tc1);hra1=hra(lst1);sirka=rad(sirka);ele=asin((sin(deklin)*sin(sirka))+(cos(deklin)*cos(sirka)*cos(hra1)));azi = acos(((sin(deklin)*cos(sirka))-(cos(deklin)*sin(sirka)*cos(hra1)))/(cos(ele)));//printf("Azimut: %6.3f\r\n", azi);//printf("Elevce: %6.3f\r\n", ele);ELEVACE=stupne(ele);AZIMUT= stupne(azi);if(hra1>0){AZIMUT= 360-AZIMUT;}}void datagps() //vycet tat z GPS modulu{bool newData = false;unsigned long chars;unsigned short sentences, failed;for (unsigned long start = millis(); millis() - start < 1000;){while (ss.available()){char c = ss.read();if (gps.encode(c))newData = true;}}if (newData){gps.f_get_position(&flat, &flon, &fix_age);gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &fix_age);}}void loop () //nekonecna smycka{int az, ele;byte zk;ss.listen();datagps();//int mesic, den, hodina, minuta, odchylka èasu od GMT, sirka, delkapoziceSL(month, day, hour, minute, 0, flat, flon);//vytvori nazev souborusprintf(filename, "MET%d%d.txt", month, day);//Serial.print(filename);//pro kazdy den se vytvori novy soubor//slouzi pro generovani uvodniho nadpisu v souboruif(!day2==day){c=0;day2=day;}if(ELEVACE<0){analogWrite(A1,255);}//Serial.print("Azimut");//Serial.println(AZIMUT);//Serial.print("ELevace");//Serial.println(ELEVACE);//Priprava dat pro zapis na SD kartusprintf(dataGPS,"\r\n %4.0d %2.0d %2.0d %2.0d %2.0d %3.0d %3.0d %3.0d %3.0d", year, month, day, hour, minute, (int)flon, (int) flat, (int)AZIMUT,(int) ELEVACE);// Serial.println(dataGPS);//zamezi nataceni solarniho panelu v noc//prez den provede nove nastaveni solaru vzdy//po prekroceni odchylky od slunce o uhel//zadaný v promenné odchylkaif(ELEVACE<0){//Serial.print("noc");}else{//Serial.print("den porovnani");az=AZIMUT-azimutOD;az=abs(az);ele=ELEVACE-elevaceOD;ele=abs(ele);if((ele>odchylka)||(az>odchylka)){//Serial.print("odchylka nove nastaveni");azimutOD=AZIMUT;elevaceOD=ELEVACE;sprintf(dataNATACENI,"%d ", ELEVACE);Serial.print(dataNATACENI);delay (100);sprintf(dataNATACENI,"%d ", AZIMUT);Serial.print(dataNATACENI);}}//otevre, nebo vytvory soubor//s nazvem v promenné filenameFile myFile = SD.open(filename, FILE_WRITE);//pri privedeni napeti VDD na pin PC0 procesoru,//dojde k uzavreni soubor a dokud nebude//na tento pin privede GND program bude pozastaven//Pro bezpecne odpojeni SD karty//while(!analogRead(A0)==0)// {// myFile.close();// while(true);//}if (myFile){if(c==0) //obsahuje hlavicku souboru{myFile.print("Meteorologicka stanice Jan Chroust 2013 \n");sprintf(dataUvodni,"Mereni ze den %2.0d.%2.0d.%4.0d \n", day, month, year);myFile.print(dataUvodni);delay(10);myFile.print(" \n");// Serial.print(dataUvodni);c=1;}else{}myFile.print(dataGPS); //ulozi data na SD kartu//Serial.print(dataGPS);so1Serial.listen();//cekani na data ze seriove linkywhile(so1Serial.available()==0){}delay(1000);//vycet dat ze seriove linky//data z blku mereni energiewhile (so1Serial.available()){char baterie = so1Serial.read();myFile.print(baterie);//Serial.print(baterie);}so2Serial.listen();while(so2Serial.available()==0){}delay(1000);//nacteni dat ze seiové linky//data z meteorologického blokuwhile (so2Serial.available()){char baterie = so2Serial.read();myFile.print(baterie);// Serial.print(baterie);}// uzavreni souborumyFile.close();}else{//pri neotevreni souboru//Serial.println("Nepodarilo se otevrit soubor");}delay(200); //frekvence zapisu na SD}