Как определить, с какой стороны светит солнце?

InterSky
Offline
Зарегистрирован: 24.12.2014

Существуют ли датчики определяющие с какой стороны светит солнце?

Хочу сделать устройство для поворота солнечной баттареей (раньше она простона крыше под 45° лежала в южную сторону). Пока единственная идея - купить кучу температурных датчиков, прикрепить на полусфере и отслеживать, какой из датчиков будет давать большее увеличение температуры - в ту сторону и поворачиваем. Но погрешность большая будет, да и сенсоры температуры надо не только по кругу ставить, но и в высоту, так что их куча нужна. А может есть что-то готовое на рынке?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
axill
Offline
Зарегистрирован: 05.09.2011

InterSky пишет:

Существуют ли датчики определяющие с какой стороны светит солнце?

Хочу сделать устройство для поворота солнечной баттареей (раньше она простона крыше под 45° лежала в южную сторону). Пока единственная идея - купить кучу температурных датчиков, прикрепить на полусфере и отслеживать, какой из датчиков будет давать большее увеличение температуры - в ту сторону и поворачиваем. Но погрешность большая будет, да и сенсоры температуры надо не только по кругу ставить, но и в высоту, так что их куча нужна. А может есть что-то готовое на рынке?

если батарея стационарная, то положение солнца постоянно и имеет два основных цикла - годовой и суточный. Можно сделать координатный стол в двух измерениях - повротон 360 градусов и наклон 0-90 градусов. Дальше по часам реального времени записываем заранее расчитанные углы положения в зависимости от дня года и времени суток

если же хотите следить за максимальной освещенностью с учетом облаков, то нужно делать координатну сетку из фотодатчиков с линзами. Расчет координат делать исходя из максимальной средней освещенности площади батареи

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

сделайте для начала один канал - слежение по азимуту - два фоторезистора, ардуина, серва, код

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

можно проще - в 12:00 местного времени солнце находится на юге, угловая скорость солнца - 15 градусов в час

положение можно посчитать только по часам - точность нормальная

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

здесь http://planetcalc.ru/320/ рассчитать 365 положений солнца в 12:00, запихать это в массив и от этого по часам и дате рассчитывать азимут солнца и угол над горизонтом

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Два фоторезистора разделённых перегородкой. Простейший код. Давно это было.....

Если по двум координатам- 4 фоторезистора разделённых крестом, но код для каждой пары тот-же.

Вот, нашёл.....

Библиотека отсюда  http://playground.arduino.cc/Code/SimpleTimer

Или у меня архивом: https://www.dropbox.com/s/jjwgmslr6vpl7gb/SimpleTimer.zip?dl=0

Библиотека использует миллис, поэтому можно легко делать что-нибудь ещё.

 

// trembo  solar taracker
#define ver 0.1
#include <SimpleTimer.h>

#define LDR1 0
#define LDR2 1

#define leftRotatePin  4
#define rightRotatePin 5


const double percentSetting = 10.0;
double percent = 0.0;
unsigned int valueLDR1;
unsigned int valueLDR2;
int valueDelta ;

SimpleTimer timer ;

void setup()   { 
 Serial.begin(115200);
  pinMode (leftRotatePin, OUTPUT);
  pinMode (rightRotatePin, OUTPUT);
  
  timer.setInterval(1000, trackSolar);
  
  Serial.print (F("Relay solar tracker  by  trembo    Ver   "));
  Serial.println (ver,1);
  Serial.println();
  Serial.print(  __DATE__    );
  Serial.print("   ");
  Serial.println(  __TIME__    );
  delay(1000);
  Serial.println();
  
  Serial.print("LDR pins is analog ");
  Serial.print (LDR1);
  Serial.print("  and  ");
  Serial.println (LDR2);
  
  Serial.print("Relay  pins is     ");
  Serial.print (leftRotatePin);
  Serial.print("  and  ");
  Serial.println (rightRotatePin);
  Serial.println();
  
 
}

void loop(){ // Loop begin
  timer.run() ;
 } // Loop end

void leftRotate(){
  digitalWrite (leftRotatePin, HIGH);
  Serial.print("  LEFT  ");
}

void rightRotate(){
  digitalWrite (rightRotatePin, HIGH);
  Serial.print("  RIGHT  ");
}

void stopRotate(){
  digitalWrite (leftRotatePin, LOW);
  digitalWrite (rightRotatePin, LOW);
  Serial.print("  STOP  ");
}


void trackSolar() {
  percent = 0.0;
  valueLDR1 = analogRead ( LDR1 ) ;
  valueLDR2 = analogRead ( LDR2 ) ; 
  valueDelta = valueLDR1 - valueLDR2 ;
  percent = valueDelta / 1024.0 * 100.0;

  if (percent - percentSetting > 0.0) 
  {
    leftRotate();
    Serial.print("  left  ");
  }

  else if  (percent + percentSetting < 0.0) 
  {
    rightRotate();
   // Serial.print("  right  ");
  }
  else {
    stopRotate();
   // Serial.print("  stop  ");
   }

  float voltage1 = valueLDR1 * 5.0 / 1024.0;
  float voltage2 = valueLDR2 * 5.0 / 1024.0;
  float voltageDelta = voltage1 - voltage2;  

  Serial.print("Uptime (s): ");
  Serial.print(millis() / 1000);
  Serial.print("   ");
  Serial.println(percent,1);

}