本帖最后由 hejiahui123 于 2020-11-4 14:37 编辑
项目方案:用DHT11测环境温度湿度,用OLED显示当前的温湿度,led灯根据环境的温度高低自动调节灯的亮度。灯随着温度的升高而变亮,随着温度的降低变暗。实现步骤:1、查找资料,搭建环境
2、硬件接线
3、传感器收集数据
4、实现灯的亮度随温度的变化而变化
搭建环境:第一次使用microchip的芯片,首先要去官网下载开发环境MPLAB X IDE,不过在安装MPLAB X IDE前需要装Java的运行环境,最后还要安装C编译器,因为我的程序是用C语言。
官网网址:https://www.microchip.com/microchip
硬件接线:接线方式如下,因核心板的电源引脚不够,外设是接在外部5V电源上的。
传感器收集数据:我遇到最大的问题是DHT11读不出数据,我用示波器测DHT11的时序发现不对,最后看手册,根据示波器测出的时序和手册上的相对比,把时序调好,最后就能读出数据了。 DHT11时序如下图: [color=rgba(0, 0, 0, 0.75)]先是主机发送开始信号 [color=rgba(0, 0, 0, 0.75)]然后就是DHT11响应 [color=rgba(0, 0, 0, 0.75)]DHT11发送数据 [color=rgba(0, 0, 0, 0.75)]最后要把数据线拉高,释放总线
DHT11读取数据代码如下: //读取一个字节
uint8_t DHT11_Read_Byte(void)
{
uint8_t i,data;
for(i=0;i<8;i++)
{
if(DHT11_READ==0)
{
while(DHT11_READ==0);
}
DELAY_us (40); //40us
if(DHT11_READ==1)
{
while(DHT11_READ==1);//这里要等待高电平结束,否者读取下一位的时候会因为高电平没有结束而跳过上一个if
data|=(uint8_t)0x01<<(7-i);
}
else
data&=(uint8_t)~0x01<<(7-i);
}
return data;
}
//读五个字节
uint8_t DHT11_ReadData(uint8_t *temp,uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
for(i=0;i<5;i++)
{
buf[i]=DHT11_Read_Byte();
}
if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4])
{
*temp=buf[2];
*humi=buf[0];
return 1;
}
else
return 0;
}
最后根据温度,去调节输出的pwm,使灯的亮度随着温度的变化而变化
以下是成品照片: 总结:经过这次项目,发现自己的基础不是很牢固,应该多实践。
|