项目里需要获得光照强度,之前用的是光敏电阻,但是光敏电阻实在不精确,换用BH1750数字光照传感器。网上购买后,送的资料都是单片机的,移植到ZigBee协议栈里面,时序有些问题,在网上找的一些资料,很杂乱。主要出现两个问题:一、读取不到数据;二、读取到的数据是乱的。

仔细研究之后,发现,第一个问题读不到数据,八成是延时函数有差别;第二个问题,一直以为是时序的问题,纠结了很久还是没弄好,后来突然想把数据处理的地方单独弄出来测试,结果正是这里,采集到数据,转为字符串的时候,数据类型跟所需要的数据类型有差,最大范围不同,可能每个人宏或者自定义的数据类型都不太一样,所以移植过来的时候,虽然名字一样,但是实际上定义的时候不一样,导致使用的时候不容易发现问题。

下面贴上代码。(之前在网上看到别人做的bh1750,想问他买代码,结果告诉我一个代码要我80,瞬间无语,还好自己弄出来了 ,共享给大家,也给自己提个醒,最是觉得没有问题的地方,往往就是问题所在,需时刻抱有怀疑的态度)

BH1750.h:

#ifndef __BH1750_H
#define __BH1750_H#include <ioCC2530.h>#define st(x)      do { x } while (__LINE__ == -1)
#define HAL_IO_SET(port, pin, val)        HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val)   st( P##port##_##pin## = val; )
#define HAL_IO_GET(port, pin)   HAL_IO_GET_PREP( port,pin)
#define HAL_IO_GET_PREP(port, pin)   ( P##port##_##pin)#define LIGHT_SCK_0()         HAL_IO_SET(1,3,0)
#define LIGHT_SCK_1()         HAL_IO_SET(1,3,1)
#define LIGHT_DTA_0()         HAL_IO_SET(1,1,0)
#define LIGHT_DTA_1()         HAL_IO_SET(1,1,1)#define LIGHT_DTA()          HAL_IO_GET(1,1)
#define LIGHT_SCK()          HAL_IO_GET(1,3)#define SDA_W() (P1DIR |=(1 << 1)  )
#define SDA_R() (P1DIR &=~(1 << 1) )#define LIGHT_INIT()                           \
do{                                            \P1SEL &= ~0x08;                        \P1DIR |=0x08;                           \P1_3 = 1;                                  \\P1SEL &= ~0x02;                        \P1DIR |= 0x02;                         \P1_1 = 1;                                \
}while(0)extern unsigned short get_light(void);#endif // __BH1750_H

BH1750.c:

