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

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


前言

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

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

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

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


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

一、Keil5+FLYMCU(软件烧录)

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

请添加图片描述
请添加图片描述
请添加图片描述

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

请添加图片描述

二、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温湿度光照强度(软件篇)的配置,评论区欢迎讨论。

  • 1
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个基本的阿里云远程监控和控制stm32环境温湿度系统程序的框架。请注意,这只是一个示例,具体实现还需要根据具体情况进行详细设计和编写。 ```c #include "main.h" #include "dht11.h" #include "mqtt_client.h" /* 定义温湿度传感器GPIO口 */ #define DHT11_GPIO_Port GPIOA #define DHT11_Pin GPIO_PIN_0 /* 定义MQTT服务器地址 */ #define MQTT_SERVER "mqtt://xxx.xxx.xxx.xxx:1883" /* 定义MQTT客户端ID和主题 */ #define MQTT_CLIENT_ID "stm32-iot" #define MQTT_TOPIC "iot/temperature-humidity" /* 定义温湿度变量 */ float temperature, humidity; /* 定义MQTT客户端全局变量 */ mqtt_client_t mqtt_client; /* 温湿度获取函数 */ void get_temperature_humidity() { DHT11_Read_Data(&temperature, &humidity); // 读取DHT11传感器数据,获取温湿度值 } /* MQTT消息回调函数 */ void mqtt_callback(char *topic, uint8_t *payload, uint32_t length) { /* 处理MQTT消息 */ // 如果是设置温度和湿度的消息 if (strncmp(topic, "iot/temperature-humidity/set", strlen("iot/temperature-humidity/set")) == 0) { char *p = strstr(payload, ","); if (p != NULL) { float set_temperature = atof(payload); float set_humidity = atof(p+1); /* 在这里设置温度和湿度的控制逻辑 */ // ... } } } /* 主函数 */ int main(void) { /* 初始化硬件和软件 */ System_Init(); DHT11_Init(); /* 连接MQTT服务器 */ mqtt_connect(&mqtt_client, MQTT_SERVER, MQTT_CLIENT_ID, mqtt_callback); /* 主循环 */ while (1) { /* 获取温湿度值 */ get_temperature_humidity(); /* 发布温湿度值到MQTT服务器 */ char buffer[50]; sprintf(buffer, "{\"temperature\":%.2f,\"humidity\":%.2f}", temperature, humidity); mqtt_publish(&mqtt_client, MQTT_TOPIC, buffer, strlen(buffer)); /* 等待一段时间 */ HAL_Delay(1000); } } ``` 以上是一个简单的阿里云远程监控和控制stm32环境温湿度系统程序的框架。具体实现还需要根据具体情况进行详细设计和编写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kisorge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值