视频在B站,链接如下,大家有喜欢的可以去看看,现在开放源代码。STM32F103ZET6芯片。
视频地址:https://www.bilibili.com/video/av68476662
视频地址:https://www.bilibili.com/video/av66018630
这个是校光伏大赛比赛的一个作品
旨在万物互联,万物联网。
加入电压采集功能,实时传给电脑端的LORA
加入角度测量模块
单片机源程序如下:
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "timer4.h"
- #include "adc.h"
- #include "oled.h"
- #include "lora_app.h"
- #include "lora_ui.h"
- #include "usart3.h"
- #include "string.h"
- #include "stdio.h"
- #include "timer.h"
- #include "rtc.h"
- //d12 d13 d14 d15
- #define N 200
- #define M 50
- #define deat_speed 50
- #define pwm_min 1749
- #define pwm_mid 1849
- #define pwm_max 1949
- #define pwm_sum 3698
- u16 x = 0,y = 0,z = 0;
- u16 ADC = 0;
- u8 t=0;
- float vote = 0.0;
- u16 up_a,up_b;
- u16 down_a,down_b;
- u8 i,j,min_up=0,min_down=0,min_UP=0;
- u16 up_date[N];
- u16 down_date[M];
- void delay_min(u8 n,u8 sent_up,u8 sent_down);
- void time_display(void);
- int main(void)
- {
- uart_init(115200);
- delay_init();
- OLED_Init();
- RTC_Init(); //RTC初始化
- TIM4_PWM_Init(1999,719);//50khz
- Adc_Init();
- LoRa_Init();
- LoRa_Set();//LoRa配置(进入配置需设置串口波特率为115200)
- while(1)
- {
- //1号归位
- //2号固定45度
- TIM_SetCompare1(TIM4,pwm_min);
- TIM_SetCompare2(TIM4,1810);
- delay_ms(200);
- //1号开始检测
- up_b = 0;
- up_a = 0;
- for(; up_a < N; up_a += 2) //200脉冲单位,检测100次
- {
- TIM_SetCompare1(TIM4,pwm_min + up_a);//舵机转180度
- delay_ms(deat_speed);
- up_date[up_b] = (Get_Adc_Average(ADC_Channel_0,1));
- up_b ++;
- }
- //1号归位
- //2号固定135度
- TIM_SetCompare1(TIM4,pwm_max);
- TIM_SetCompare2(TIM4,1890);
- delay_ms(500);
- //1号开始检测
- up_b = 100;
- up_a = N;
- for(; up_a > 0; up_a -= 2) //200脉冲单位,检测100次
- {
- TIM_SetCompare1(TIM4,pwm_min + up_a);//舵机转180度
- delay_ms(deat_speed);
- up_date[up_b] = (Get_Adc_Average(ADC_Channel_0,1));
- up_b ++;
- }
- //找最大值
- for(j = 1; j < N - 1; j ++)
- {
- if(up_date[j + 1] < up_date[min_UP])
- {
- min_UP = j + 1;
- }
- else
- {
- j +=1;
- }
- }
- //判断min_up在哪边
- if(min_UP < 100)
- {
- min_up = min_UP;
- TIM_SetCompare1(TIM4,min_up * 2 + pwm_min);
- TIM_SetCompare2(TIM4,pwm_mid);
- delay_ms(500);
- //2号舵机上下
- down_b = 0;
- down_a = 100;
- for(; down_a > 0; down_a -=2)
- {
- TIM_SetCompare2(TIM4,pwm_min + down_a);
- delay_ms(deat_speed);
- down_date[down_b] = (Get_Adc_Average(ADC_Channel_0,1));
- down_b ++;
- }
- //找最大值
- for(i = 1; i < M - 1; i ++)
- {
- if(down_date[i + 1] < down_date[min_down])
- {
- min_down = i + 1;
- }
- else
- {
- i +=1;
- }
- }
- //算出最大值所在的平面坐标
- TIM_SetCompare2(TIM4,min_down * (-2) + pwm_mid);
- }
- else
- {
- min_up = N - min_UP;
- //算出最大值所在的平面坐标
- TIM_SetCompare1(TIM4,min_up * 2 + pwm_min);
- TIM_SetCompare2(TIM4,pwm_mid);
- delay_ms(500);
- //2号舵机上下
- down_b = 0;
- down_a = 100;
- for(; down_a > 0; down_a -=2)
- {
- TIM_SetCompare2(TIM4,pwm_max - down_a);
- delay_ms(deat_speed);
- down_date[down_b] = (Get_Adc_Average(ADC_Channel_0,1));
- down_b ++;
- }
- //找最大值
- for(i = 1; i < M - 1; i ++)
- {
- if(down_date[i + 1] < down_date[min_down])
- {
- min_down = i + 1;
- }
- else
- {
- i +=1;
- }
- }
- //算出最大值所在的平面坐标
- TIM_SetCompare2(TIM4,min_down * 2 + pwm_mid);
- }
- OLED_16x16CN(0,0,up_date[min_UP] / 1000);
- OLED_16x16CN(9,0,up_date[min_UP] / 100 % 10);
- OLED_16x16CN(18,0,up_date[min_UP] / 10 % 10);
- OLED_16x16CN(27,0,up_date[min_UP] % 10);
- OLED_16x16CN(0,2,down_date[min_down] / 1000);
- OLED_16x16CN(9,2,down_date[min_down] / 100 % 10);
- OLED_16x16CN(18,2,down_date[min_down] / 10 % 10);
- OLED_16x16CN(27,2,down_date[min_down] % 10);
- OLED_16x16CN(0,4,min_UP / 100);
- OLED_16x16CN(9,4,min_UP / 10 % 10);
- OLED_16x16CN(18,4,min_UP % 10);
- OLED_16x16CN(32,4,min_down / 10);
- OLED_16x16CN(40,4,min_down % 10);
- //发送数据
- if(!LORA_AUX)//若空闲
- {
- LoRa_SendData(min_UP,min_down);//发送数据
- }
- time_display(); //调试部分
- // while(1)
- // {
- // int hhh;
- // hhh ++;
- // }
- delay_min(15,min_UP,min_down);
- }
- }
- void delay_min(u8 n,u8 sent_up,u8 sent_down)
- {
- for(y = 0; y < n; y ++)
- {
- for(x = 0; x < 30; x ++)
- {
- delay_ms(500);
- delay_ms(500);
- delay_ms(500);
- delay_ms(500);
- //调试
- //采集光伏板电压
- ADC = (int)((Get_Adc_Average(ADC_Channel_1,1)));//A1
- //转换为电压
- vote = 2 * ADC / 1262.0;
- // printf("LIGHT = %f /ADC\r\n",vote);
- if(!LORA_AUX)//若空闲
- {
- LoRa_SendData(sent_up,sent_down);//发送数据
- LoRa_SendData_v(vote * 10);
- }
- }
- }
- }
- void time_display(void)
- {
- if(t!=calendar.sec)
- {
- t=calendar.sec;
- // 年
- OLED_16x16CN(0,6,calendar.w_year / 10 % 10);
- OLED_16x16CN(8,6,calendar.w_year % 10);
- OLED_16x16CN(16,6,11);
- // 月
- OLED_16x16CN(24,6,calendar.w_month / 10 % 10);
- OLED_16x16CN(32,6,calendar.w_month % 10);
- OLED_16x16CN(40,6,11);
- // 日
- OLED_16x16CN(48,6,calendar.w_date / 10 %10);
- OLED_16x16CN(56,6,calendar.w_date % 10);
- OLED_16x16CN(64,6,11);
- switch(calendar.week)
- {
- case 0:
- OLED_16x16CN(72,6,7);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
9-21.7z
(1.36 MB, 下载次数: 135)
|