前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开发者成长激励计划-基于TencentOS Tiny 的智慧路灯

开发者成长激励计划-基于TencentOS Tiny 的智慧路灯

原创
作者头像
秦玉安
修改2022-08-03 22:07:30
6921
修改2022-08-03 22:07:30
举报
文章被收录于专栏:IoT闲聊

1:硬件环境

img
img

2:主芯片原理图

image.png
image.png

3:软件开发环境

开发环境使用MounRiver_Studio_Setup_V180,安装后界面:

image.png
image.png

4:ESP8266-12F固件更新

由于需要理解腾讯云平台,所以需要更新腾讯云固件,使用乐鑫公司出的固件更新工具。

image.png
image.png

固件名字叫:

代码语言:txt
复制
QCloud_IoT_AT_ESP8266_v2.1.1_20200903_UART_1_3.bin

5:编写和调试代码

从github上下载官方的Tencent OS Tiny 例程。CH32V-RISC-V物联网操作系统TencentOS-Tiny案例实践指南。

代码语言:txt
复制
https://github.com/OpenAtomFoundation/TencentOS-tiny

打开clone下来的整个代码仓源码,进入 <TencentOS-tiny\board\TencentOS_Tiny_CH32V307_EVB> 目录,打开CH32V_EVB_TencentOS_Tiny_IoT_Explorer工程。

5.1:添加BH1750驱动函数

编写代码之前,先查看硬件原理图接口:

image.png
image.png
image.png
image.png

IIC接口使用的是PB10和PB11

代码语言:txt
复制
#ifndef __BH1750_H__
#define __BH1750_H__

#include "debug.h"
					
#define uchar unsigned char 
#define uint  unsigned int

#define sda   GPIO_Pin_11    //PB11
#define scl   GPIO_Pin_10    //PB10

#define	  SlaveAddress   0x46   //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
                                //ALT  ADDRESS引脚接地时地址为0x46,接电源时地址为
															
extern uchar    BUF[8];                         //接收数据缓存区      	
extern int      dis_data;                       //变量
extern int      mcy;              //表示进位标志位

void Init_BH1750(void);
void conversion(uint temp_data);
void  Single_Write_BH1750(uchar REG_Address);//单个写入数据
uchar Single_Read_BH1750(uchar REG_Address);   //单个读取内部寄存器数据
void  mread(void);         //连续的读取内部寄存器数据

void Delay_5us(void);
void Delay_mms(uint16_t tmp);
void BH1750_GPIO_Config(void);
void  Get_Illu_Task(void);
unsigned int  Read_BH1750(void);//读取光度值

#endif
代码语言:txt
复制
#include "bh1750.h"
#include <math.h>
#include "stdio.h"


unsigned char    BUF[8];                         //接收数据缓存区
int     dis_data;                       //变量
int     mcy;

void BH1750_GPIO_Config(void)
{ 
    GPIO_InitTypeDef GPIO_InitStruct;
    /*开启GPIOB的外设时钟*/ 
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 
  
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Pin = sda | scl ;
    GPIO_Init(GPIOB, &GPIO_InitStruct); 
}

void Delay_5us(void)
{
    Delay_Us(5);
}

void Delay_mms(uint16_t tmp)
{
    Delay_Ms(tmp);
}

/***开始信号***/
void BH1750_Start()
{
    GPIO_SetBits(GPIOB, sda);                    //拉高数据线
    GPIO_SetBits(GPIOB, scl);                   //拉高时钟线
    Delay_5us();                 //延时
    GPIO_ResetBits(GPIOB, sda);                    //产生下降沿
    Delay_5us();                 //延时
    GPIO_ResetBits(GPIOB, scl);                    //拉低时钟线
}

/*****停止信号******/
void BH1750_Stop()
{
    GPIO_ResetBits(GPIOB, sda);                   //拉低数据线
    GPIO_SetBits(GPIOB, scl);                      //拉高时钟线
    Delay_5us();                 //延时
    GPIO_SetBits(GPIOB, sda);                    //产生上升沿
    Delay_5us();                 //延时
}

