Солнечный трекер позволяет отслеживать текущее положение источника света и корректировать угол поворота сенсоров таким образом, чтобы поток солнечного света на них был максимален. В качестве сенсоров выступают два фоторезистора.
Схема состоит из одного сервопривода и 2-х фоторезисторов. Фоторезисторы меняют свое сопротивление в зависимости от падающего света, далее происходит сравнение этих двух величин. И в зависимости от того где полученное цифровое значение больше туда и происходит поворот сервопривода.
Поворот осуществляется до тех пор, пока цифровое значение света обоих фоторезисторов не уровняется. Другими словами сервопривод солнечного трекера перестанет поворачиваться, когда свет будет одинаково падать на оба фоторезистора. Ниже приведен небольшой код трекера из которого все понятно, что происходит.
Полученные значения сохраняются в переменные val1 и val2, далее происходит их сравнение. Если они равны то солнечный трекер находиться в покое, а если их разница больше или меньше нуля, то сервопривод начинает работать.
Фоторезисторы подключены по схеме делителя напряжения, через дополнительное сопротивление в 10 кОм подключенные к земле. При изменении сопротивления фоторезисторов, меняеться напряжение на вывода A0 и A1 платы Arduino.
Код программы
#include Servo myservo;
int pos = 90; // initial position int sens1 = A0; // LRD 1 pin int sens2 = A1; //LDR 2 pin int tolerance = 2; void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object pinMode(sens1, INPUT); pinMode(sens2, INPUT); myservo.write(pos); delay(2000); // a 2 seconds delay while we position the solar panel } void loop() { int val1 = analogRead(sens1); // read the value of sensor 1 int val2 = analogRead(sens2); // read the value of sensor 2 if((abs(val1 - val2) <= tolerance) || (abs(val2 - val1) <= tolerance)) { //do nothing if the difference between values is within the tolerance limit } else { if(val1 > val2) { pos = --pos; } if(val1 < val2) { pos = ++pos; } } if(pos > 180) { pos = 180; } // reset to 180 if it goes higher if(pos < 0) { pos = 0; } // reset to 0 if it goes lower myservo.write(pos); // write the position to servo delay(50); }
Комментарии