天天看點

stm32溫度濕度(帶藍牙app功能)

stm32溫度濕度(帶藍牙app功能)

stm32溫度濕度(帶藍牙app功能)

  • ​​1.配置藍牙子產品​​
  • ​​1.1藍牙子產品​​
  • ​​1.2 ch340 -->usb轉換TTL​​
  • ​​1.3USB轉換TTL與藍牙子產品連接配接​​
  • ​​1.3.1查找藍牙文檔(hc-05)的​​
  • ​​1.3.2 然後打開序列槽助手​​
  • ​​1.3.3設定波特率為(38400),然後打開序列槽​​
  • ​​1.3.4 測試AT指令​​
  • ​​1.3.5 設定/查詢裝置名稱​​
  • ​​1.3.6 修改藍牙密碼(我沒有修改,你可以修改一下)​​
  • ​​1.3.7 (重要的設定) 設定/查詢—序列槽參數:​​
  • ​​2. 連接配接每一個子產品​​
  • ​​3.寫代碼​​
  • ​​3.1 DHT11代碼​​
  • ​​3.2 oled代碼​​
  • ​​3.3 led代碼​​
  • ​​3.4 key代碼(顯示藍牙是否連接配接)​​
  • ​​3.5序列槽設定​​
  • ​​3.5 Main函數解釋​​
  • ​​3.5.1導入其他檔案的頭檔案​​
  • ​​3.5.2 函數的初始化​​
  • ​​3.5.3 每進行一次不一樣的顯示要進行一次清除oled螢幕​​
  • ​​3.5.6 顯示一個圖檔​​
  • ​​3.5.5 顯示個人資訊​​
  • ​​進入 while 函數​​
  • ​​APP連接配接藍牙​​
  • ​​完整stm32代碼下載下傳​​

1.配置藍牙子產品

連接配接藍牙子產品與序列槽子產品(ch340 -->usb轉換TTL)

stm32溫度濕度(帶藍牙app功能)

1.1藍牙子產品

stm32溫度濕度(帶藍牙app功能)

藍牙原理圖

stm32溫度濕度(帶藍牙app功能)

1.2 ch340 -->usb轉換TTL

藍牙 usb轉換TTL

GND ---------------->GND

TXD ---------------->RXD

RXD ------------------>TXD

VCC -------------------> VCC

KEY(EN)使能的io—>5V(3.3V)

stm32溫度濕度(帶藍牙app功能)

1.3USB轉換TTL與藍牙子產品連接配接

1.3.1查找藍牙文檔(hc-05)的

stm32溫度濕度(帶藍牙app功能)

1.3.2 然後打開序列槽助手

stm32溫度濕度(帶藍牙app功能)

1.3.3設定波特率為(38400),然後打開序列槽

上電,子產品進入 AT 指令響應狀态。超級終端或其他序列槽工具,設定波特率 38400,資料位 8 位,停止位 1 位,無校驗位,無流控制。

序列槽發送字元“AT”,成功傳回“OK”。PIO 置低,重新上電,子產品為主子產品,自動搜尋從子產品,建立連接配接。

stm32溫度濕度(帶藍牙app功能)

1.3.4 測試AT指令

stm32溫度濕度(帶藍牙app功能)

1.3.5 設定/查詢裝置名稱

stm32溫度濕度(帶藍牙app功能)

設定藍牙名稱:

AT+NAME="JYY"      
stm32溫度濕度(帶藍牙app功能)

傳回​

​ok​

檢視是否設定成功

AT+NAME?      
stm32溫度濕度(帶藍牙app功能)

1.3.6 修改藍牙密碼(我沒有修改,你可以修改一下)

stm32溫度濕度(帶藍牙app功能)
stm32溫度濕度(帶藍牙app功能)

1.3.7 (重要的設定) 設定/查詢—序列槽參數:

stm32溫度濕度(帶藍牙app功能)

設定為 ​

​9600​

​​,​

​0​

​​,​

​0​

AT+UART=9600,0,0      

2. 連接配接每一個子產品

/************************************************
  @yuan
  
  io連接配接圖
  DHT11溫濕度子產品  (DATA)io---- PA.11
  
  OLED 
  SDA   ---->PA.5
  SCL   ---->PA.7
  
  藍牙子產品
  RXD ----->stm32f103的PA.9(TXD)
  TXD ----->stm32f103的PA.10(RXD)
  
  KEY--> 藍牙顯示LED PA.12 如果·連接配接成功顯示ON 連接配接失敗或者沒有藍牙顯示OFF
************************************************/      
stm32溫度濕度(帶藍牙app功能)
stm32溫度濕度(帶藍牙app功能)