#include "BH1750.h"
#include "OnBoard.h"void halMcuWaitUs(uint16 usec)
{while(usec--){asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");}
}
//以ms延时
void halMcuWaitMs(uint16 msec)
{while(msec--)halMcuWaitUs(1000);
}void delay_us()
{halMcuWaitUs(1);// MicroWait(1);
}
void delay_5us()
{halMcuWaitUs(5);//MicroWait(5);
}
void delay_10us()
{halMcuWaitUs(10);//MicroWait(10);
}
void delay_nms(int n)
{halMcuWaitMs(n);
}
/****************************/
static void start_i2c(void)
{SDA_W() ;LIGHT_DTA_1();//LIGHT_SCK_1() ;//delay_us() ;LIGHT_DTA_0() ;delay_us()  ;LIGHT_SCK_0() ;delay_us()  ;//delay()  ;
}static void stop_i2c(void)
{SDA_W() ;LIGHT_DTA_0() ;delay_us();LIGHT_SCK_1() ;delay_us();LIGHT_DTA_1() ;delay_us();LIGHT_SCK_0() ;delay_us();
}
static char i2c_send(unsigned char val)
{int i;char error=0;SDA_W();for(i=0x80;i>0;i/=2){if(val&i)LIGHT_DTA_1();elseLIGHT_DTA_0();delay_us();LIGHT_SCK_1() ; delay_us();LIGHT_SCK_0() ;delay_us();                    }LIGHT_DTA_1();SDA_R();delay_us();//delay_us();LIGHT_SCK_1() ; delay_us();if(LIGHT_DTA())error=1;delay_us();LIGHT_SCK_0() ;return error;}
static char i2c_read(char ack)
{int i;char val=0;LIGHT_DTA_1();//SDA_R();for(i=0x80;i>0;i/=2){LIGHT_SCK_1() ;delay_us();SDA_R();//SDA_W();//LIGHT_DTA_0();//LIGHT_DTA_0() ;//delay_us();if(LIGHT_DTA())val=(val|i);delay_us();//SDA_R();LIGHT_SCK_0() ;delay_us();}SDA_W();if(ack)LIGHT_DTA_0();elseLIGHT_DTA_1();delay_us();LIGHT_SCK_1() ;delay_us();LIGHT_SCK_0() ;LIGHT_DTA_1();return val;}
unsigned short get_light(void)
{        unsigned char ack1=1;unsigned char ack2=1;unsigned char ack3=1;unsigned char ack4=1;unsigned char ack5=1;unsigned char ack6=1;unsigned char ack7=1;unsigned char t0;unsigned char t1;unsigned short t;P1DIR |= (1 << 1);delay_nms(200);start_i2c();ack1=i2c_send(0x46);if(ack1)return 255;ack2=i2c_send(0x01);if(ack2)return 254;stop_i2c();           //initstart_i2c();ack3=i2c_send(0x46);if(ack3)return 253;ack4=i2c_send(0x01);if(ack4)return 252;stop_i2c();//powerstart_i2c();ack5=i2c_send(0x46);if(ack5)return 251;ack6=i2c_send(0x10);if(ack6)return 250;stop_i2c();                     delay_nms(1500);start_i2c();ack7=i2c_send(0x47);if(ack7)return 249;t0 = i2c_read(1);t1 = i2c_read(0);stop_i2c();t =  ((short)t0)<<8;t |= t1;return t;
}

在主函数中加入以下函数(注意,此处就是最容易忽视的地方,uint应该是unsigned int,不能是范围太小的类型):

char wan,qian,bai,shi,ge;void conversion(unsigned int temp_data)
{wan=(uint)temp_data/10000 ;temp_data=temp_data%10000; qian=(uint)temp_data/1000 ;temp_data=temp_data%1000;  bai=(uint)temp_data/100;temp_data=temp_data%100;    shi=(uint)temp_data/10;temp_data=temp_data%10;      ge=(uint)temp_data;
}

调用光照获取函数,讲数据转为字符串:

uint32 w;w = get_light()/1.2;conversion(w);char buf[5];buf[0] = wan + 48;buf[1] = qian + 48;buf[2] = bai + 48;buf[3] = shi + 48;buf[4] = ge + 48;

得到字符数组后,就很随意了。

CC2530下ZigBee协议栈中添加BH1750数字光照传感器相关推荐

  1. 二.了解zigbee协议栈中几个常用语句

    二.了解zigbee协议栈中几个常用语句 我在上一篇文章中说到过,zigbee作为一门通信技术,关键我们是要让它组起网来,虽然我们很多的实现还是用单片机的底板实现的:但要明白我们学习的核心在哪?在协议 ...

  2. Windows10下git bash中添加wget下载工具

    Windows10下git bash中添加wget下载工具 文章目录: 一.说明 二.wget安装包的下载 三.添加环境变量 一.说明 Windows中git bash完全可以替代原生的cmd,而且更 ...

  3. Windows下在GoldenDict中添加谷歌翻译

    Windows下在GoldenDict中添加谷歌翻译 [2021.7 更新] 笔者阅读论文时,希望以Popup的形式直接显示出Google翻译的结果,减少阅读论文的碎片感. GoldenDict是一款 ...

  4. comboBox控件下拉选项中添加图片

    comboBox下拉选项中添加图片 1.将需要添加的图片加入到imageList中 2.循环图片清单,将图片绘入comboBox中,代码如下: private void FormMain_Load(o ...

  5. 51lcd显示光传感器c语言程序,基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例...

    基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例,系统由GY-30数字光照传感器.51单片机最小系统.1602液晶显示屏组成,电路简单,附件中的程序是实物验证过了的.1 ...

  6. 服务中添加mysql服务_Windows平台下在服务中添加MySQL

    widows下查看服务 1.桌面计算机-->右键-->管理-->计算机管理(本地)--->服务和应用程序-->服务 2.运行 中输入 services.msc 在服务中添 ...

  7. Ubuntu 9.10下在右键中添加以管理员身份打开,在终端中打开

    在使用Linux时经常需要管理员权限, 经常需要再终端中操作, 如果把他们加入右键那就方便多了. 不多说, 方法如下: 右键中添加"以管理员身份打开" 在终端输入  sudo ap ...

  8. BH1750( GY-302 )光照传感器

    文章目录 一.产品简介 二.IIC通信 三.BH1750的使用 四.程序源码 这里我先简单的介绍一下BH1750光照传感器模块的基本信息(不多废话),我将着重讲解它的使用部分,相信对于屏幕前的你也是更 ...

  9. Zigbee协议栈中OSAL的运行机理

    OSAL的运行机理 事件表 函数表 使用查表法来取得事件所对应函数 taskCnt  任务总数 taskEvents 指向事件表首地址的指针 taskArr 事件处理函数数组,每一项都是一个函数指针 ...

最新文章

  1. JVM实用参数 GC日志
  2. 中国 12 个工科世界第一,网友:全是不吃香的|软科 2021 世界一流学科排名
  3. canvas绘制圆形
  4. SpringMVC:学习笔记(4)——处理模型数据
  5. struts2的OGNL表达式(三)
  6. 初学Java ssh之Spring 第二篇
  7. C++函数概念解析(2)
  8. Portal-Basic Java Web 应用开发框架:应用篇(十四) —— 异步 Action
  9. Nutch1.2二次开发详细攻略(一)【图文】------Windows平台下Cygwin环境的搭建
  10. JDK下载安装及环境变量配置的图文教程(详解)
  11. C/C++ 用zlib解压gzip文件
  12. 移动终端安全问题分析与解决方案研究
  13. rds mysql 导出数据文件_rds数据库导出
  14. Linux添加路由的方法
  15. Win10 Ubuntu16.04 时间同步问题
  16. 智能客服机器人的场景应用及功能有哪些
  17. 电磁波的达朗贝尔方程 工程电磁场P25
  18. Spring中常用的SpEl表达式
  19. 警告: 检测到依赖关系环:_软件设计:依赖关系
  20. 实战 | 如何利用 Scrapy 编写一个完整的爬虫!

热门文章

  1. Springboot如何引入外部jar包
  2. Excel:如何算出重复次数。
  3. Debian11之Rancher2.7.x安装
  4. linux蓝牙hcd,Ubuntu下蓝牙设置
  5. Linux下面C语言多文件编译
  6. a8 内存 华硕k550d_A8-5550M能逆袭么? 华硕K550D新本评测
  7. SpringMVC项目中HTML页面中引入js
  8. 人脸识别有趣应用1——给自己带上胡子墨镜和帽子
  9. 比 SQL 还好用,又一门国产数据库语言诞生了
  10. 小型机和PC服务器到底有什么区别?(摘自走入小型机世界-orian)