论坛» 嵌入式开发» MCU

stm32空气监测系统

助工
2016-10-09 12:05 1楼
专家
2016-10-09 15:17 2楼

楼主,继续

助工
2016-10-10 16:08 3楼

一、DHT11学习(单总线)

引脚:VCC:3.3V GND DATA 精度:湿度+-5%RH, 温度+-2℃

一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。

时序:


数字信号“0”表示

程序: IO初始化-》主机开始信号-》从机应答信号-》读取字节-》读取数据


void DHT11_Rst(void)//--主机开始信号 { DHT11_IO_OUT(); //SET OUTPUT输出 DHT11_DQ_OUT=0; //拉低DQ delay_ms(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(30); //主机拉高20~40us }


u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 buf[5]; u8 i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i<5;i++)//读取40位数据 { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])//校验和数据等于温湿度数据和 { *humi=buf[0]; *temp=buf[2]; } } else return 1; return 0; }

--


助工
2016-10-10 20:56 4楼

二、OLED的学习(SSD1306驱动芯片)

引脚:VCC(2.2~5V) GND D/C:data or cmd(数据或命令)RST:复位SCL:CLK 时钟线 SDA:数据线

时序:SCL拉低时传输数据,SDA拉高,传输结束SDA拉低SCL拉高

代码:

//向OLED写入一个字节。 //dat:要写入的数据/命令 //cmd:数据/命令标志 0,表示命令;1,表示数据; //OLED写时序
void OLED_WR_Byte(u8 dat,u8 cmd) { u8 i; if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); for(i=0;i<8;i++) { OLED_SCLK_Clr();//--------SCL拉低时,传输数据 if(dat&0x80)//-----------记录数值(10000000),比较 dat的最高位,为1则记录并依次左移 OLED_SDIN_Set(); else OLED_SDIN_Clr();//-----传输结束 OLED_SCLK_Set();//--------SCL拉高,传输结束 dat<<=1; } OLED_DC_Set(); }
程序流程:

1.初始化OLED:OLED_Init();

2.开启显示:OLED_Display_On();

3.显示字符串,需要调用字符串显示函数:OLED_ShowString();
4.这个字符串显示函数通过指针*p不断调用字符显示函数:OLED_ShowChar();
5.字符由点组成,接着调用画点函数:OLED_DrawPoint();
6.STM32的SRAM中开辟的一块128*8字节的空间OLED_GRAM[128][8]有八页。用来存放OLED_GRAM中所有点的坐标
7.通过两个for循环全部写入到SSD1306的GRAM中。OLED_Refresh——Gram();
调用OLED_WR_Byte()函数。这个函数作用是向SSD1306中写入一个字节数据。



高工
2016-10-11 13:19 5楼
我就要进来。
专家
2016-10-12 12:43 6楼
好标题~!
专家
2016-10-12 12:58 7楼
谢谢楼主分享,不错。
助工
2016-10-12 20:33 8楼

遇到的问题

1.刚才做实验,两块STM32板串口透传,A板采集温湿度,B板显示,B板串口中断里设置变量,从而判断温湿度数据,结果数据一直乱,温湿度时不时调换位置,而且B板LCD屏开机闪烁几下。解决:最后发现是因为一键下载电路有和复位线连载一起的,插上USB-232以后,电脑开始会发送一些乱码数据,这些乱码数据会影响到复位线,所以会发现屏幕会闪烁几次,这就是因为MCU一直在复位。

助工
2016-10-13 00:08 9楼

五、printf重定向

.代码:

int fputc(int ch, FILE *f)
{
/* 将Printf内容发往串口 */
USART_SendData(USART1,(ch));
// while (!(USART1->SR & USART_FLAG_TXE));
while( !USART_GetFlagStatus(USART1,USART_FLAG_TC));
return (ch);
}

.这里要注意包含头文件“stdio.h”

.还有就是在target选项里勾选“Use MicroLib”


助工
2016-10-13 00:13 10楼

六、串口透传

.A板uart2连接zigbee1,b板uart2连接zigbee2,A板采集温湿度,B板中断接收并且显示

.A板USART_SendData(USART2,temperature);发送温度数据

.B板

void USART2_IRQHandler(void)
{
volatile static unsigned int i=0;
u8 test [2];
while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET); //判断接收中断是否打开
i++;
*test=USART_ReceiveData(USART2);
if(i%2==0)
{
LCD_ShowNum(20,50,*test,2,16);//湿度
}
else
{
LCD_ShowNum(20,20,*test,2,16);
}

LED0=!LED0;
USART_ClearFlag(USART2, USART_FLAG_RXNE); //清除中断接受完成标志位
}

.在中断中判断接收次数的奇偶数,以辨别温度湿度这两个数据,并且在不同的位置显示温湿度数据信息。


共17条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]