Fotobot
Get data from your photovoltaic plant
slunce.cpp
1 #include "slunce.h"
2 #include <math.h>
3 #include <QMutexLocker>
4 #include <QTimer>
5 
6 SLUNCE::~SLUNCE() {
7 }
8 
9 
10 SLUNCE::SLUNCE(QCoreApplication *) : QThread(0) {
11  obs_long = 18;
12  obs_lat = 49;
13  datum = QDateTime::currentDateTime();
14  moveToThread(this);
15 }
16 
17 
18 void SLUNCE::start(Priority priority) {
19  QTimer::singleShot(10, this, SLOT(slotInit()));
20  QThread::start(priority);
21 }
22 
23 
24 void SLUNCE::slotInit() {
25  spocti();
26  QTimer *t = new QTimer(this);
27  t->setSingleShot(false);
28  t->setInterval(60000); // minuta
29  t->start();
30  connect(t, SIGNAL(timeout()), this, SLOT(spocti()) );
31 }
32 
33 
40 void SLUNCE::setObserver(double lat, double lng) {
41  obs_lat = lat;
42  obs_long = lng;
43 }
44 
45 
46 void SLUNCE::spocti() {
47  QMutexLocker locker(&m_mutex);
48  datum = QDateTime::currentDateTime();
49  sun_ra_dec();
50  sun_alt_az();
51 }
52 
53 
54 double SLUNCE::ra() {
55  QMutexLocker locker(&m_mutex);
56  return sun_ra / 15.0;
57 }
58 
59 
60 double SLUNCE::dec() {
61  QMutexLocker locker(&m_mutex);
62  return sun_dec;
63 }
64 
65 
66 double SLUNCE::alt() {
67  QMutexLocker locker(&m_mutex);
68  return sun_alt;
69 }
70 
71 
72 double SLUNCE::az() {
73  QMutexLocker locker(&m_mutex);
74  return sun_az ;
75 }
76 
77 
78 void SLUNCE::sun_ra_dec() {
79 
80  // do proměnné d vypočítej počet dní (na desetinná místa) od 1.1.2000 12:00 gmt
81  QDateTime epoch = QDateTime(QDate(2000,1,1),QTime(12,00),Qt::UTC);
82  datum_jd = ((double)epoch.secsTo( datum )) / 86400 ;
83 
84  double mean_longitude = to360 (280.461 + 0.9856474 * datum_jd);
85  double mean_anomaly = to360 (357.528 + 0.9856003 * datum_jd);
86  double ecliptic_longitude = to360 (mean_longitude + 1.915 * sin(mean_anomaly/DTR) + 0.020 * sin(2*mean_anomaly/DTR));
87  double ecliptic_obliquity = to360 (23.429 - 0.0000004 * datum_jd);
88  double Y = cos(ecliptic_obliquity/DTR) * sin(ecliptic_longitude/DTR);
89  double X = cos(ecliptic_longitude/DTR);
90 
91  // rektascenze je OK, pozor na různé jednotky (hodiny, stupně)
92  sun_ra = DTR * atan2 (Y, X);
93  sun_dec = DTR * asin (sin(ecliptic_obliquity/DTR) * sin(ecliptic_longitude/DTR));
94 
95 }
96 
97 
98 void SLUNCE::sun_alt_az() {
99  double gmt_mean_sidereal_time ;
100  double local_mean_sidereal_time ;
101  double hour_angle;
102 
103  double date = floor(datum_jd);
104  double hour = (datum_jd - date - 0.5) * 24;
105 
106  gmt_mean_sidereal_time = to24 ( 6.697375 + 0.0657098242 * date + hour);
107  local_mean_sidereal_time = to24 ( gmt_mean_sidereal_time + obs_long / 15. );
108  hour_angle = to360( local_mean_sidereal_time * 15.0 - sun_ra );
109 
110  sun_alt = sin(sun_dec/DTR) * sin(obs_lat/DTR) + cos(sun_dec/DTR) * cos(obs_lat/DTR) * cos(hour_angle/DTR);
111  sun_alt = asin(sun_alt) * DTR;
112 
113  sun_az = (sin(sun_dec/DTR) - sin(sun_alt/DTR) * sin(obs_lat/DTR) ) /
114  (cos(sun_alt/DTR) * cos(obs_lat/DTR) );
115  sun_az = acos(sun_az) * DTR;
116  if (sin(hour_angle/DTR)>0) { sun_az = 360 - sun_az; }
117 
118 }
119 
120 QString SLUNCE::toDeg(double x) {
121  double d = floor(x);
122  double mf = (x - d) * 60;
123  double m = floor(mf);
124  double s = (mf - m) * 60;
125  return QString(QString("%1:%2:%3").arg(d).arg(m).arg(s));
126 }
127 
128 double SLUNCE::to360(double x) {
129  while (x < 0) { x = x + 360; }
130  while (x > 360) { x = x - 360; }
131  return x;
132 }
133 
134 double SLUNCE::to24(double x) {
135  while (x < 0) { x = x + 24; }
136  while (x > 24) { x = x - 24; }
137  return x;
138 }
139 
double alt()
Vrací výšku slunce nad obzorem.
Definition: slunce.cpp:66
double ra()
Vrací rektascenzi slunce.
Definition: slunce.cpp:54
void setObserver(double lat, double lng)
Definition: slunce.cpp:40
double dec()
Vrací deklinaci slunce.
Definition: slunce.cpp:60
double az()
Vrací azimut slunce.
Definition: slunce.cpp:72