【云平台】小白从零开始:小程序阿里云平台控制STM32温湿度光照强度(软件篇)

小白从零开始:小程序阿里云平台控制STM32温湿度光照强度(软件篇)

文章目录

  • 前言
  • 一、Keil5+FLYMCU(软件烧录)
  • 二、DHT11温湿度模块驱动代码
  • 三、BH1750光照强度驱动代码
  • 总结


前言

小白从零开始:小程序阿里云平台控制STM32温湿度光照强度(软件篇)

【DIY】stm32f103c8t6+mqtt阿里云+小程序+n多外设

使用工具:
硬件:
PCB设计: 立创EDA+嘉立创
硬件外设:STM32F103C8T6最小系统+dht11+bh1750+mq2+mq7+gps+0.96oled+蓝牙hc06+esp8266-01s
设计出来的总体是这样

软件:
代码编译:KEIL5、
代码烧录:FLYMCU
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、Keil5+FLYMCU(软件烧录)

首先在写入代码之前,把KEIL5配置好

【云平台】小白从零开始:小程序阿里云平台控制STM32温湿度光照强度(软件篇)_第1张图片
【云平台】小白从零开始:小程序阿里云平台控制STM32温湿度光照强度(软件篇)_第2张图片
【云平台】小白从零开始:小程序阿里云平台控制STM32温湿度光照强度(软件篇)_第3张图片

其次在烧录代码之前,把FLYMCU配置好

【云平台】小白从零开始:小程序阿里云平台控制STM32温湿度光照强度(软件篇)_第4张图片

二、DHT11温湿度模块驱动代码

DHT11温湿度模块驱动代码

#include "dht11.h"
#include "delay.h"
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_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;		   
}

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_GPIOB, ENABLE);	 //ʹÄÜPG¶Ë¿ÚʱÖÓ
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				 //PB11¶Ë¿ÚÅäÖÃ
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //ÍÆÍìÊä³ö
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);				 //³õʼ»¯IO¿Ú
 	GPIO_SetBits(GPIOB,GPIO_Pin_11);						 //PG11 Êä³ö¸ß
			    
	DHT11_Rst();  //¸´Î»DHT11
	return DHT11_Check();//µÈ´ýDHT11µÄ»ØÓ¦
} 

三、BH1750光照强度驱动代码

BH1750光照强度驱动代码



#include "BH1750.h"
#include "delay.h"
//#include "oled.h"
//#include "oled_iic.h"
uchar    BUF[8];               //½ÓÊÕÊý¾Ý»º´æÇø  
int   mcy;     //½øλ±êÖ¾

/***¿ªÊ¼ÐźÅ***/
void BH1750_Start()
{
  SDA=1;                    //À­¸ßÊý¾ÝÏß
  SCL=1;                   //À­¸ßʱÖÓÏß
  Delay_Us(5);                 //ÑÓʱ
  GPIO_ResetBits(bh1750_PORT, sda);                    //²úÉúϽµÑØ
  Delay_Us(5);                 //ÑÓʱ
  GPIO_ResetBits(bh1750_PORT, scl);                    //À­µÍʱÖÓÏß
}

void BH1750_Stop()
{
    SDA=0;                   //À­µÍÊý¾ÝÏß
    SCL=1;                      //À­¸ßʱÖÓÏß
    Delay_Us(5);                 //ÑÓʱ
    GPIO_SetBits(bh1750_PORT, sda);                    //²úÉúÉÏÉýÑØ
    Delay_Us(5);                 //ÑÓʱ
}

