当前位置: 首页 > news >正文

基于单片机设计的太阳能跟踪器

一、前言

随着对可再生能源的需求不断增长,太阳能作为一种清洁、可持续的能源形式,受到越来越多的关注和应用。太阳能光板通常固定在一个固定的角度上,这限制了它们对太阳光的接收效率。为了充分利用太阳能资源,提高太阳能光板的收集效率,需要设计一个能够自动跟踪太阳光的系统。

本项目采用基于单片机的设计方案,主控芯片选择STC89C52。在太阳能光板的四个角上,安装了四个光敏电阻,它们用于检测四个方向太阳光的最强位置。每个光敏电阻通过PCF8591模块与主控芯片相连,利用模数转换器(ADC)采集各个通道的数据值。

通过对四个光敏传感器采集到的数据进行处理和比较,主控芯片能够确定太阳光的最强位置所在。然后,通过控制两个28BYJ-48-5V步进电机的运动,太阳能光板可以实现左右和上下方向的旋转。通过调整太阳能光板的倾斜角度,使其与太阳光保持垂直,以获得最大的太阳能收集效率。

该太阳能跟踪器的设计旨在实现自动化的太阳光追踪,以提高太阳能光板的能源收集效率。通过使用光敏电阻、ADC转换和步进电机控制等技术手段,系统能够准确地确定太阳光的位置,并自动调整太阳能光板的朝向。这将大大提高太阳能系统的能源输出,并为可再生能源的利用做出贡献。

image-20230823173509365

image-20230823173630278

二、系统设计思路

2.1 硬件选型

【1】主控芯片:STC89C52 STC89C52是一款高性价比的单片机,具有丰富的外设和强大的计算能力。采用基于MCS-51内核的8位单片机架构,拥有存储容量大(8KB Flash和256B RAM)和丰富的IO口(32个),适合控制太阳能跟踪器系统的各种功能。

【2】光敏电阻:选择具有高灵敏度和较小尺寸的光敏电阻,并根据光照条件进行选择。通过与PCF8591模块连接,可以将光敏电阻的电阻值变化转换为相应的模拟电压信号。

【3】ADC模块:PCF8591 PCF8591是一款常用的4通道12位ADC模块,适用于将模拟信号转换为数字信号。通过连接4个光敏电阻到PCF8591的4个输入通道上,可以实现数据的采集和转换。

【4】步进电机:28BYJ-48-5V 28BYJ-48-5V步进电机是一个小型、低功耗的步进电机,适用于低速应用。使用两个步进电机可以控制太阳能光板在水平和垂直方向上的旋转,为太阳能跟踪器提供多个方向的调整。

2.2 设计思路

【1】硬件连接:根据项目需求,将STC89C52主控芯片与PCF8591模块、ULN2003驱动模块、28BYJ-48-5V步进电机、光敏电阻等进行正确的引脚连接。

【2】初始化设置:在主函数开始部分,进行必要的初始化设置,例如设置I/O口方向、定义引脚连接、初始化I2C总线等。

【3】光敏电阻采集:通过PCF8591模块采集4个光敏电阻的数据。使用I2C通信协议,向PCF8591模块发送控制字节,选择光敏电阻通道,并通过ADC转换获取光敏电阻的数值。将采集到的数据存储在名为lightSensor的数组中,每个元素对应一个光敏电阻通道。

【4】确定最强光位置:根据采集到的光敏电阻数据,通过比较找到最强光的位置。遍历lightSensor数组,记录最大值的索引,表示最强光所在的方向。

【5】步进电机控制:根据最强光的位置控制步进电机的旋转,使太阳能光板朝向最大光的方向。根据最大光位置的索引,使用条件语句判断旋转方向,然后调用StepperMotor_Rotate函数控制步进电机旋转。根据需求,可以设置旋转步数和旋转方向,以实现精确的转动控制。

【6】延时等待:在步进电机旋转完成后,可以添加适当的延时,以等待太阳能光板调整到新的位置。可以根据实际情况调整延时时间,确保光板稳定后进行下一次采集和控制。

