Как определить, с какой стороны светит солнце?
- Войдите на сайт для отправки комментариев
Втр, 27/01/2015 - 16:59
Существуют ли датчики определяющие с какой стороны светит солнце?
Хочу сделать устройство для поворота солнечной баттареей (раньше она простона крыше под 45° лежала в южную сторону). Пока единственная идея - купить кучу температурных датчиков, прикрепить на полусфере и отслеживать, какой из датчиков будет давать большее увеличение температуры - в ту сторону и поворачиваем. Но погрешность большая будет, да и сенсоры температуры надо не только по кругу ставить, но и в высоту, так что их куча нужна. А может есть что-то готовое на рынке?
http://arduino.ru/forum/proekty/prostenkii-solnechnyi-treker-na-baze-mot...
http://arduino.ru/forum/programmirovanie/slezhenie-za-solntsem-sunpos
http://electronix.ru/forum/lofiversion/index.php/t118479.html
Существуют ли датчики определяющие с какой стороны светит солнце?
Хочу сделать устройство для поворота солнечной баттареей (раньше она простона крыше под 45° лежала в южную сторону). Пока единственная идея - купить кучу температурных датчиков, прикрепить на полусфере и отслеживать, какой из датчиков будет давать большее увеличение температуры - в ту сторону и поворачиваем. Но погрешность большая будет, да и сенсоры температуры надо не только по кругу ставить, но и в высоту, так что их куча нужна. А может есть что-то готовое на рынке?
если батарея стационарная, то положение солнца постоянно и имеет два основных цикла - годовой и суточный. Можно сделать координатный стол в двух измерениях - повротон 360 градусов и наклон 0-90 градусов. Дальше по часам реального времени записываем заранее расчитанные углы положения в зависимости от дня года и времени суток
если же хотите следить за максимальной освещенностью с учетом облаков, то нужно делать координатну сетку из фотодатчиков с линзами. Расчет координат делать исходя из максимальной средней освещенности площади батареи
сделайте для начала один канал - слежение по азимуту - два фоторезистора, ардуина, серва, код
можно проще - в 12:00 местного времени солнце находится на юге, угловая скорость солнца - 15 градусов в час
положение можно посчитать только по часам - точность нормальная
здесь http://planetcalc.ru/320/ рассчитать 365 положений солнца в 12:00, запихать это в массив и от этого по часам и дате рассчитывать азимут солнца и угол над горизонтом
Два фоторезистора разделённых перегородкой. Простейший код. Давно это было.....
Если по двум координатам- 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); }