找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STM32+DHT22+BH1750+8266透传数据到远端网络服务器

[复制链接]
山海致远 发表于 2020-5-24 17:13:36 | 显示全部楼层 |阅读模式
最近在玩STM32,索性写点笔记,加深印象,或者有助于新人摸索参考,不多说,进入正题。
单片机:STM32F407
模块:8266
模块:DHT22
模块:BH1750
BH1750:I2C通讯,关于I2C通讯的过程,我这里就不多说,直接说驱动的步骤:
1、总线初始化;
2、向传感器发送写信号,然后配置分辨率;
3、向传感器发送设备地址和读信号;
4、读数据;
很简单,具体代码见附件。

DHT22:这个用的是单总线的通讯方式,个人感觉最关键的点有2个:1、发送初始信号前要延时至少3S以上,等待电压稳定,防止电压抖动;2、器件手册上的时序;

8266:这个比较简单,采用的是AT指令的模式,光看代码就能看懂。
上结果吧:
+-------------+----------+-----------------+---------+---------+------------------+------+------+
| temperature | humidity | light_intensity | current | voltage | time             | id   | date |
+-------------+----------+-----------------+---------+---------+------------------+------+------+
| 27.30       | 33.80    | 5759            | 0.00    | 0.00    | 2020-04-28 13:50 |    1 | NULL |
| 26.90       | 34.20    | 4294            | 0.00    | 0.00    | 2020-04-28 14:00 |    2 | NULL |
| 26.60       | 34.30    | 6185            | 0.00    | 0.00    | 2020-04-28 14:10 |    3 | NULL |
| 26.60       | 34.40    | 5759            | 0.00    | 0.00    | 2020-04-28 14:20 |    4 | NULL |
| 26.50       | 34.70    | 5376            | 0.00    | 0.00    | 2020-04-28 14:30 |    5 | NULL |
+-------------+----------+-----------------+---------+---------+------------------+------+------+

部分源程序如下:
  1. //*******************************************************
  2. //BH1750FVI光照强度
  3. //时间: 2020.4
  4. //*******************************************************
  5. #include "myiic.h"
  6. #include "delay.h"
  7. #include "bh1750.h"
  8. #include "common.h"

  9. void Cmd_Send_BH1750(u8 cmd)
  10. {
  11.     IIC_Start();
  12.    
  13.   IIC_Send_Byte(BH1750_Addr_Write);   //发送设备地址+写信号
  14.     while(IIC_Wait_Ack())
  15.     {;};
  16.    
  17.   IIC_Send_Byte(cmd);    //写数据到内部寄存器地址
  18.     while(IIC_Wait_Ack())
  19.     {;};
  20.    
  21.     IIC_Stop();
  22. }

  23. void BH1750_Start(void)
  24. {

  25.     Cmd_Send_BH1750(BH1750_ON);
  26.     Cmd_Send_BH1750(BH1750_RSET);
  27.     Cmd_Send_BH1750(BH1750_OFF);
  28.    
  29. }

  30. u8 BH1750_RecvByte(void)
  31. {
  32.     u8 i;
  33.     u8 dat = 0;
  34.     SDA_IN();   
  35.     //使能内部上拉,准备读取数据,
  36.     for (i=0; i<8; i++)         //8位计数器
  37.     {
  38.         dat <<= 1;
  39.         IIC_SCL = 1;                //拉高时钟线
  40.         delay_us(5);             //延时
  41.         dat |= READ_SDA;             //读数据               
  42.         IIC_SCL = 0;                //拉低时钟线
  43.         delay_us(5);             //延时
  44.     }
  45.     return dat;
  46. }

  47. /**************************************
  48. 发送应答信号
  49. 入口参数:ack (0:ACK 1:NAK)
  50. **************************************/
  51. void BH1750_SendACK(u8 ack)
  52. {
  53.     SDA_OUT();
  54.   IIC_SDA = ACK;                  //写应答信号
  55.   IIC_SCL = 1;                    //拉高时钟线
  56.   delay_us(5);                 //延时
  57.   IIC_SCL = 0;                    //拉低时钟线
  58.   delay_us(5);                 //延时
  59. }
  60. int BH1750_Read(void)
  61. {

  62.     u8 BUF[3]={0};
  63.     u16 result=0;
  64.     u8 i=0;
  65.    
  66.     //BH1750_Start();
  67.         
  68.     IIC_Start();
  69.    
  70.     IIC_Send_Byte(BH1750_Addr_Write);   //发送设备地址+写信号
  71.     while(IIC_Wait_Ack())
  72.   {;};
  73.         
  74.     IIC_Send_Byte(BH1750_CON_1);
  75.     while(IIC_Wait_Ack())
  76.     {;};
  77.    
  78.     IIC_Stop();
  79.     delay_ms(180);
  80.         
  81.     IIC_Start();
  82.         
  83.     IIC_Send_Byte(BH1750_Addr_Read);        //发送设备地址+读信号
  84.     while(IIC_Wait_Ack())
  85.     {;};

  86.     for (i=0; i<2; i++)                    //连续读取6个地址数据,存储中BUF
  87.   {
  88.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
  89.     if (i == 2)
  90.     {
  91.             BH1750_SendACK(1);                //最后一个数据需要回NOACK
  92.             IIC_Stop();
  93.             
  94.     }
  95.     else
  96.     {        
  97.             BH1750_SendACK(0);                //回应ACK
  98.     }
  99.     }
  100.    
  101.   delay_ms(5);
  102.     result = BUF[0];
  103.     light_intensity = ((result<<8)+BUF[1])/1.2;
  104.     light_intensity = light_intensity - (light_intensity%1);
  105.     return light_intensity;
  106. }

复制代码
其他关键部分代码.rar (4.53 KB, 售价: 1 E币)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-11-21 19:15

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表