【7】循环执行:将上述步骤放置在一个无限循环中,以实现持续的太阳能跟踪。程序将不断采集光敏电阻数据、确定最强光位置,并通过步进电机控制太阳能光板旋转,以获得最大的太阳能收集效率。

三、项目代码

3.1 PCF8591采集代码

以下是利用PCF8591的光敏电阻采集并通过串口打印的实现代码。

#include <reg52.h>
#include <intrins.h>// 定义PCF8591模块地址
#define PCF8591_ADDR 0x90// 定义光敏电阻通道
#define LDR_CHANNEL_1 0x00
#define LDR_CHANNEL_2 0x01
#define LDR_CHANNEL_3 0x02
#define LDR_CHANNEL_4 0x03// 定义波特率
#define BAUDRATE 9600// 函数声明
void delay(unsigned int time);
void uartInit();
void uartSendByte(unsigned char dat);
void uartSendString(unsigned char *str);
void pcf8591Init();
unsigned char pcf8591ReadChannel(unsigned char channel);void main() {unsigned char ldr1, ldr2, ldr3, ldr4;unsigned char str[20];uartInit();  // 初始化串口pcf8591Init();  // 初始化PCF8591模块while(1) {// 读取光敏电阻数据ldr1 = pcf8591ReadChannel(LDR_CHANNEL_1);ldr2 = pcf8591ReadChannel(LDR_CHANNEL_2);ldr3 = pcf8591ReadChannel(LDR_CHANNEL_3);ldr4 = pcf8591ReadChannel(LDR_CHANNEL_4);// 打印光敏电阻数据到串口sprintf(str, "LDR1: %d, LDR2: %d, LDR3: %d, LDR4: %d\r\n", ldr1, ldr2, ldr3, ldr4);uartSendString(str);delay(1000);  // 延时一段时间后再进行下一次采集和打印}
}// 延时函数
void delay(unsigned int time) {unsigned int i, j;for(i = 0; i < time; i++) {for(j = 0; j < 125; j++);}
}// 初始化串口
void uartInit() {TMOD = 0x20;  // 设置定时器1为模式2SCON = 0x50;  // 设置串口工作方式1,允许接收TH1 = 256 - _cror(_cror(FOSC/12, 4), 4) / BAUDRATE;  // 设置波特率TR1 = 1;  // 启动定时器1
}// 串口发送单个字节
void uartSendByte(unsigned char dat) {SBUF = dat;while (!TI);  // 等待发送完成TI = 0;       // 清除发送完成标志位
}// 串口发送字符串
void uartSendString(unsigned char *str) {while (*str) {uartSendByte(*str);str++;}
}// 初始化PCF8591模块
void pcf8591Init() {// 发送启动转换命令I2C_Start();                     I2C_Send_Byte(PCF8591_ADDR);     // 发送设备地址I2C_Wait_Ack();I2C_Send_Byte(0x40);             // 发送转换命令,选择通道0I2C_Wait_Ack();I2C_Stop();
}// 读取PCF8591模块的指定通道的数据值
unsigned char pcf8591ReadChannel(unsigned char channel) {unsigned char value;I2C_Start();I2C_Send_Byte(PCF8591_ADDR);      // 发送设备地址I2C_Wait_Ack();I2C_Send_Byte(channel);           // 发送通道号I2C_Wait_Ack();I2C_Start();                      // 重新启动I2C_Send_Byte(PCF8591_ADDR + 1);  // 发送读取命令I2C_Wait_Ack();value = I2C_Read_Byte();           // 读取数据I2C_Send_NAck();I2C_Stop();return value;
}

3.2 主项目框架代码

