Arduino Theo dõi năng lượng mặt trời


Theo dõi năng lượng mặt trời - một hệ thống được thiết kế để theo dõi sự chuyển động của mặt trời để đạt được hiệu quả tối đa từ các tấm pin mặt trời.
Khái niệm về trình theo dõi cực kỳ đơn giản - theo hai cảm biến, bộ điều khiển buộc động cơ servo quay nền tảng với pin mặt trời theo hướng có nhiều ánh sáng hơn.
Nguyên mẫu nhà của bộ theo dõi làm việc được hiển thị trong ảnh dưới đây:
Nguyên mẫu theo dõi năng lượng mặt trời
Dự án sử dụng hai cảm biến quang điện trở, được định hướng theo các hướng khác nhau từ một bề mặt phẳng bằng 45 °, tức là so với nhau, các chất quang dẫn được định hướng 90 °. Mũ được đeo trên các cảm biến để dòng ánh sáng chiếu vào chúng bị tập trung hẹp.
Dự án sử dụng bộ điều khiển Arduino. Bộ điều khiển theo định kỳ lần đọc các giá trị từ hai cảm biến, và so sánh chúng. Nếu các giá trị từ các cảm biến là như nhau, thì bảng điều khiển được chỉ vào mặt trời. Nếu giá trị của một trong các cảm biến khác với cảm biến khác, bộ điều khiển sẽ ra lệnh cho động cơ servo để xoay nền tảng. Lệnh trên servo hoạt động cho đến khi các giá trị từ các cảm biến bằng nhau.
Mạch theo dõi năng lượng mặt trời
Để ngăn chặn xoay vòng nền tảng quá mức, có các giới hạn xoay phần mềm có thể bị vô hiệu hóa nếu cần thiết. Ngoài ra, hằng số dải chết được cung cấp trong mã chương trình, nếu chênh lệch từ các cảm biến nhỏ hơn giá trị của hằng số này, bộ điều khiển sẽ không đưa ra lệnh xoay động cơ servo. T.O. giật của nền tảng được ngăn chặn (jitter).
Ngoài ra, chỉ trong trường hợp, 2 biến được thêm vào để làm mịn các giá trị từ các cảm biến. Điều này giúp lọc khí thải và tiếng ồn.

Phác thảo cho Arduino

Trong phần đầu của chương trình, các thư viện trình cắm được mô tả (trong trường hợp của chúng tôi, servo.h), các chân và hằng được xác định
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include
 
//IO Pins
int pinL = 5;              //IO Pin левого фоторезистора
int pinR = 4;              //IO Pin правого фоторезистора
int pinServo = 11;         //PWM pin серво
 
int leftValue = 0;         //Значение левого фоторезистора
int rightValue = 0;        //Значение правого фоторезистора
int error =0;              //Разница между показаниями двух датчиков
int errorAVG = 0;          //Error Average - Rolling 2 Point
 
int deadband = 10;         //Мертвая зона (защита от джиттера)
//Servo Stuff
Servo hServo;              //servo object
int Position = 45;         //Position to write out
 
int minPos = 5;            //Min позиция
int maxPos = 150;          //Max позиция
 
float output = (maxPos - minPos) /2;  //Initial output Position
Đoạn mã sau mô tả hàm Setup (). Chức năng này chỉ được thực hiện một lần khi khởi động chương trình hoặc sau khi thiết lập lại bộ điều khiển. Tại đây, bạn có thể hiển thị bất kỳ dữ liệu nào để gỡ lỗi trong Màn hình nối tiếp, hoặc, như trong ví dụ dưới đây, thực hiện "chạy" động cơ servo dọc theo toàn bộ đường dẫn đến giới hạn.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void setup()
{
Serial.begin(9600);
 
hServo.attach(pinServo);
 
//Set Servo to Centre for Alignment Purpose
Serial.println("Перемещение к начальной позиции");
hServo.write(minPos);
delay(5000);
Serial.println("Перемещение к конечной позиции");
hServo.write(maxPos);
delay(5000);
Serial.println("Перемещение к средней точке");
hServo.write(output);
delay(5000);
Serial.println("Going Live................");
}
Phần cuối cùng của mã được thực thi trong hàm loop (). Ở đây các giá trị được đọc từ các cảm biến, tất cả các tính toán được thực hiện và các lệnh được đưa ra cho động cơ servo.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Ngày 29
30
31
32
33
34
35
36
37
38
void loop()
{
  //Чтение значений с фоторезисторов
   leftValue = analogRead(pinL);
   rightValue = analogRead(pinR);
 
 Serial.print("L = "); Serial.print(leftValue); Serial.print(" | ");
 Serial.print("R = "); Serial.print(rightValue); Serial.print(" | ");
 Serial.print("E = "); Serial.print(error); Serial.print(" | ");
 Serial.print("Eavg = "); Serial.print(errorAVG);
 Serial.println();
 
  //Расчет
 error = leftValue - rightValue;
 errorAVG = (errorAVG + error) / 2;
  
 float newOutput = output + getTravel();
  
 if (newOutput > maxPos)
 {
   Serial.println("At Upper Limit");
   newOutput = maxPos;
 }
 else
 {
   if (newOutput < minPos)
   {
     Serial.println("At Lower Limit");
     newOutput = minPos;
   }
 }
    Serial.println("Writing output");
     
    //Вывод команды управления серво
    hServo.write(newOutput);
    output = newOutput;
}
}
Ngoài ra, chương trình sử dụng hàm phụ trợ getTravel (), được sử dụng để tính toán vị trí xoay servo - trái, phải hoặc không làm gì cả. Hàm chỉ đơn giản trả về giá trị: 0 - không có gì xảy ra, -1 rẽ trái, +1 rẽ phải.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int getTravel()
{
  // -1 = Влево; +1 = Вправо
  
 if (errorAVG < (deadband * -1))
 {
   return 1;
 }
 else
 {
   if (errorAVG > deadband)
   {
     return -1;
   }
   else
   {
     //Ничего не делаем
     return 0;
   }
 }
}
Tất nhiên, đây là một máy theo dõi năng lượng mặt trời đơn giản và có thể dùng làm cơ sở cho các thiết bị phức tạp hơn. Ví dụ: bạn có thể lọc các biến đầu vào tốt hơn, thêm điều khiển PID, thêm ổ servo thứ hai vào mạch để di chuyển bảng điều khiển năng lượng mặt trời theo chiều dọc và đạt hiệu quả tối đa.

Tệp đính kèm:

Nhận xét

Bài đăng phổ biến từ blog này

DIY 2kVA SMPS 90V 15A HB PFC with IR2110 Mosfet Driver

Đo các thông số của loa ở nhà và một cách để định cấu hình phản xạ âm trầm

SMPS FULLBRIDGE PFC Schematic + PCB Layout PDF