void BH1750_SendACK(int ack)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_Pin = sda;
  GPIO_Init(bh1750_PORT, &GPIO_InitStruct);  
	
	if(ack == 1)   //дӦ´ðÐźÅ
		SDA=1; 
	else if(ack == 0)
		SDA=0; 
	else
		return;			
  SCL=1;     //À­¸ßʱÖÓÏß
  Delay_Us(5);                 //ÑÓʱ
  SCL=0;      //À­µÍʱÖÓÏß
  Delay_Us(5);                //ÑÓʱ
}
void BH1750_SendByte(uchar dat)
{
  uchar i;
  for (i=0; i<8; i++)         //8λ¼ÆÊýÆ÷
  {
		if( 0X80 & dat )
      GPIO_SetBits(bh1750_PORT,sda);
    else
      GPIO_ResetBits(bh1750_PORT,sda);
		dat <<= 1;
    SCL=1;               //À­¸ßʱÖÓÏß
    Delay_Us(5);             //ÑÓʱ
    SCL=0;                //À­µÍʱÖÓÏß
    Delay_Us(5);            //ÑÓʱ
  }
  BH1750_RecvACK();
}
uchar BH1750_RecvByte()
{
  uchar i;
  uchar dat = 0;
	uchar bit;
	
	GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;   /*ÕâÀïÒ»¶¨ÒªÉè³ÉÊäÈëÉÏÀ­£¬·ñÔò²»ÄܶÁ³öÊý¾Ý*/
  GPIO_InitStruct.GPIO_Pin = sda;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(bh1750_PORT,&GPIO_InitStruct );
	
  GPIO_SetBits(bh1750_PORT,sda);          //ʹÄÜÄÚ²¿ÉÏÀ­,×¼±¸¶ÁÈ¡Êý¾Ý,
  for (i=0; i<8; i++)         //8λ¼ÆÊýÆ÷
  {
    dat <<= 1;
    SCL=1;               //À­¸ßʱÖÓÏß
    Delay_Us(5);             //ÑÓʱ
			
		if( SET == GPIO_ReadInputDataBit(bh1750_PORT,sda))
      bit = 0X01;
    else
      bit = 0x00;  
		dat |= bit;             //¶ÁÊý¾Ý    
		SCL=0;                //À­µÍʱÖÓÏß
    Delay_Us(5);            //ÑÓʱ
  }		
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(bh1750_PORT, &GPIO_InitStruct );
  return dat;
}

void Single_Write_BH1750(uchar REG_Address)
{
  BH1750_Start();                  //ÆðʼÐźÅ
  BH1750_SendByte(SlaveAddress);   //·¢ËÍÉ豸µØÖ·+дÐźÅ
  BH1750_SendByte(REG_Address);    //ÄÚ²¿¼Ä´æÆ÷µØÖ·£¬Çë²Î¿¼ÖÐÎÄpdf22Ò³ 
//  BH1750_SendByte(REG_data);       //ÄÚ²¿¼Ä´æÆ÷Êý¾Ý£¬Çë²Î¿¼ÖÐÎÄpdf22Ò³ 
  BH1750_Stop();                   //·¢ËÍÍ£Ö¹ÐźÅ
}

//³õʼ»¯BH1750£¬¸ù¾ÝÐèÒªÇë²Î¿¼pdf½øÐÐÐÞ¸Ä****
void Init_BH1750()
{
  GPIO_InitTypeDef GPIO_InitStruct;
	 /*¿ªÆôGPIOBµÄÍâÉèʱÖÓ*/ 
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); 
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_Pin = sda | scl ;
  GPIO_Init(bh1750_PORT,&GPIO_InitStruct); 
	
  Single_Write_BH1750(0x01);  
	Delay_Ms(180);            //ÑÓʱ180ms
}

//Á¬Ðø¶Á³öBH1750ÄÚ²¿Êý¾Ý
void mread(void)
{   
	uchar i;	
  BH1750_Start();                          //ÆðʼÐźÅ
  BH1750_SendByte(SlaveAddress+1);         //·¢ËÍÉ豸µØÖ·+¶ÁÐźÅ
	
	for (i=0; i<3; i++)                      //Á¬Ðø¶ÁÈ¡6¸öµØÖ·Êý¾Ý£¬´æ´¢ÖÐBUF
  {
    BUF[i] = BH1750_RecvByte();          //BUF[0]´æ´¢0x32µØÖ·ÖеÄÊý¾Ý
    if (i == 3)
    {
      BH1750_SendACK(1);                //×îºóÒ»¸öÊý¾ÝÐèÒª»ØNOACK
    }
    else
    {		
      BH1750_SendACK(0);                //»ØÓ¦ACK
    }
  }
  BH1750_Stop();                          //Í£Ö¹ÐźÅ
  Delay_Ms(5);
}
float read_BH1750(void)
{
  int dis_data;                       //±äÁ¿	
	float temp1;
	float temp2;
	Single_Write_BH1750(0x01);   // power on
  Single_Write_BH1750(0x10);   // H- resolution mode
  Delay_Ms(180);            //ÑÓʱ180ms
	mread();       //Á¬Ðø¶Á³öÊý¾Ý£¬´æ´¢ÔÚBUFÖÐ
  dis_data=BUF[0];
  dis_data=(dis_data<<8)+BUF[1]; //ºÏ³ÉÊý¾Ý 
	temp1=dis_data/1.2;
	temp2=10*dis_data/1.2;	
	temp2=(int)temp2%10;
//	OLED_ShowStr(87,2,".",12); 
//	OLED_ShowNum(94,2,temp2,1,12);	
	return temp1;
}


总结

本文仅仅简单介绍了【云平台】小白从零开始:小程序阿里云平台控制STM32温湿度光照强度(软件篇)的配置,评论区欢迎讨论。

你可能感兴趣的:(云平台,stm32,阿里云,小程序)