#include <reg52.h>// 定义PCF8591模块的引脚连接
#define PCF8591_ADDRESS 0x90  // PCF8591模块的I2C地址
#define PCF8591_CONTROL 0x00  // PCF8591模块的控制寄存器地址// 定义步进电机的引脚连接
sbit IN1 = P1^0;  // 步进电机引脚1
sbit IN2 = P1^1;  // 步进电机引脚2
sbit IN3 = P1^2;  // 步进电机引脚3
sbit IN4 = P1^3;  // 步进电机引脚4// 定义步进电机旋转方向
#define CW 0  // 顺时针
#define CCW 1  // 逆时针// 定义光敏电阻通道
#define CHANNEL_0 0  // 光敏电阻通道0
#define CHANNEL_1 1  // 光敏电阻通道1
#define CHANNEL_2 2  // 光敏电阻通道2
#define CHANNEL_3 3  // 光敏电阻通道3// 延时函数
void delay(unsigned int ms) {unsigned int i, j;for (i = ms; i > 0; i--)for (j = 110; j > 0; j--);
}// I2C总线启动
void I2C_Start() {SDA = 1;SCL = 1;delay(1);SDA = 0;delay(1);SCL = 0;delay(1);
}// I2C总线停止
void I2C_Stop() {SDA = 0;SCL = 1;delay(1);SDA = 1;delay(1);
}// I2C发送一个字节的数据
void I2C_SendByte(unsigned char dat) {unsigned char i;for (i = 0; i < 8; i++) {SDA = (dat & 0x80) >> 7;dat <<= 1;delay(1);SCL = 1;delay(1);SCL = 0;delay(1);}SDA = 1;delay(1);SCL = 1;delay(1);while (SDA) continue;SCL = 0;
}// 从PCF8591读取一个字节的数据
unsigned char PCF8591_ReadByte() {unsigned char i, dat = 0;SDA = 1;for (i = 0; i < 8; i++) {dat <<= 1;SCL = 0;delay(1);SCL = 1;delay(1);if (SDA) dat |= 0x01;}SCL = 0;return dat;
}// 设置PCF8591的控制字节
void PCF8591_SetControl(unsigned char ctrl) {I2C_Start();I2C_SendByte(PCF8591_ADDRESS);I2C_SendByte(PCF8591_CONTROL);I2C_SendByte(ctrl);I2C_Stop();
}// 读取光敏电阻的数据
unsigned int ReadLightSensor(unsigned char channel) {unsigned int value;PCF8591_SetControl(0x40 | channel);  // 选择光敏电阻通道delay(10);  // 延时等待转换完成I2C_Start();I2C_SendByte(PCF8591_ADDRESS | 0x01);  // 续上一段value = PCF8591_ReadByte();  // 读取高字节value = (value << 8) + PCF8591_ReadByte();  // 读取低字节I2C_Stop();return value;
}// 控制步进电机旋转
void StepperMotor_Rotate(unsigned char direction, unsigned int steps) {unsigned int i;for (i = 0; i < steps; i++) {// 顺时针旋转if (direction == CW) {IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0;delay(10);IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 0;delay(10);IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0;delay(10);IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 1;delay(10);}// 逆时针旋转else if (direction == CCW) {IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 1;delay(10);IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0;delay(10);IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 0;delay(10);IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0;delay(10);}}
}// 主函数
void main() {unsigned int lightSensor[4];unsigned char maxIndex;while (1) {// 采集光敏电阻数据lightSensor[0] = ReadLightSensor(CHANNEL_0);lightSensor[1] = ReadLightSensor(CHANNEL_1);lightSensor[2] = ReadLightSensor(CHANNEL_2);lightSensor[3] = ReadLightSensor(CHANNEL_3);// 确定最强光位置maxIndex = 0;if (lightSensor[1] > lightSensor[maxIndex]) maxIndex = 1;if (lightSensor[2] > lightSensor[maxIndex]) maxIndex = 2;if (lightSensor[3] > lightSensor[maxIndex]) maxIndex = 3;// 控制步进电机旋转if (maxIndex == 0) {StepperMotor_Rotate(CW, 100);  // 右转} else if (maxIndex == 1) {StepperMotor_Rotate(CCW, 100);  // 左转} else if (maxIndex == 2) {StepperMotor_Rotate(CW, 100);  // 右转StepperMotor_Rotate(CW, 100);  // 右转} else if (maxIndex == 3) {StepperMotor_Rotate(CCW, 100);  // 左转StepperMotor_Rotate(CCW, 100);  // 左转}delay(1000);  // 延时一段时间}
}

相关文章:

基于单片机设计的太阳能跟踪器

一、前言 随着对可再生能源的需求不断增长&#xff0c;太阳能作为一种清洁、可持续的能源形式&#xff0c;受到越来越多的关注和应用。太阳能光板通常固定在一个固定的角度上&#xff0c;这限制了它们对太阳光的接收效率。为了充分利用太阳能资源&#xff0c;提高太阳能光板的…...

【踩坑及思考】浏览器存储 cookie 最大值超过 4kb,或 http 头 cookie 超过限制值

背景 本地生产环境&#xff1a;超过最大值 cookie token 不存储&#xff1b;客户生产环境&#xff1a;打开系统空白&#xff0c;且控制台报 http 400 错误&#xff1b; 出现了两种现象 现象一&#xff1a;浏览器对大于 4kb 的 cookie 值不存储 导致用户名密码登录&#xff…...

竞赛选题 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…...

SpringCloud Gateway实现请求解密和响应加密

文章目录 前言正文一、项目简介二、核心代码2.1 自定义过滤器2.2 网关配置2.3 自定义配置类2.4 加密组件接口2.5 加密组件实现&#xff0c;AES算法2.6 启动类&#xff0c;校验支持的算法配置 三、请求报文示例四、测试结果4.1 网关项目启动时4.2 发生请求时 前言 本文环境使用比…...

IDEA创建Springboot多模块项目

一、创建父模块 File --> New --> Project &#xff0c;选择 “ Spring Initalizr ” &#xff0c;点击 Next Next Next --> Finish 二、创建子模块 右键根目录&#xff0c;New --> Module 选择 “ Spring Initializr ”&#xff0c;点击Next 此处注意T…...

React:JSX语法入门

JSX语法入门及代码 JSX是一种JavaScript的语法扩展&#xff0c;用于在React中描述用户界面的结构。它允许开发者使用类似HTML的语法来创建React元素&#xff0c;使得代码更具可读性和可维护性。JSX将HTML标签和JavaScript代码结合在一起&#xff0c;可以在其中使用JavaScript表…...

AI大模型架构师专家,你会问什么来测试我的水平,如何解答上述问题,学习路径是什么

0. 沈剑老师的大模型产品应用经验&#xff1a; 提示词三步骤&#xff1a; 假如我是xxx专家&#xff0c;你会问什么来测试我的水平&#xff1b;假如你是xxx专家&#xff0c;你会如何解答上述问题&#xff1b;假如你是xxx专家&#xff0c;上述问题的学习路径是什么&#xff1b;…...

Dev-C调试的基本方法2-1

在Dev-C中调试程序&#xff0c;首先需要在程序中设置断点&#xff0c;之后以调试的方式运行程序。 1 设置断点 当以调试的方式运行程序时&#xff0c;程序会在断点处停下来。点击要设置断点代码行号左侧部分&#xff0c;此时会有如图1所示的红点和绿色对勾&#xff0c;表示断…...

Linux 调试 (objdump/strace/strings)

目录 1. Linux 调试 (objdump/strace/strings)1.1. 查看系统 glibc 版本号1.2. 查看 so/bin 中的依赖1.3. 调试 bin 报错原因1.4. 查看 so/bin 中字符串 1. Linux 调试 (objdump/strace/strings) 1.1. 查看系统 glibc 版本号 1. 第一种 # ldd --version ldd (Ubuntu GLIBC 2.…...

CAS 单点登录详解

什么是CAS&#xff1f; - 简要介绍CAS&#xff08;Central Authentication Service&#xff09;的概念和作用。 - 强调CAS的主要目标是提供单点登录和单点登出功能。 CAS的工作原理 - 深入探讨CAS的工作原理&#xff0c;包括认证、票据、验证等核心概念。 - 详细解释CAS服务器和…...

tbh常用的绘图快捷键

1、Altb -> 笔刷 2、Alt/ -> 画笔 3、按住Shift 绘出的线条是直线 4、按住shiftalt 绘出来的线条是水平线或垂直线 5、alte ->橡皮擦 6、alts ->选择工具 7、altq -> 轮廓编辑器 以下操作都是在选中轮廓编辑器下操作的&#xff1a; 按住alt…...

Android-Framework 清除应用用户数据,不清除权限

一、环境 高通865 Android 10 二、具体详情 现象&#xff1a;默认赋予第三方应用的权限&#xff0c;在应用信息中清理用户数据的时候&#xff0c;权限也会被清理掉; 希望&#xff1a;只清理数据&#xff0c;保留权限 相关源码修改如下&#xff1a; frameworks/base/servi…...

CS认证办理流程,CS认证好处

CS资质全名叫“信息系统建设和服务能力评估体系” 所谓的CS认证&#xff0c;是指信息系统建设和服务能力评级。认证一共划分为五个等级&#xff0c;等级从低到高分别用CS1级&#xff08;初始级&#xff09;、CS2级&#xff08;基本级&#xff09;、CS3级&#xff08;良好级&…...

macOS 安装brew

参考链接&#xff1a; https://mirrors4.tuna.tsinghua.edu.cn/help/homebrew/ https://www.yii666.com/blog/429332.html 安装中科大源的&#xff1a; https://zhuanlan.zhihu.com/p/470873649...

H5: 使用Web Audio API播放音乐

简介 记录关于自己使用 Web Audio API 的 AudioContext 播放音乐的知识点。 需求分析 1.列表展示音乐&#xff1b; 2.上/下一首、播放/暂停/续播&#xff1b; 3.播放模式切换&#xff1a;循环播放、单曲循环、随机播放&#xff1b; 4.播放状态显示&#xff1a;当前播放的音乐…...

Parasoft C/C++test:汽车网络安全ISO 21434最佳实践

为什么汽车网络安全很重要Why Automotive Cybersecurity Is Important 许多汽车公司向电子道路车辆的转变从根本上改变了整个行业&#xff0c;提高了汽车的互联性和智能性。随着电子汽车变得更加互联和智能&#xff0c;它们也越来越依赖软件来实现车辆操作&#xff0c;驱动更多…...

如何卸载干净 IDEA(图文讲解)windows和Mac教程

大家好&#xff0c;我是sun~ 很多小伙伴会问 Windows / Mac 系统上要怎么彻底卸载 IDEA 呢&#xff1f; 本文通过图片文字&#xff0c;详细讲解具体步骤&#xff1a; 如何卸载干净 IDEA&#xff08;图文讲解&#xff09; Windows1、卸载 IDEA 程序2、注册表清理3、残留清理 M…...

Docker搭建Gitlab

拉取镜像&#xff1a;docker pull gitlab/gitlab-ce创建映射目录&#xff1a; mkdir -p /usr/local/gitlab/config mkdir -p /usr/local/gitlab/data mkdir -p /usr/local/gitlab/logs运行容器&#xff1a; docker run -d -p 443:443 -p 8000:8000 -p 222:22 --name gitlab …...

STM32F4X SDIO(四) SDIO控制器

STM32F4X SDIO&#xff08;四&#xff09; SDIO控制器 STM32F4X SDIO控制器SDIO控制器框图SDIO控制器时钟适配器寄存器FIFO控制单元命令路径数据路径 SDIO寄存器SDIO控制相关寄存器SDIO电源控制寄存器 (SDIO_POWER)SDIO时钟控制寄存器 (SDIO_CLKCR)SDIO_CK相位 SDIO命令响应相关…...

【flink】Task 故障恢复详解以及各重启策略适用场景说明

文章目录 一. 重启策略种类&#xff08;Restart Strategies&#xff09;1. Fixed Delay Restart Strategy2. Failure Rate Restart Strategy3. Fallback Restart Strategy4. No Restart Strategy 二. 故障恢复策略&#xff08;Failover Strategies&#xff09;1. &#xff08;全…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...