赞
踩
STM32F103C8T6最小核心板,也就是哔哩哔哩up主江协科技用的那一款
DHT11温湿度传感器三针脚版本
0.96寸OLED四针脚版本
STM32F103C8T6:最小核心板有很多拆机片,买来之后建议先用mico usb进行供电,然后用万用表测试一下5v 和3.3v输出,博主在第一次实验时OLED和DHT11经常出现乱码,甚至闪烁,后来才发现是单片机3.3v输出仅仅是2.2v,甚至继电器都没办法正常吸合了,百度查下居然是单片机的问题,这一点我是真的无语了,立马找商家退货了。
0.96寸OLED:这个也是有很多不同的版本的一定注意正负极,而且在.c的代码修改上一定要看看GPIO的参数,代码上总共有四个地方需要改,才能成功修改单片机和显示屏的连线。
有一些代码被注释掉了,大家看注释应该能看懂的,
- #include "sys.h"
- #include "delay.h"
- #include "led.h"
- #include "jdq.h"
- #include "stm32f10x.h" // Device header
- #include "oled.h"
- #include "OLED.h"
- #include "DHT11.h"
- #include "key.h"
- /*
- 工作日志
- ======================================、
- 目前这个版本OLED可以正常显示,继电器也可以正常工作,修改代码之前一定不要修改其他的数据
- DHT11
-
- // OLED_ShowNum(1,1,2,1); //显示屏测试
- // JDQ1_on();
- // LED1_ON();
- // Delay_ms(2000);
- // JDQ2_off();
- // LED1_OFF();
- // Delay_ms(2000);
-
- // OLED_ShowString(1, 8, ".");
- // OLED_ShowNum(1, 9, DHT11_Data.temp_deci, 1);
-
- // OLED_ShowString(2, 12, ".");
- // OLED_ShowNum(2, 13, DHT11_Data.humi_deci, 2);
-
-
- 四个按键分别连接在P9 -8 -7 6 -5 分别对应四个按键
- key1-PB8
- key2-PB7
- key3-PB6
- key4-PB5
- 目前PB9也是空闲的
- LED连接的PB9
- */
-
- int main(void)
- {
- //延时函数初始化
- LED_Init(); //初始化与LED连接的硬件接口
- JDQ_init();
- OLED_Init();
- Key_Init();
-
- OLED_Init(); //显示器初始化
- DHT11_GPIO_Config(); //传感器gpioa
- OLED_ShowChinese(1,1,"温度"); //第七个是空空白
- OLED_ShowChinese(2,1,"湿度");
- // OLED_ShowString(1,7,"℃");
- // OLED_ShowString(2,7,"%");符号没法正常显示
-
- OLED_ShowString(1,9,"|");
- OLED_ShowString(2,9,"|");
- OLED_ShowString(1,7,".");
- OLED_ShowString(2,7,".");
-
-
-
-
- while(1)
- {
- OLED_ShowNum(1, 5, DHT11_Data.temp_int, 2); //温度
- OLED_ShowNum(1, 8, DHT11_Data.temp_deci, 1); //目前并不需要温度的小数部分,第六个是一个小数点
- OLED_ShowNum(1, 12, temphingt, 2); //温度阈值
- OLED_ShowNum(2, 12, humihingt, 2); // 湿度阈值
- OLED_ShowNum(2, 5, DHT11_Data.humi_int, 2); // 湿度
- OLED_ShowNum(2, 8, DHT11_Data.humi_deci, 1);
- Delay_ms(100);
-
-
-
- }
- }
在这个库函数中修改端口需要在.h中改
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
- #include "DHT11.h"
-
- //#define DHT11_Out_Pin GPIO_Pin_8
- //#define DHT11_Out_RCC RCC_APB2Periph_GPIOA
- //#define DHT11 GPIOA
-
- void DHT11_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(DHT11_Out_RCC, ENABLE);
- GPIO_InitStructure.GPIO_Pin = DHT11_Out_Pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(DHT11, &GPIO_InitStructure);
-
- GPIO_SetBits(DHT11, DHT11_Out_Pin);
- }
-
- static void DHT11_Mode_IPU(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = DHT11_Out_Pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
- GPIO_Init(DHT11, &GPIO_InitStructure);
- }
-
- static void DHT11_Mode_Out_PP(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- GPIO_InitStructure.GPIO_Pin = DHT11_Out_Pin;
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-
- GPIO_Init(DHT11, &GPIO_InitStructure);
- }
-
- static uint8_t Read_Byte(void)
- {
- uint8_t i, temp=0;
-
- for (i=0; i<8; i++)
- {
- while (DHT11_DATA_IN() == Bit_RESET);
-
- Delay_us(40);
-
- if (DHT11_DATA_IN() == Bit_SET)
- {
- while(DHT11_DATA_IN() == Bit_SET);
-
- temp |= (uint8_t)(0x01 << (7 - i));
- }
- else
- {
- temp &= (uint8_t) ~ (0x01<<(7-i));
- }
- }
- return temp;
- }
-
- uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
- {
- DHT11_Mode_Out_PP();
- DHT11_DATA_OUT(LOW);
- Delay_ms(18);
-
- DHT11_DATA_OUT(HIGH);
-
- Delay_us(30);
-
- DHT11_Mode_IPU();
-
- if(DHT11_DATA_IN() == Bit_RESET)
- {
- while(DHT11_DATA_IN() == Bit_RESET);
-
- while(DHT11_DATA_IN() == Bit_SET);
-
- DHT11_Data -> humi_int = Read_Byte();
-
- DHT11_Data -> humi_deci = Read_Byte();
-
- DHT11_Data -> temp_int = Read_Byte();
-
- DHT11_Data -> temp_deci = Read_Byte();
-
- DHT11_Data -> check_sum= Read_Byte();
-
-
- DHT11_Mode_Out_PP();
- DHT11_DATA_OUT(HIGH);
-
- if (DHT11_Data -> check_sum == DHT11_Data -> humi_int + DHT11_Data -> humi_deci + DHT11_Data -> temp_int + DHT11_Data -> temp_deci)
- return SUCCESS;
- else
- return ERROR;
- }
- else
- {
- return ERROR;
- }
- }
可能对于初学者这个.h文件修改DHT11和核心板的连接口比较困难,不过没关系,大家可以直接复制这个代码发给CHAT -GPT
要将代码中的引脚修改为PA9,您需要进行以下更改:
DHT11_Out_Pin
宏定义更改为GPIO_Pin_9
,即将GPIO引脚更改为PA9。DHT11_Out_RCC
宏定义更改为RCC_APB2Periph_GPIOA
,确保正确设置GPIOA外设时钟使能。DHT11
宏定义更改为GPIOA
,以便与所选的GPIO端口一致。完成这些更改后,重新编译和上传代码,以确保代码正确使用了新的引脚PA9。请注意,在修改硬件连接之前,仔细检查电路图和硬件规格,确保将传感器正确连接到所需的GPIO引脚。
- #ifndef _DHT11_H
- #define __DHT11_H
-
- #define DHT11_Out_Pin GPIO_Pin_8 //改这个数和下面这个GPIOA即可,两个都得改,可以测试测试
- #define DHT11_Out_RCC RCC_APB2Periph_GPIOA
- #define DHT11 GPIOA
-
- #define HIGH 1
- #define LOW 0
-
- #define DHT11_DATA_OUT(a) if (a) \
- GPIO_SetBits(DHT11, DHT11_Out_Pin);\
- else \
- GPIO_ResetBits(DHT11, DHT11_Out_Pin)
-
- #define DHT11_DATA_IN() GPIO_ReadInputDataBit(DHT11, DHT11_Out_Pin)
-
- typedef struct
- {
- uint8_t humi_int; //湿度的整数部分
- uint8_t humi_deci; //湿度的小数部分
- uint8_t temp_int; //温度的整数部分
- uint8_t temp_deci; //温度的小数部分
- uint8_t check_sum; //校验和
-
- }DHT11_Data_TypeDef;
-
- void DHT11_GPIO_Config(void);
- static void DHT11_Mode_IPU(void);
- static void DHT11_Mode_Out_PP(void);
- uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data);
- static uint8_t Read_Byte(void);
-
- #endif
后续的OLED显示函数我就不放了,大家可以直接在我分享的连接里面去下载。就是用的江科大的,汉字的取模我后续还会再发一下,大家也可以去别人博主那里找找看看。
鸣谢:OLED显示屏库函数的提供者江协科技(原名:江科大自动化协)我目前的课程也都是从他那里学习的,DHT11库函数也是从网络上找的,感谢,希望我今天分享的资源对大家有所帮助。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。