使用DHT11温湿度传感器测量温湿度,使用BH1750测量光照强度,使用土壤湿度传感器测量土壤湿度。需要做PCB板子,32+pcb+传感器+oled显示这几个数据

1、项目简介

2、实现逻辑

#通过dht11检测温湿度
#通过bh1750检测光照强度
#通过adc检测土壤湿度
#将数据显示到oled及通过串口发送给nbiot模块,然后到阿里云

3、应用场景

#远程检测环境参数

4、核心代码梳理

//代码是用的之前复用好几次的了不重要,重要的是nbiot模块的配置
//temp hump
void DHT11_IO_IN(void) {GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = DHT11_Pin;GPIO_InitStructure.Mode = GPIO_MODE_INPUT;HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
}void DHT11_IO_OUT(void) {GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = DHT11_Pin;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
}void DHT11_Rst(void) {DHT11_IO_OUT();  //DHT11_DQ_OUT_LOW;     //HAL_Delay(20);        //DHT11_DQ_OUT_HIGH;    //delay_us(30);         //
}uint8_t DHT11_Check(void) {uint8_t retry=0;DHT11_IO_IN();while (DHT11_DQ_IN && retry<100) {retry++;delay_us(1);};if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_IN&&retry<100) {retry++;delay_us(1);};if(retry>=100)return 1;return 0;   //DHT11
}uint8_t DHT11_Read_Bit(void) {uint8_t 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);if(DHT11_DQ_IN)return 1;else return 0;
}uint8_t DHT11_Read_Byte(void) {uint8_t i,dat;dat=0;for (i=0; i<8; i++) {dat<<=1;dat|=DHT11_Read_Bit();}return dat;
}uint8_t DHT11_Read_Data(uint16_t *temp,uint16_t *humi) {uint8_t buf[5];uint8_t i;DHT11_Rst();if(DHT11_Check()==0) {for(i=0; i<5; i++) {buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) {*humi=(buf[0]<<8) + buf[1];*temp=(buf[2]<<8) + buf[3];}} else return 1;return 0;
}uint8_t DHT11_Init(void) {DHT11_Rst();return DHT11_Check();
}bh1750****************//
/***开始信号***/
void BH1750_Start()
{HAL_GPIO_WritePin(GPIOB, BH1750_SDA_Pin,GPIO_PIN_SET);                    //拉高数据线HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_SET);                   //拉高时钟线delay_us(5);                 //延时HAL_GPIO_WritePin(GPIOB, BH1750_SDA_Pin,GPIO_PIN_RESET);                    //产生下降沿delay_us(5);                 //延时HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_RESET);                    //拉低时钟线
}/*****停止信号******/
void BH1750_Stop()
{HAL_GPIO_WritePin(GPIOB, BH1750_SDA_Pin,GPIO_PIN_RESET);                   //拉低数据线HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_SET);                      //拉高时钟线delay_us(5);                 //延时HAL_GPIO_WritePin(GPIOB, BH1750_SDA_Pin,GPIO_PIN_SET);                    //产生上升沿delay_us(5);                 //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(int ack)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);if(ack == 1)   //写应答信号HAL_GPIO_WritePin(GPIOB, BH1750_SDA_Pin,GPIO_PIN_SET);else if(ack == 0)HAL_GPIO_WritePin(GPIOB, BH1750_SDA_Pin,GPIO_PIN_RESET);elsereturn;HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_SET);      //拉高时钟线delay_us(5);                //延时HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_RESET);      //拉低时钟线delay_us(5);                 //延时
}
/**************************************
接收应答信号
**************************************/
int BH1750_RecvACK()
{int mcy;GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  /*这里一定要设成输入上拉,否则不能读出数据*/GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Pin = BH1750_SDA_Pin;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_SET);            //拉高时钟线delay_us(5);                 //延时if(HAL_GPIO_ReadPin( GPIOB, BH1750_SDA_Pin ) == 1 )//读应答信号mcy = 1 ;elsemcy = 0 ;HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_RESET);                    //拉低时钟线delay_us(5);                 //延时GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;HAL_GPIO_Init( GPIOB, &GPIO_InitStruct );return mcy;
}/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(uint8_t dat)
{uint8_t i;HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_RESET);                //拉低时钟线delay_us(2);             //延时for (i=0; i<8; i++)         //8位计数器{if( 0X80 & dat )HAL_GPIO_WritePin(GPIOB, BH1750_SDA_Pin,GPIO_PIN_SET);elseHAL_GPIO_WritePin(GPIOB, BH1750_SDA_Pin,GPIO_PIN_RESET);dat <<= 1;HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_SET);               //拉高时钟线delay_us(2);             //延时HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_RESET);                //拉低时钟线delay_us(2);             //延时}//BH1750_RecvACK();
}/**************************************
从IIC总线读取一个字节数据
**************************************/
uint8_t BH1750_RecvByte()
{uint8_t i;uint8_t dat = 0;uint8_t bit;GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;   /*这里一定要设成输入上拉,否则不能读出数据*/GPIO_InitStruct.Pin = BH1750_SDA_Pin;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init( GPIOB, &GPIO_InitStruct );//HAL_GPIO_WritePin(GPIOB, BH1750_SDA_Pin,GPIO_PIN_SET);          //使能内部上拉,准备读取数据,for (i=0; i<8; i++)         //8位计数器{//dat <<= 1;HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_RESET);               //拉高时钟线delay_us(2);             //延时HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_SET);dat <<= 1;HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_SET);if( SET == HAL_GPIO_ReadPin( GPIOB, BH1750_SDA_Pin ) )dat |= 0X01;//拉低时钟线delay_us(1);             //延时}HAL_GPIO_WritePin(GPIOB, BH1750_SCL_Pin,GPIO_PIN_RESET);GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;HAL_GPIO_Init( GPIOB, &GPIO_InitStruct );return dat;
}void Init_BH1750()
{BH1750_Start();BH1750_SendByte(0x46);BH1750_SendByte(0x01);BH1750_Stop();
}void Single_Write_BH1750(u8 REG_Address)
{BH1750_Start();//起始信号BH1750_SendByte(0x46);//发送设备地址+写信号BH1750_RecvACK();BH1750_SendByte(REG_Address);//内部寄存器地址,请参考中文pdf22页BH1750_RecvACK();BH1750_Stop();//发送停止信号
}/*********************************************************
连续读出BH1750内部数据
*********************************************************/
void Multiple_Read_BH1750()
{BH1750_Start();//起始信号BH1750_SendByte(0x47);//发送设备地址+读信号BH1750_RecvACK();BUF[0] = BH1750_RecvByte();//BUF[0]存储0x32地址中的数据BH1750_SendACK(0);BUF[1] = BH1750_RecvByte();//BUF[0]存储0x32地址中的数据BH1750_SendACK(1);BH1750_Stop();//停止信号HAL_Delay(5);
}//连续读出BH1750内部数据
void mread(void)
{u8 i=0;Single_Write_BH1750(0x01);// power onSingle_Write_BH1750(0x10);// H- resolution modeHAL_Delay(18);//延时18msMultiple_Read_BH1750();//连续读出数据,存储在BUF中
}/* 向onenet平台发数据函数* return 1 ok; 0 fail*/
uint8_t send_onenet(void)
{char text[200];uint8_t len;memset(text, 0, sizeof(text));//组包memset(text, 0, sizeof(text));sprintf(text, "bbbWenDu:%.2f C; ShiDu: %.2f %;  TuRang:%.2f %; GuangZhao:%d Lux;",temp, hump, check_hump, light);//封包len = strlen(text);HAL_UART_Transmit(&huart1, (uint8_t *)text, len, 0xFFFF); //发送HAL_Delay(1000);return 1;
}
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */uint32_t clk;tx_nbiot[0] = 0xff;tx_nbiot[1] = 0x74;tx_nbiot[13] = 0xff;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_ADC1_Init();MX_TIM1_Init();/* USER CODE BEGIN 2 */OLED_Init();OLED_ColorTurn(0);//OLED_DisplayTurn(0);//OLED_Refresh();OLED_Clear();OLED_ShowString(0,0,"TEMP:    .    C",16);OLED_ShowString(0,14,"HUMP:    .    %",16);OLED_ShowString(0,28,"GROUND:  .    %",16);OLED_ShowString(0,42,"LIGHT:      LUX",16);OLED_Refresh();/****dht11*****/uint8_t int_num = 3;while(int_num--) {HAL_Delay(500);DHT11_Init();}__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//open uart1 RXNE//Init_BH1750();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */check_hump = 4092-ADC_num;check_hump = (float)(check_hump/3292*100);//ad->hump%if((check_hump >= 0) && (check_hump <= 100)){intH = (int)check_hump;float hum_tmp = check_hump - intH;hum_tmp *= 100;decH = hum_tmp;tx_nbiot[6] = intH;tx_nbiot[7] = decH;}HAL_ADC_Start_IT(&hadc1);DHT11_Read_Data(&temperature,&humidity);
//        OLED_ShowNum(39,0,temperature>>8,4,12);
//        OLED_ShowNum(80,0,temperature&0xff,2,12);
//        OLED_ShowNum(39,2,humidity>>8,4,12);
//        OLED_ShowNum(80,2,humidity&0xff,2,12);tx_nbiot[2] = temperature>>8;tx_nbiot[3] = temperature&0xff;tx_nbiot[4] = humidity>>8;tx_nbiot[5] = humidity&0xff;temp = tx_nbiot[2]*100 + tx_nbiot[3];temp = temp/100;hump = tx_nbiot[4]*100 + tx_nbiot[5];hump = hump/100;
//        light_temp = GetLight();
//        light = light_temp;mread();light_temp = BUF[0];light_temp=(light_temp<<8)+BUF[1];//合成数据light=light_temp/1.2;OLED_ShowNum(53,0,tx_nbiot[2],2,16); //tempOLED_ShowNum(77,0,tx_nbiot[3],2,16);OLED_ShowNum(53,14,tx_nbiot[4],2,16);//humpOLED_ShowNum(77,14,tx_nbiot[5],2,16);OLED_ShowNum(53,28,tx_nbiot[6],2,16);//groundOLED_ShowNum(77,28,tx_nbiot[7],2,16);OLED_ShowNum(53,42,light,5,16);//LIGHTOLED_Refresh();tx_nbiot[8] = (light>>8)&0xff;tx_nbiot[9] = light&0xff;if(clk % 10 == 0) //send_onenet();//        if(rx_ok)
//        {//            //rx_order++;
//            rx_ok = 0;
//        }HAL_Delay(500);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);clk++;}/* USER CODE END 3 */
}

