初出茅庐的小李第114篇博客项目笔记之机智云智能浇花器实战(3)-基础Demo实现
时间:2022-09-18 20:00:00
智能云智能浇花器实战(3)-基础Demo实现
链接:智能云智能浇花器实战(2)-基础Demo实现
BH1750光照传感器原理图
BH1750传感器代码
#include "bh1750.h" #include "delay.h" uint8_t BUF[8]; //接收数据缓存区 int mcy; ///进位标志 /***开始信号***/ void BH1750_Start() {
BH1750_SDA_H; ///提高数据线 BH1750_SCL_H; //提高时钟线 Delay_nus(5); //延时 GPIO_ResetBits(BH1750_PORT, BH1750_SDA_PIN); //产生下降边 Delay_nus(5); //延时 GPIO_ResetBits(BH1750_PORT, BH1750_SCL_PIN); //拉低时钟线 } /*****停止信号******/ void BH1750_Stop() {
BH1750_SDA_L; ///拉低数据线 BH1750_SCL_H; //提高时钟线 Delay_nus(5); //延时 GPIO_SetBits(BH1750_PORT, BH1750_SDA_PIN); //产生上升沿 Delay_nus(5); //延时 } /************************************** 发送响应信号 入口参数:ack (0:ACK 1:NAK) **************************************/ 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
= BH1750_SDA_PIN
;
GPIO_Init
(BH1750_PORT
,
&GPIO_InitStruct
)
;
if
(ack
==
1
)
//写应答信号 BH1750_SDA_H
;
else
if
(ack
==
0
) BH1750_SDA_L
;
else
return
; BH1750_SCL_H
;
//拉高时钟线
Delay_nus
(
5
)
;
//延时 BH1750_SCL_L
;
//拉低时钟线
Delay_nus
(
5
)
;
//延时
}
/************************************** 接收应答信号 **************************************/
int
BH1750_RecvACK
(
)
{
GPIO_InitTypeDef GPIO_InitStruct
; GPIO_InitStruct
.GPIO_Mode
=GPIO_Mode_IPU
;
/*这里一定要设成输入上拉,否则不能读出数据*/ GPIO_InitStruct
.GPIO_Speed
=GPIO_Speed_50MHz
; GPIO_InitStruct
.GPIO_Pin
=BH1750_SDA_PIN
;
GPIO_Init
(BH1750_PORT
,
&GPIO_InitStruct
)
; BH1750_SCL_H
;
//拉高时钟线
Delay_nus
(
5
)
;
//延时
if
(
GPIO_ReadInputDataBit
(BH1750_PORT
,BH1750_SDA_PIN
)
==
1
)
//读应答信号 mcy
=
1
;
else mcy
=
0
; BH1750_SCL_L
;
//拉低时钟线
Delay_nus
(
5
)
;
//延时 GPIO_InitStruct
.GPIO_Mode
=GPIO_Mode_Out_PP
;
GPIO_Init
(BH1750_PORT
,
&GPIO_InitStruct
)
;
return mcy
;
}
/************************************** 向IIC总线发送一个字节数据 **************************************/
void
BH1750_SendByte
(
uint8_t dat
)
{
uint8_t i
;
for
(i
=
0
; i
<
8
; i
++
)
//8位计数器
{
if
(
0X80
& dat
)
GPIO_SetBits
(BH1750_PORT
,BH1750_SDA_PIN
)
;
else
GPIO_ResetBits
(BH1750_PORT
,BH1750_SDA_PIN
)
; dat
<<=
1
; BH1750_SCL_H
;
//拉高时钟线
Delay_nus
(
5
)
;
//延时 BH1750_SCL_L
;
//拉低时钟线
Delay_nus
(
5
)
;
//延时
}
BH1750_RecvACK
(
)
;
}
uint8_t
BH1750_RecvByte
(
)
{
uint8_t i
;
uint8_t dat
=
0
;
uint8_t bit
; GPIO_InitTypeDef GPIO_InitStruct
; GPIO_InitStruct
.GPIO_Mode
= GPIO_Mode_IPU
;
/*这里一定要设成输入上拉,否则不能读出数据*/ GPIO_InitStruct
.GPIO_Pin
= BH1750_SDA_PIN
; GPIO_InitStruct
.GPIO_Speed
= GPIO_Speed_50MHz
;
GPIO_Init
(BH1750_PORT
,
&GPIO_InitStruct
)
;
GPIO_SetBits
(BH1750_PORT
,BH1750_SDA_PIN
)
;
//使能内部上拉,准备读取数据,
for
(i
=
0
; i
<
8
; i
++
)
//8位计数器
{
dat
<<=
1
; BH1750_SCL_H
;
//拉高时钟线
Delay_nus
(
5
)
;
//延时
if
( SET
==
GPIO_ReadInputDataBit
(BH1750_PORT
,BH1750_SDA_PIN
)
) bit
=
0X01
;
else bit
=
0x00
; dat
|= bit
;
//读数据 BH1750_SCL_L
;
//拉低时钟线
Delay_nus
(
5
)
;
//延时
} GPIO_InitStruct
.GPIO_Mode
= GPIO_Mode_Out_PP
;
GPIO_Init
(BH1750_PORT
,
&GPIO_InitStruct
)
;
return dat
;
}
void
Single_Write_BH1750
(
uint8_t REG_Address
)
{
BH1750_Start
(
)
;
//起始信号
BH1750_SendByte
(SlaveAddress
)
;
//发送设备地址+写信号
BH1750_SendByte
(REG_Address
)
;
//内部寄存器地址,请参考中文pdf22页
// BH1750_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
BH1750_Stop
(
)
;
//发送停止信号
}
//初始化BH1750,根据需要请参考pdf进行修改****
void
BH1750_Init
(
)
{
GPIO_InitTypeDef GPIO_InitStruct
;
/*开启GPIOB的外设时钟*/
RCC_APB2PeriphClockCmd
( RCC_APB2Periph_GPIOB
, ENABLE
)
; GPIO_InitStruct
.GPIO_Mode
= GPIO_Mode_Out_PP
; GPIO_InitStruct
.GPIO_Speed
= GPIO_Speed_50MHz
; GPIO_InitStruct
.GPIO_Pin
= BH1750_SDA_PIN
| BH1750_SCL_PIN
;
GPIO_Init
(BH1750_PORT
,
&GPIO_InitStruct
)
;
Single_Write_BH1750
(
0x01
)
;
Delay_nms
(
180
)
;
//延时180ms
}
//连续读出BH1750内部数据
void
mread
(
void
)
{
uint8_t 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_nms
(
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_nms
(
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
;
return temp1
;
}
#ifndef __BH1750_H__
#define __BH1750_H__
#include "stm32f10x.h"
/* 定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 ALT ADDRESS引脚接地时地址为0x46, 接电源时地址为0xB8 */
#define SlaveAddress 0x46
#define BH1750_PORT GPIOB
#define BH1750_SCL_PIN GPIO_Pin_1
#define BH1750_SDA_PIN GPIO_Pin_0
#define BH1750_SCL_H GPIO_SetBits(BH1750_PORT,BH1750_SCL_PIN)
#define BH1750_SCL_L GPIO_ResetBits(BH1750_PORT,BH1750_SCL_PIN)
#define BH1750_SDA_H GPIO_SetBits(BH1750_PORT,BH1750_SDA_PIN)
#define BH1750_SDA_L GPIO_ResetBits(BH1750_PORT,BH1750_SDA_PIN)
extern uint8_t BUF[8]; //接收数据缓存区
extern int dis_data; //变量
extern int mcy; //表示进位标志位
void BH1750_Init(void);
void conversion(uint32_t temp_data);
void Single_Write_BH1750(uint8_t REG_Address); //单个写入数据
uint8_t Single_Read_BH1750(uint8_t REG_Address); //单个读取内部寄存器数据
void mread(void); //连续的读取内部寄存器数据
float Read_BH1750(void);
#endif
BH1750传感器代码说明
经过核心板单独测试程序在PB0 PB1管脚是完全正常,不知道是不是核心板的PB2上接了什么暂时还未排查出来问题,如果你是用开发板或者是自己设计的项目板的话,那么程序是直接可以使用的 程序依然按照PB0 PB1保留
理论上SCL SDA这两个GPIO管脚是任意的就可以实现这是第二个bug了,手动捂脸
显示数据不准,原因:硬件数据线接口是PB2,代码是PB0(下次修改)
机智云数据点创建
机智云官方网站
https://www.gizwits.com/
创建自己的产品
创建好后就会有基本信息
Product Key
Product Secret
这两个信息比较重要 最好是保存下来
Product Key :9c8a5a8e38344fb4af14b6db0f5b1df7
Product Secret :45c86d8c6a2a4b1dac7d68df54f6e4f0
定义自己的数据点
只读:就是只允许赋值数据 传感器赋值给平台 平台只能读取
可写:就是数据可以被修改 继电器的开关状态 平台可以修改
MCU开发
mcu开发注意事项 平台选Common 其实就是STM32F103x平台
生成代码包
下载自动生成的代码包
机智云 Gizwits协议移植
这两个文件夹要添加到自己的工程
这是添加的文件夹以及文件的目录
修改gizwits_product.c
#include
#include
#include "gizwits_product.h"
#include "usart3.h"
static uint32_t timerMsCount;
uint8_t aRxBuffer;
dataPoint_t currentDataPoint;
uint8_t wifi_flag;
//存放事件处理API接口函数
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
{
uint8_t i = 0;
dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;
moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;
protocolTime_t *ptime = (protocolTime_t *)gizdata;
#if MODULE_TYPE
gprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
#else
moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
#endif
if((NULL == info) || (NULL == gizdata))
{
return -1;
}
for(i=0; i<info->num; i++)
{
switch(info->event[i])
{
case EVENT_Relay_1:
currentDataPoint.valueRelay_1 = dataPointPtr->valueRelay_1;
GIZWITS_LOG("Evt: EVENT_Relay_1 %d \n", currentDataPoint.valueRelay_1);
if(0x01 == currentDataPoint.valueRelay_1)
{
currentDataPoint.valueRelay_1 = 1;
}
else
{
currentDataPoint.valueRelay_1 = 0;
}
break;
case WIFI_SOFTAP:
break;
case WIFI_AIRLINK:
break;
case WIFI_STATION:
break;
case WIFI_CON_ROUTER:
break;
case WIFI_DISCON_ROUTER:
break;
case WIFI_CON_M2M:
wifi_flag = 1; //WiFi连接标志
break;
case WIFI_DISCON_M2M:
wifi_flag = 0; //WiFi断开标志
break;
case WIFI_RSSI:
GIZWITS_LOG("RSSI %d\n", wifiData->rssi);
break;
case TRANSPARENT_DATA:
GIZWITS_LOG("TRANSPARENT_DATA \n");
//user handle , Fetch data from [data] , size is [len]
break;
case WIFI_NTP:
GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);
break;
case MODULE_INFO:
GIZWITS_LOG("MODULE INFO ...\n");
#if MODULE_TYPE
GIZWITS_LOG("GPRS MODULE ...\n");
//Format By gprsInfo_t
#else
GIZWITS_LOG("WIF MODULE ...\n");
//Format By moduleInfo_t
GIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);
#endif
break;
default:
break;
}
}
return 0;
}
void userHandle(void)
{
/* currentDataPoint.valueTemp = ;//Add Sensor Data Collection currentDataPoint.valueHumi = ;//Add Sensor Data Collection currentDataPoint.valueLight_Intensity = ;//Add Sensor Data Collection */
}
void userInit(void)
{
memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));
currentDataPoint.valueRelay_1 = 0;
currentDataPoint.valueTemp = 0;
currentDataPoint.valueHumi = 0;
currentDataPoint.valueLight_Intensity = 0;
}
void gizTimerMs(void)
{
timerMsCount++;
}
uint32_t gizGetTimerCount(void)
{
return timerMsCount;
}
void mcuRestart(void)
{
__set_FAULTMASK(1);
NVIC_SystemReset();
}
void TIMER_IRQ_FUN(void)
{
gizTimerMs();
}
void UART_IRQ_FUN(void)
{
uint8_t value = 0;
gizPutData(&value, 1);
}
int32_t uartWrite(uint8_t *buf, uint32_t len)
{
uint32_t i = 0;
if(NULL == buf)
{
return -1;
}
for(i=0; i<len; i++)
{
USART_SendData(USART3,buf[i]);
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); //循环发送,直到发送完毕
if(i >=2 && buf[i] == 0xFF)
{
USART_SendData(USART3, 0x55);
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); //循环发送,直到发送完毕
}
}
return len;
}
修改
#ifndef _GIZWITS_PRODUCT_H #define _GIZWITS_PRODUCT_H #ifdef __cplusplus extern "C" { #endif #include
//#include "stm32f1xx.h" #