3.寫代碼

3.1 DHT11代碼

//複位DHT11
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
}
//等待DHT11的回應
//傳回1:未檢測到DHT11的存在
//傳回0:存在
u8 DHT11_Check(void)       
{   
    u8 retry=0;
    DHT11_IO_IN();//SET INPUT  
    while (DHT11_DQ_IN&&retry<100)//DHT11會拉低40~80us
    {
        retry++;
        delay_us(1);
    };     
    if(retry>=100)return 1;
    else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低後會再次拉高40~80us
    {
        retry++;
        delay_us(1);
    };
    if(retry>=100)return 1;        
    return 0;
}
//從DHT11讀取一個位
//傳回值:1/0
u8 DHT11_Read_Bit(void)             
{
    u8 retry=0;
    while(DHT11_DQ_IN&&retry<100)//等待變為低電平
    {
        retry++;
        delay_us(1);
    }
    retry=0;
    while(!DHT11_DQ_IN&&retry<100)//等待變高電平
    {
        retry++;
        delay_us(1);
    }
    delay_us(40);//等待40us
    if(DHT11_DQ_IN)return 1;
    else return 0;           
}
//從DHT11讀取一個位元組
//傳回值:讀到的資料
u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
    for (i=0;i<8;i++) 
    {
        dat<<=1; 
        dat|=DHT11_Read_Bit();
    }                            
    return dat;
}
//從DHT11讀取一次資料
//temp:溫度值(範圍:0~50°)
//humi:濕度值(範圍:20%~90%)
//傳回值:0,正常;1,讀取失敗
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;        
}
//初始化DHT11的IO口 DQ 同時檢測DHT11的存在
//傳回1:不存在
//傳回0:存在         
u8 DHT11_Init(void)
{     
    GPIO_InitTypeDef  GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     //使能PA端口時鐘
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                 //PA11端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽輸出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);                 //初始化IO口
    GPIO_SetBits(GPIOA,GPIO_Pin_11);                         //PA11 輸出高
                
    DHT11_Rst();  //複位DHT11
    return DHT11_Check();//等待DHT11的回應
}      

3.2 oled代碼