/**************************************
发送应答信号
入口参数: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 = sda;
    GPIO_Init(GPIOB, &GPIO_InitStruct);  
	
	
    if(ack == 1)   //写应答信号
			GPIO_SetBits(GPIOB, sda); 
		else if(ack == 0)
			GPIO_ResetBits(GPIOB, sda); 
		else
			return;
			
    GPIO_SetBits(GPIOB, scl);     //拉高时钟线
    Delay_5us();                 //延时
    GPIO_ResetBits(GPIOB, scl);      //拉低时钟线
    Delay_5us();                 //延时
}

/**************************************
接收应答信号
**************************************/
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 = sda;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
	
    GPIO_SetBits(GPIOB, scl);            //拉高时钟线
    Delay_5us();                 //延时
	
	  if(GPIO_ReadInputDataBit( GPIOB, sda ) ==1 )//读应答信号
        mcy = 1 ;  
    else
        mcy = 0 ;			
	
    GPIO_ResetBits(GPIOB, scl);                    //拉低时钟线
    Delay_5us();                 //延时
  
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init( GPIOB, &GPIO_InitStruct );
	
    return mcy;
}

/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(uchar dat)
{
    uchar i;

    for (i=0; i<8; i++)         //8位计数器
      {
				if( 0X80 & dat )
          GPIO_SetBits( GPIOB, sda);
        else
          GPIO_ResetBits( GPIOB, sda);
			 
       dat <<= 1;
        GPIO_SetBits(GPIOB, scl);               //拉高时钟线
        Delay_5us();             //延时
        GPIO_ResetBits(GPIOB, scl);                //拉低时钟线
        Delay_5us();             //延时
      }
    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( GPIOB, &GPIO_InitStruct );
	
    GPIO_SetBits( GPIOB, sda);          //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        GPIO_SetBits( GPIOB, scl);               //拉高时钟线
        Delay_5us();             //延时
			
			  if( SET == GPIO_ReadInputDataBit( GPIOB, sda ) )
             bit = 0X01;
       else
             bit = 0x00;  
			
        dat |= bit;             //读数据    
			
        GPIO_ResetBits( GPIOB, scl);                //拉低时钟线
        Delay_5us();             //延时
    }
		
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init( GPIOB, &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()
{
   Single_Write_BH1750(0x01);  
}

//连续读出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_mms(5);
}

unsigned char  ge,shi,bai,qian,wan;            //显示变量
unsigned int   temp_data=0;	
//读取光度值数据
unsigned int Read_BH1750(void)
{

	float temp;
	Single_Write_BH1750(0x01);   // power on
	Single_Write_BH1750(0x10);   // H- resol ution mode

	mread();       //连续读出数据,存储在BUF中
	dis_data=BUF[0];
	dis_data=(dis_data<<8)+BUF[1]; //合成数据
	temp=(float)dis_data/1.2;
    temp_data = fabs(temp);
    if(temp_data>1000)
    {
        temp_data = 999;
    }
    printf( "\r\n gVarInfo.illu=%d lx\r\n", temp_data );  
}

5.2:添加LED驱动函数

同样先看原理图接口:

image.png
image.png

LED使用的是PC10引脚

image.png
image.png
image.png
image.png

LED的驱动函数比较简单

代码语言:txt
复制
void new_led_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOC,GPIO_Pin_10);
}

6:腾讯云平台搭建

产品物模型设置:

image.png
image.png

设备在线:

image.png
image.png

设备数据调试:

image.png
image.png

7:实验结果

实验结果已发布到B站。

基于TencentOS tiny的智慧路灯_哔哩哔哩_bilibili

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1:硬件环境
  • 2:主芯片原理图
  • 3:软件开发环境
  • 4:ESP8266-12F固件更新
  • 5:编写和调试代码
    • 5.1:添加BH1750驱动函数
      • 5.2:添加LED驱动函数
      • 6:腾讯云平台搭建
      • 7:实验结果
      相关产品与服务
      TencentOS Server
      TencentOS Server 是腾讯云推出的 Linux 操作系统,它旨在为云上运行的应用程序提供稳定、安全和高性能的执行环境。它可以运行在腾讯云 CVM 全规格实例上,包括黑石物理服务器2.0。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档