这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » stm32空气监测系统

共17条 1/2 1 2 跳转至

stm32空气监测系统

助工
2016-10-09 12:05:51     打赏


专家
2016-10-09 15:17:01     打赏
2楼

楼主,继续


助工
2016-10-10 16:08:52     打赏
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:22     打赏
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:19     打赏
5楼
我就要进来。

专家
2016-10-12 12:43:13     打赏
6楼
好标题~!

专家
2016-10-12 12:58:09     打赏
7楼
谢谢楼主分享,不错。

助工
2016-10-12 20:33:05     打赏
8楼

遇到的问题

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


助工
2016-10-13 00:08:47     打赏
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:34     打赏
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 跳转至

回复

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