5、部分参考资料

合宙系统官网 http://erp.openluat.com/
DTU管理系统:https://dtu.yinerda.com/#/user/login
物理网卡管理:http://sim.openluat.com/

#电路板原理图 pcb见资料包

6、注意事项

#nbiot模块不用插卡,需要好好的配置一下

完整可运行项目地址

技能梳理24@stm32+阿里云+nbiot+dht11+bh1750+土壤湿度传感器+oled相关推荐

  1. 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

    技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器 1.项目简介 2.实现逻辑 3.应用场景 #主从机有线控制 #开关操作 4.核心代码梳理 //根据按下的按键执行相应的操作 void h ...

  2. 技能梳理21@stm32+oled+声音强度检测+舵机

    检测声音强度,显示大概的分贝数在oled上,不同强度下舵机转不同的角度 1.项目简介 2.实现逻辑 #通过STM32的adc检测大概声音强度 #在oled上显示声音强度 #舵机根据声音大小转动 3.应 ...

  3. 树莓派继电器控制水泵c语言,树莓派dht11,土壤湿度传感器,继电器的使用。树莓派云灌溉(二)...

    关于传感器的一些说明 我的想法是这样的 我尽量用易于理解的语言去说我的想法 首先,土壤湿度传感器和dh11会获取数据,然后树莓派会处理这些数据,读出土壤温湿度和空气温湿度,并将这些数据上传到云服务器, ...

  4. 技能梳理20@stm32+ESP8266+onenet+dht11+mq2+led+风扇+oled

    F103C8T6 ESP8266和ONENET通信 DHT11测温湿度 MQ-2测烟雾浓度 LED模拟室内灯 温湿度和烟雾超标,蜂鸣器报警,风扇转动:OLED显示数据:数据传输onenet,控制LED ...

  5. 技能梳理14@stm32+esp8266+ds18b20+红外传感器+烟雾传感器+CO传感器+蜂鸣器

    画板子,有至少8个io口(分别连ds18b20.红外传感器.烟雾传感器.CO传感器,后面3个传感器都是检测到就发高电平),2个串口,1个蜂鸣器,nbiot用的YED-C724 核心板(AIR724) ...

  6. 技能梳理18@stm32+柔性墨水屏+薄膜按键+二维码

    薄膜压力按键控制mos开关,切换给柔性墨水屏vcc供电方式,单片机控制vcc切换图像,其中有可以扫描的二维码 1.项目简介 2.实现逻辑 #有两个薄膜按键,一个控制墨水屏供电方式(其实就是一个继电器) ...

  7. 技能梳理15@stm32+lora(sx1276)+oled+ds18b20+土壤湿度传感器+按键+蜂鸣器+电路板

    从机采集温湿度及超标报警并显示在oled屏幕上,按下按键通过lora模块传输给主机,主机再也显示在其搭载的屏幕上 1.项目简介 2.实现逻辑 #从机实现对温湿度数据的检测 #从机将数据显示到oled上 ...

  8. 技能梳理7@stm32+OLED+flash掉电保存+按键

    学校违纪分数记录,按键,1.3寸OLED显示,数据掉电保存 1.项目简介 2.实现逻辑 #如上图为显示屏显示内容 #三个物理按键,一个是选择对哪一项进行控制,两个是加减对应项的分数 #控制范围±10, ...

  9. 阿里云助力Today便利店点亮温暖城市的梦想!

     摘要:24小时的便利店,如何才能开在最需要的地方,让"便利"真正触手可及?本文将带领大家了解阿里云智能选址解决方案是如何通过大数据和智能算法赋能,让机器"选址专家&qu ...

  10. 9张图总结一下阿里云的2019

    9月25日云栖大会,阿里云智能总裁张建锋展示了阿里巴巴第一颗自研芯片--含光800,打破了两项世界纪录,性能和能效比均为第一,是全球最强的AI推理芯片. 张建锋说:"在全球芯片领域,阿里巴巴 ...