//              說明: 
//              ----------------------------------------------------------------
//              GND   電源地
//              VCC   接5V或3.3v電源
//              SCL   接PA5(SCL)
//              SDA   接PA7(SDA)            
//              ----------------------------------------------------------------
//@yuan
void IIC_Start(void)
{

  OLED_SCLK_Set() ;
  OLED_SDIN_Set();
  OLED_SDIN_Clr();
  OLED_SCLK_Clr();
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop(void)
{
OLED_SCLK_Set() ;
//  OLED_SCLK_Clr();
  OLED_SDIN_Clr();
  OLED_SDIN_Set();
  
}

void IIC_Wait_Ack(void)
{

  //GPIOB->CRH &= 0XFFF0FFFF;  //設定PB12為上拉輸入模式
  //GPIOB->CRH |= 0x00080000;
//  OLED_SDA = 1;
//  delay_us(1);
  //OLED_SCL = 1;
  //delay_us(50000);
/*  while(1)
  {
    if(!OLED_SDA)       //判斷是否接收到OLED 應答信号
    {
      //GPIOB->CRH &= 0XFFF0FFFF;  //設定PB12為通用推免輸出模式
      //GPIOB->CRH |= 0x00030000;
      return;
    }
  }
*/
  OLED_SCLK_Set() ;
  OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/

void Write_IIC_Byte(unsigned char IIC_Byte)
{
  unsigned char i;
  unsigned char m,da;
  da=IIC_Byte;
  OLED_SCLK_Clr();
  for(i=0;i<8;i++)    
  {
      m=da;
    //  OLED_SCLK_Clr();
    m=m&0x80;
    if(m==0x80)
    {OLED_SDIN_Set();}
    else OLED_SDIN_Clr();
      da=da<<1;
    OLED_SCLK_Set();
    OLED_SCLK_Clr();
    }


}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
   IIC_Start();
   Write_IIC_Byte(0x78);            //Slave address,SA0=0
  IIC_Wait_Ack();  
   Write_IIC_Byte(0x00);      //write command
  IIC_Wait_Ack();  
   Write_IIC_Byte(IIC_Command); 
  IIC_Wait_Ack();  
   IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
   IIC_Start();
   Write_IIC_Byte(0x78);      //D/C#=0; R/W#=0
  IIC_Wait_Ack();  
   Write_IIC_Byte(0x40);      //write data
  IIC_Wait_Ack();  
   Write_IIC_Byte(IIC_Data);
  IIC_Wait_Ack();  
   IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
  if(cmd)
      {

   Write_IIC_Data(dat);
   
    }
  else {
   Write_IIC_Command(dat);
    
  }


}


/********************************************
// fill_Picture
********************************************/
void fill_picture(unsigned char fill_Data)
{
  unsigned char m,n;
  for(m=0;m<8;m++)
  {
    OLED_WR_Byte(0xb0+m,0);    //page0-page1
    OLED_WR_Byte(0x00,0);    //low column start address
    OLED_WR_Byte(0x10,0);    //high column start address
    for(n=0;n<128;n++)
      {
        OLED_WR_Byte(fill_Data,1);
      }
  }
}


/***********************Delay****************************************/
void Delay_50ms(unsigned int Del_50ms)
{
  unsigned int m;
  for(;Del_50ms>0;Del_50ms--)
    for(m=6245;m>0;m--);
}

void Delay_1ms(unsigned int Del_1ms)
{
  unsigned char j;
  while(Del_1ms--)
  {  
    for(j=0;j<123;j++);
  }
}

//坐标設定

  void OLED_Set_Pos(unsigned char x, unsigned char y) 
{  OLED_WR_Byte(0xb0+y,OLED_CMD);
  OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  OLED_WR_Byte((x&0x0f),OLED_CMD); 
}      
//開啟OLED顯示    
void OLED_Display_On(void)
{
  OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC指令
  OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}
//關閉OLED顯示     
void OLED_Display_Off(void)
{
  OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC指令
  OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}             
//清屏函數,清完屏,整個螢幕是黑色的!和沒點亮一樣!!!   
void OLED_Clear(void)  
{  
  u8 i,n;        
  for(i=0;i<8;i++)  
  {  
    OLED_WR_Byte (0xb0+i,OLED_CMD);    //設定頁位址(0~7)
    OLED_WR_Byte (0x00,OLED_CMD);      //設定顯示位置—列低位址
    OLED_WR_Byte (0x10,OLED_CMD);      //設定顯示位置—列高位址   
    for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 
  } //更新顯示
}
void OLED_On(void)  
{  
  u8 i,n;        
  for(i=0;i<8;i++)  
  {  
    OLED_WR_Byte (0xb0+i,OLED_CMD);    //設定頁位址(0~7)
    OLED_WR_Byte (0x00,OLED_CMD);      //設定顯示位置—列低位址
    OLED_WR_Byte (0x10,OLED_CMD);      //設定顯示位置—列高位址   
    for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA); 
  } //更新顯示
}
//在指定位置顯示一個字元,包括部分字元
//x:0~127
//y:0~63
//mode:0,反白顯示;1,正常顯示         
//size:選擇字型 16/12 
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{        
  unsigned char c=0,i=0;  
    c=chr-' ';//得到偏移後的值     
    if(x>Max_Column-1){x=0;y=y+2;}
    if(Char_Size ==16)
      {
      OLED_Set_Pos(x,y);  
      for(i=0;i<8;i++)
      OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
      OLED_Set_Pos(x,y+1);
      for(i=0;i<8;i++)
      OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
      }
      else {  
        OLED_Set_Pos(x,y);
        for(i=0;i<6;i++)
        OLED_WR_Byte(F6x8[c][i],OLED_DATA);
        
      }
}
//m^n函數
u32 oled_pow(u8 m,u8 n)
{
  u32 result=1;   
  while(n--)result*=m;    
  return result;
}          
//顯示2個數字
//x,y :起點坐标  
//len :數字的位數
//size:字型大小
//mode:模式 0,填充模式;1,疊加模式
//num:數值(0~4294967295);       
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
{          
  u8 t,temp;
  u8 enshow=0;               
  for(t=0;t<len;t++)
  {
    temp=(num/oled_pow(10,len-t-1))%10;
    if(enshow==0&&t<(len-1))
    {
      if(temp==0)
      {
        OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
        continue;
      }else enshow=1; 
       
    }
    OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 
  }
} 
//顯示一個字元号串
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
  unsigned char j=0;
  while (chr[j]!='\0')
  {    OLED_ShowChar(x,y,chr[j],Char_Size);
      x+=8;
    if(x>120){x=0;y+=2;}
      j++;
  }
}
//顯示漢字
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{                
  u8 t,adder=0;
  OLED_Set_Pos(x,y);  
    for(t=0;t<16;t++)
    {
        OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
        adder+=1;
     }  
    OLED_Set_Pos(x,y+1);  
    for(t=0;t<16;t++)
      {  
        OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
        adder+=1;
      }          
}
/***********功能描述:顯示顯示BMP圖檔128×64起始點坐标(x,y),x的範圍0~127,y為頁的範圍0~7*****************/
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{  
 unsigned int j=0;
 unsigned char x,y;
  
  if(y1%8==0) y=y1/8;      
  else y=y1/8+1;
  for(y=y0;y<y1;y++)
  {
    OLED_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
      {      
        OLED_WR_Byte(BMP[j++],OLED_DATA);        
      }
  }
} 

