雙軸太陽能追光系統 - ESP32實現
系統概述
這個系統使用:
- ESP32開發板
- 2個舵機(水平方向和垂直方向)
- 4個光敏電阻(用于檢測光照方向)
- 適當的電阻(用于光敏電阻分壓)
接線示意圖
+-------------------+ +-----------------+
| ESP32 | | 光敏電阻 |
| | | L1 L2 |
| GND |-------| GND GND |
| 3.3V |-------| VCC VCC |
| GPIO32|------| L1信號 |
| GPIO33|------| L2信號 |
| GPIO34|------| L3信號 |
| GPIO35|------| L4信號 |
| | | |
| GPIO25|------| 水平舵機信號 |
| GPIO26|------| 垂直舵機信號 |
| | | |
| GND |-------| 舵機GND |
| 5V |-------| 舵機VCC |
+-------------------+ +-----------------+
光敏電阻布置:
- L1: 左側
- L2: 右側
- L3: 上側
- L4: 下側
所需組件清單
- ESP32開發板
- SG90舵機 x2
- 光敏電阻 x4
- 10kΩ電阻 x4
- 面包板和跳線若干
- 太陽能板(可選,用于實際應用)
VSCode代碼實現
首先確保您已安裝PlatformIO插件,然后創建一個新的ESP32項目。
完整的環境配置步驟
- 安裝必要的工具
安裝VSCode
在VSCode擴展商店中搜索安裝PlatformIO IDE
- 創建新項目
按Ctrl+Shift+P → 輸入PlatformIO: New Project
選擇板子型號:ESP32 Dev Module
選擇框架:Arduino
完成創建
- 修改配置文件
打開platformio.ini文件,修改為以下內容:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps = madhephaestus/ESP32Servo@^0.12.0
代碼 (main.cpp)
#include <Arduino.h>
#include <ESP32Servo.h>// 定義光敏電阻引腳
#define L1_PIN 32 // 左側
#define L2_PIN 33 // 右側
#define L3_PIN 34 // 上側
#define L4_PIN 35 // 下側// 定義舵機引腳
#define SERVO_HORIZ_PIN 25 // 水平舵機
#define SERVO_VERT_PIN 26 // 垂直舵機// 創建舵機對象
Servo servoHoriz; // 水平方向舵機
Servo servoVert; // 垂直方向舵機// 舵機初始位置
int horizPos = 90; // 水平初始位置 (0-180)
int vertPos = 90; // 垂直初始位置 (0-180)// 光敏電阻讀數
int l1, l2, l3, l4;// 舵機移動步長
const int STEP = 2;// 光敏電阻閾值差
const int THRESHOLD = 50;void setup() {Serial.begin(115200);// 初始化舵機servoHoriz.attach(SERVO_HORIZ_PIN);servoVert.attach(SERVO_VERT_PIN);// 設置初始位置servoHoriz.write(horizPos);servoVert.write(vertPos);// 光敏電阻不需要設置模式,因為它們是模擬輸入
}void loop() {// 讀取所有光敏電阻值l1 = analogRead(L1_PIN); // 左l2 = analogRead(L2_PIN); // 右l3 = analogRead(L3_PIN); // 上l4 = analogRead(L4_PIN); // 下// 打印傳感器值用于調試Serial.printf("L1: %d, L2: %d, L3: %d, L4: %d\n", l1, l2, l3, l4);// 水平方向控制int horizDiff = l1 - l2;if (abs(horizDiff) > THRESHOLD) {if (horizDiff > 0 && horizPos < 180) {horizPos += STEP; // 向左轉} else if (horizDiff < 0 && horizPos > 0) {horizPos -= STEP; // 向右轉}servoHoriz.write(horizPos);}// 垂直方向控制int vertDiff = l3 - l4;if (abs(vertDiff) > THRESHOLD) {if (vertDiff > 0 && vertPos < 180) {vertPos += STEP; // 向上轉} else if (vertDiff < 0 && vertPos > 0) {vertPos -= STEP; // 向下轉}servoVert.write(vertPos);}// 打印當前位置Serial.printf("Horizontal Position: %d, Vertical Position: %d\n", horizPos, vertPos);// 延遲以避免過快響應delay(100);
}
platformio.ini 配置
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps = ESP32Servo
系統工作原理
- 光敏電阻檢測:四個光敏電阻分別檢測四個方向的光照強度。
- 方向判斷:通過比較左右光敏電阻的值差判斷水平方向,比較上下光敏電阻的值差判斷垂直方向。
- 舵機控制:根據光照差異調整舵機位置,使太陽能板始終朝向光照最強的方向。
- 閾值控制:只有當光照差異超過閾值時才調整位置,避免微小變化導致的頻繁調整。
模型
盡管這個模型在網絡上流傳甚廣,但是我沒有找到視頻中的程序和模型,使用我自己構建了一個
優化建議
- 可以添加PID控制算法使運動更加平滑
- 可以增加夜間復位功能,當所有光敏電阻值都很低時回到初始位置
- 可以添加WiFi功能,通過手機APP監控和調整系統
- 考慮添加太陽能電池電壓檢測功能
注意事項
- 確保舵機電源足夠(可能需要外部電源)
- 光敏電阻需要合理布置,避免相互干擾
- 根據實際光照情況調整THRESHOLD和STEP值
- 注意舵機的機械限位,避免損壞
這個系統可以有效地跟蹤太陽位置,提高太陽能板的發電效率。您可以根據實際需求進一步調整和優化代碼。