最新文章

  1. enspar启动失败40_负债80万开始爆仓,快40岁的人了没钱创业,精神恍惚该怎么翻身?...
  2. 【JVM】Java对象创建的流程步骤
  3. 计算机的相关配置信息,win7系统查看电脑配置相关信息的方案介绍
  4. 检索数据_3_查询满足某个条件行
  5. mousemove事件java,three.js,补间相机和mousemove事件
  6. mongodb查询文件服务器的数据,服务器端知识库mongodb基础篇
  7. ES6函数参数的解构赋值,以及2种设置参数默认值方法的区别
  8. 求字符串中对称的子字符串的最大长度
  9. HTML5与传统HTML的区别
  10. python之pdf分页
  11. 机器学习,深度学习,免费数据集汇总
  12. 一些与一对一视频聊天软件开发有关的事,也许你该了解的
  13. python3爬取网易云歌曲,利用python3爬取网易云周杰伦所有专辑,歌曲,评论,并完成可视-站长资讯中心...
  14. 个人NAS家庭服务器解决方案概况
  15. Hash Animation Master 19.0h 特别版 Mac 3D动画制作软件
  16. 计算机以及dos窗口常用快捷键
  17. Openharmony应用NAPI详解--基础篇
  18. FastRule: Efficient Flow Entry Updates for TCAM-based OpenFlow Switches(一)
  19. 想哪写哪_随笔20191130
  20. Numpy给数组增加维度的操作

热门文章

  1. 微信支付sdk部署在服务器,android接入微信支付SDK
  2. 【B类】BI商业智能、大数据、Mysql、等系列课程集
  3. AutoLayout(Ⅱ):遇到的几个小问题(Keng)
  4. 时间转换中的夏时制问题
  5. Failure recovering jobs: Lock wait timeout exceeded; try restarting transaction
  6. iio Engine 1
  7. 如何使用Visual Studio查看源代码
  8. mysql查询耗时操作_mysql记录耗时的sql实例详解
  9. css实现单色或图片背景透明,而文字不透明的方法
  10. 疯狂ios讲义之疯狂打飞机(2)