一、实验内容
1、过程考核60分:
(1)顺序点亮3个LED灯(分数:10分);
(2)按键顺序点亮3个LED灯(分数:10分);
(3)读取18B20温度并通过串口显示(分数:10分);
(4)写入姓名(拼音)+学号到EEPROM,并在启动时送到串口显示(分数:10分);
(5)通过WIFI或GPRS上传温度到云端(分数:10分);
(6)通过云端服务器发指令,顺序点亮3个LED灯(分数:10分);
(7)其他加分项(分数:20分);
二、实验设备
1、硬件平台:
(1)开发板:
STM32F4开发板,包含以下资源,STM32F4处理器(ARM Cortex-M4),GPIO口、3个LED灯、1个按键、温度传感器18B20、EEPROM、RJ45以太网、WIFI模组、GPRS/GPS模组、LoRa模组等。
(2)ST-LINK下载器;
(3)USB转TTL模块;
2、软件平台:
(1)Keil5 开发环境,安装stm32f4支持包;
(2)ST-LINK驱动、USB转TTL驱动;
(3)网关示例软件;
(4)stm32f4示例程序;
(5)网络助手;
(6)云端服务器;
(7)以打包的方式分发;
三、主要实验内容及步骤
1、连接Stm32f4主板:
1)st-link,下载器:4线(5V, 3. 3V, GND, sWM, 按顺序从3. 3V开始,只要四根),1-3.3V-1; 2-gnd-4; 3-swdio-7;4-swclk-9;另一 边3.3V。
2) USB转TTL; 1-3.3V-3.3V; 2-TXD-RX; 3-RXD-TX; 4-GND-GND (对应板子上,3针,红色)。
2、顺序点亮3个LED灯(分数:10分);
代码:
1.void Light_Three_Led(void){
2. uint8_t i;
3. for(i=0; i<3; i++){
4. GPIO_ResetBits(GPIOD, GPIO_Pin_1 );
5. Delay_MS(1000);
6. GPIO_SetBits(GPIOD, GPIO_Pin_1 );
7.
8. GPIO_ResetBits(GPIOD, GPIO_Pin_2 );
9. Delay_MS(1000);
10. GPIO_SetBits(GPIOD, GPIO_Pin_2 );
11.
12. GPIO_ResetBits(GPIOD, GPIO_Pin_3 );
13. Delay_MS(1000);
14. GPIO_SetBits(GPIOD, GPIO_Pin_3 );
15. }
16.
17.}
3、按键顺序点亮3个LED灯(分数:10分);
代码:
1.void EXTI9_5_IRQHandler(void)
2.{
3. Delay_MS(20);
4. if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_8) == 0)
5. {
6. while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_8))
7. printf("This is press key operating.\r\n") ;
8. Delay_MS(1);
9. Light_Three_Led( );
10.
11.
12. }
13.
14. EXTI_ClearITPendingBit(EXTI_Line8);
15.}
效果图:
4、读取18B20温度并通过串口显示(分数:10分);
温度传感器硬件原理图
代码:
1.temperature = ds18b20_get_temperature();
2. SEND_TEM=(float)temperature/10;
3. printf("temp:%.2f℃",SEND_TEM);
效果图:
5、写入姓名(拼音)+学号到EEPROM,并在启动时送到串口显示(分数:10分);
代码:
1.void Write(void){
2. uint16_t i;
3. uint8_t write[13]={'2','0','2','0','4','0','4','1','4','9','M','H','D'};
4. uint8_t read[13]={0};
5. I2C_Write(I2C3,ADDR_EEPROM_24C64,0x0,write,100);
6. Delay_MS(10);
7. I2C_Read(I2C3,ADDR_EEPROM_24C64,0x0,read,100);
8. for(i=0;i<13;i++){
9. printf("%c ",read[i]);
10. }
11.}
效果图:
6、通过WIFI或GPRS上传温度到云端(分数:10分);
1.while(esp8266_send_cmd("AT+CWJAP=\"i\",\"12345678\"","WIFI GOT IP",200))
2.// while(esp8266_send_cmd("AT+CWJAP=\"jsu-c512\",\"12345678\"","WIFI GOT IP",200))
3. {
4. printf("WIFI GOT IP_ERR\r\n");
5. }
6.
7. //=0:单路连接模式 =1:多路连接模式
8. while(esp8266_send_cmd("AT+CIPMUX=0","OK",30))
9. {
10. printf("AT+CIPMUX_ERR\r\n");
11. }
12.
13. //建立TCP连接 这四项分别代表了 要连接的ID号0~4 连接类型 远程服务器IP地址 远程服务器端口号
14. while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"172.20.10.6\",8088","CONNECT",200))
15. {
16. printf("AT+CIPSTART_ERR\r\n");
17. }
WIFI接入步骤:
- PIO配置。
2.发A指令到ESP8266。
3、发应用层数据。
代码:
1.while(esp8266_send_cmd("AT+CWJAP=\"i\",\"12345678\"","WIFI GOT IP",200))
2./ while(esp8266_send_cmd("AT+CWJAP=\"jsu-c512\",\"12345678\"","WIFI GOT IP",200))
3.{
4. printf("WIFI GOT IP_ERR\r\n");
5.}
6.
7.//=0:单路连接模式 =1:多路连接模式
8.while(esp8266_send_cmd("AT+CIPMUX=0","OK",30))
9.{
10. printf("AT+CIPMUX_ERR\r\n");
11.}
12.
13.//建立TCP连接 这四项分别代表了 要连接的ID号0~4 连接类型 远程服务器IP地址 远程服务器端口号
14.while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"172.20.10.6\",8088","CONNECT",200))
15.{
16. printf("AT+CIPSTART_ERR\r\n");
17.}
7、通过云端服务器发指令,顺序点亮3个LED灯(分数:10分)
代码:
1.if(TIM_GetITStatus(TIM5, TIM_IT_Update) == SET)
2. {
3. if(light_ctrl[0])LIGHT1_ON;
4. else LIGHT1_OFF;
5. if(light_ctrl[1])LIGHT2_ON;
6. else LIGHT2_OFF;
7. if(light_ctrl[2])LIGHT3_ON;
8. else LIGHT3_OFF;
9. for(i=0;i<3;i++)sum_li+=light_ctrl[i];
10. KEY_Scan(0);
11. if(fflag==0){
12. for(i=0;i<3;i++)light_ctrl[i]=0;
13. }
14. else if
15. (
16. fflag>0&&fflag<=3)
17. {
18. for(i=0;i<3;i++)
19. light_ctrl[i]=0;
20. light_ctrl[fflag-1]=1;
21. }
22. else
23. {if(fflag%3!=0){for(i=0;i<3;i++)light_ctrl[i]=0;for(i=0;i<fflag%3;i++)light_ctrl[i]=1;}
24. else{for(i=0;i<3;i++)light_ctrl[i]=1;}}
25. }
1.void Wifi_data(char *Wifi_data){
2. char sp[20];
3. char* Point=NULL;
4. if(strstr((const char *)Wifi_data, (const char *)"on")!=NULL)//接收到设置阈值命令
5. {
6. Point = strstr((const char *)Wifi_data, (const char *)"on")+2;
7. memcpy(sp, Point, 2);
8. fflag=atoi(sp);
9.
10. }
11.
12.}
指导老师签字