//初始化SSD1306              
void OLED_Init(void)
{  
  GPIO_InitTypeDef  GPIO_InitStructure;
  

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能A端口時鐘
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);    //初始化GPIOD3,6
  GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7);  


delay_ms(800);
OLED_WR_Byte(0xAE,OLED_CMD);//--display off
  OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
  OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
  OLED_WR_Byte(0x81,OLED_CMD); // contract control
  OLED_WR_Byte(0xFF,OLED_CMD);//--128   
  OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap 
  OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
  OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
  OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
  OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
  OLED_WR_Byte(0x00,OLED_CMD);//
  
  OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
  OLED_WR_Byte(0x80,OLED_CMD);//
  
  OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
  OLED_WR_Byte(0x05,OLED_CMD);//
  
  OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
  OLED_WR_Byte(0xF1,OLED_CMD);//
  
  OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
  OLED_WR_Byte(0x12,OLED_CMD);//
  
  OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
  OLED_WR_Byte(0x30,OLED_CMD);//
  
  OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
  OLED_WR_Byte(0x14,OLED_CMD);//
  
  OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}      

3.3 led代碼

//初始化PC.13為輸出口.并使能這個口的時鐘        
//LED IO初始化
void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);   //使能PC端口時鐘
  
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;         //LED-->PC.13 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽輸出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //IO口速度為50MHz
 GPIO_Init(GPIOC, &GPIO_InitStructure);           //根據設定參數初始化GPIOC.13
 GPIO_SetBits(GPIOC,GPIO_Pin_13);             //PC.13 輸出高
}      

3.4 key代碼(顯示藍牙是否連接配接)

//按鍵初始化函數
void KEY_Init(void) //IO初始化
{ 
  GPIO_InitTypeDef GPIO_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA時鐘

  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12;//KEY
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設定成上拉輸入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.12

}      

3.5序列槽設定

//序列槽1中斷服務程式
//注意,讀取USARTx->SR能避免莫名其妙的錯誤    
u8 USART_RX_BUF[USART_REC_LEN];     //接收緩沖,最大USART_REC_LEN個位元組.
//接收狀态
//bit15,  接收完成标志
//bit14,  接收到0x0d
//bit13~0,  接收到的有效位元組數目
u16 USART_RX_STA=0;       //接收狀态标記    
  
void uart_init(u32 bound){
  //GPIO端口設定
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);  //使能USART1,GPIOA時鐘
  
  //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //複用推挽輸出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX   GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優先級3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;    //子優先級3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //IRQ通道使能
  NVIC_Init(&NVIC_InitStructure);  //根據指定的參數初始化VIC寄存器
  
   //USART 初始化設定

  USART_InitStructure.USART_BaudRate = bound;//序列槽波特率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位資料格式
  USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
  USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬體資料流控制
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //收發模式

  USART_Init(USART1, &USART_InitStructure); //初始化序列槽1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟序列槽接受中斷
  USART_Cmd(USART1, ENABLE);                    //使能序列槽1 

}      

3.5 Main函數解釋

