系统功能设计
本系统由STM32F103C8T6单片机核心板、太阳能电池板、锂电池充放电保护、升压、WIFI模块、高亮LED灯、光照检测组成。
1、通过太阳能给锂电池充电,具有充电保护。锂电池通过升压升压到5V给整个单片机系统供电;
2、上电默认自动状态,通过光敏电阻检测光照,进而控制灯的亮度,天越黑,灯越亮;分0-4档。
3、可以通过手机APP,通过蓝牙控制灯的亮灭,点击“关闭”将关闭Led;点击“打开”将根据光照情况控制led灯即步骤2的作用。
4、单片机检测太阳能电池板的电压,并将太阳能是否在给电池充电状态发送给手机,手机APP相应状态显示。
太阳能发电路设计
太阳能电池板(Solar panel)是通过吸收太阳光,将太阳辐射能通过光电效应或者光化学效应直接或间接转换成电能的装置,大部分太阳能电池板的主要材料为“硅”,但因制作成本较大,以至于它普遍地使用还有一定的局限。
其电路接口原理图如下图所示。一般在太阳能电池板接口串接一个二极管1N5819,单向导电作用,保护太阳能电池板。
功能底板:
STM32F103C8T6单片机核心板:
USB供电接口,复位按键 开关按键
合理优秀的布局布线:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "adc.h"
#include "key.h"
char dis0[16]; //1602显示第一行
char dis1[16];
unsigned int adcx;//读取ad转换值
unsigned int ligh ; //光照
unsigned char pwmled = 0;//led pwm
unsigned char i ;
unsigned char wifiSendCount =0;//wifi 发送数据 延时
unsigned char WifiCtrFlag = 1; //wifi控制标志
float SunVolt=0.0; //检测电流
int main(void)
{
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
TIM3_Int_Init(9,7199);
LED_Init(); //初始化与LED连接的硬件接口
// KEY_Init();
Adc_Init(); //ADC初始化
delay_ms(100);
i=50;
while(i--) delay_ms(100);//延时
printf("AT+CIPMUX=1\r\n"); //允许链接
i=5;
while(i--) delay_ms(100);//延时
printf("AT+CIPSERVR=1,8080\r\n"); //创建端口号8080//**All notes can be deleted and modified**//
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_1,5);//读取ad转换值 5次求平均
ligh =(float)adcx*99/4096; //转化
adcx=Get_Adc_Average(ADC_Channel_0,5);//读取ad转换值 5次求平均
SunVolt =(float)adcx*3.3*3/4096; //电阻进行分压所有*3
if(WifiCtrFlag == 1)
{
if(ligh < 40) //电压对比确定亮灭程度//调整pwm
{pwmled = 1;}
else if(ligh < 50)
{pwmled = 2;}
else if(ligh < 60)
{pwmled = 3;}
else if(ligh < 70)
{pwmled = 4;}
else
{pwmled = 5;}
}
else
{
pwmled = 1 ; //关闭led
}
wifiSendCount++;//wifi 数据发送延时计数
if(wifiSendCount >= 3)//定时发送数据到时
{
wifiSendCount = 0;//清空
UART_SendStr(USART1 , "AT+CIPSEND=0,6\r\n",16); //发数据 at命令
delay_ms(200);
if(SunVolt>=3.9)//太阳能在充电状态 采用1n5819充电电流大 电压拉低 达到4.0表示在充电
{
sprintf(dis0,"*BYD%c#",((pwmled%10)-1)+0x30);//打印电压及档位
}
else
{
sprintf(dis0,"*BND%c#",((pwmled%10)-1)+0x30);//打印电压及档位
}
UART_SendStr(USART1 , dis0 , 6);//发送
UART_SendStr(USART1 , "\r\n" , 2);//发送
}
delay_ms(100);//控制在中断中处理
}
}
void dealFun(void)
{
static unsigned char countFan =0;
countFan++;
if(countFan<pwmled) //led1 占空比调节
{
led_ligh=0; //打开
}
else if(countFan<=5) //关闭时间段
{
led_ligh=1; //关闭
if(countFan == 5) countFan=0; //一个周期结束
}
}