3.5.1導入其他檔案的頭檔案

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "dht11.h"
#include "oled.h"
#include "bmp.h"
#include "stdio.h"
#include "key.h"
/************************************************      

3.5.2 函數的初始化

=0;           //設定計數
  u8 temperature =0;      //溫度   
  u8 humidity = 0;        //濕度

  delay_init();         //延時函數初始化   
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定中斷優先級分組為組2:2位搶占優先級,2位響應優先級
  uart_init(9600);    //序列槽初始化為115200
  LED_Init();          //初始化與LED連接配接的硬體接口    
  KEY_Init();         //初始化按鍵
  OLED_Init();      //初始化OLED  
  OLED_Clear();     //清除oled螢幕
  while(DHT11_Init())  //DHT11初始化  
  {
    printf("DHT11 Error\r\n"); //如果連接配接APP,app顯示DHT11錯誤
    OLED_ShowString(50,3,"DHT11 Error:",16); //oled顯示DHT11錯誤
    delay_ms(200);  //延時200ms
  }      

3.5.3 每進行一次不一樣的顯示要進行一次清除oled螢幕

OLED_Clear();//清除oled螢幕      

3.5.6 顯示一個圖檔

//顯示一個圖檔
  OLED_DrawBMP(0,0,128,8,BMP2);  //圖檔顯示第一個0是X下坐标,第二個0是Y坐标,顯示BMP圖檔128×64起始點坐标(x,y),x的範圍0~127,y為頁的範圍
  delay_ms(1000);  //延時1s
  delay_ms(500);  //延時500ms
  OLED_Clear();//清除oled螢幕      
stm32溫度濕度(帶藍牙app功能)

進行圖檔的圖檔取模打開 PCtoLCD2002.exe 軟體

stm32溫度濕度(帶藍牙app功能)
stm32溫度濕度(帶藍牙app功能)

選擇照片

stm32溫度濕度(帶藍牙app功能)

模式設定

stm32溫度濕度(帶藍牙app功能)
stm32溫度濕度(帶藍牙app功能)

生成 BMP 圖像字模

stm32溫度濕度(帶藍牙app功能)

把圖檔字模放在

stm32溫度濕度(帶藍牙app功能)

使用函數

stm32溫度濕度(帶藍牙app功能)

3.5.5 顯示個人資訊

//顯示個人資訊
  OLED_ShowCHinese(36,0,3);//制
  OLED_ShowCHinese(54,0,4);//作
  OLED_ShowCHinese(72,0,5);//者
  
  OLED_ShowCHinese(36,3,6);//J
  OLED_ShowCHinese(54,3,7);//Y
  OLED_ShowCHinese(72,3,8);//Y
  
  OLED_ShowCHinese(0,6,9);//時
  OLED_ShowCHinese(18,6,10);//間
  OLED_ShowString(36,6,":2020-07-06",16); //oled顯示
  delay_ms(1000);  //延時1s
  delay_ms(500);  //延時500ms
  OLED_Clear();//清除oled螢幕      

漢字字模的生成方法:

打開軟體以後;如下操作

stm32溫度濕度(帶藍牙app功能)
stm32溫度濕度(帶藍牙app功能)

得到的模放在oledfont.h中

stm32溫度濕度(帶藍牙app功能)

進入 while 函數

if(t%10==0)      //每100ms讀取一次
    {                    
      DHT11_Read_Data(&temperature,&humidity);  //讀取溫濕度值              
//      printf("%d\r\n",temperature); //顯示溫度           
//      printf("%d\r\n",humidity);    //顯示濕度       
    }           
    delay_ms(10);
    t++;
    if(t==50)//stm32發送藍牙的速度,可以修改選擇50是代表500ms
    {
      t=0;
      LED=!LED;
      //500ms stm30序列槽發送資料到藍牙子產品,然後藍牙子產品發送到手機APP
      printf("temperature:%d,  humidity:%d\n",temperature,humidity);  //APP顯示溫度 顯示濕度           
      
    }
    
    //判斷藍牙(Bluetooth)是否連接配接成功 連接配接成功傳回1 不成功傳回0
    OLED_ShowString(0,0,"Bluetooth:",16);//顯示藍牙名稱
    if(KEY == 1)
      OLED_ShowString(80,0,"ON ",16);//連接配接藍牙成功 顯示ON
    else
      OLED_ShowString(80,0,"OFF",16);//沒有連接配接藍牙或者連接配接失敗
      
    //OLED顯示文字 "溫度:"
    OLED_ShowCHinese(0,3,0);//溫
    OLED_ShowCHinese(18,3,1);//度
    OLED_ShowString(35,3,":",16);//:
    OLED_ShowNum(50,3,temperature,2,16);//顯示ASCII字元的碼值  
    
    //OLED顯示文字 "濕度:"
    OLED_ShowCHinese(0,6,2);//濕
    OLED_ShowCHinese(18,6,1);//度
    OLED_ShowString(35,6,":",16);//:
    OLED_ShowNum(50,6,humidity,2,16);//顯示ASCII字元的碼值 
  }      

APP連接配接藍牙

​​完整stm32代碼下載下傳​​