瑞萨单片机william hill官网
直播中

jf_73431417

3年用户 11经验值
擅长:嵌入式技术
私信 关注

【RA4M2设计挑战赛】智慧农业监测RA4M2采集数据上传阿里云

1.项目介绍

本项目是基于瑞萨芯片RA4M2,开发的智慧农业监测系统。此项目主要是通过DHT11温湿度模块把环境的温湿度采集出来,然后通过esp8266连接路由器,把采集到的数据上传到阿里云云平台,这个云平台还配套手机app,可以实现在外面随时随地监测温湿度状态。为了便于查看温湿度数据,利用oled屏幕在上面做了一个实时显示的小菜单界面。部分效果图如下

硬件结构:image.png

2.环境配置

去官网下载软件:https://ramcu.cn/lists/21.html

3092614.png

下载最新4.0版本

3092708.png下载最新的pack

3092817.png

下载完成后 分别安装,一路next即可

创建工程具体可参考

【瑞萨RA4系列开发板体验】开发环境搭建及点灯 - 瑞萨单片机william hill官网 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 !

3.dht11数据读取

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。。image.png

dht11.h

#ifndef __DHT11_H
#define __DHT11_H
#include "hal_data.h"

#define dht11_port BSP_IO_PORT_04_PIN_05
#define dht11_high R_BSP_PinWrite(dht11_port, BSP_IO_LEVEL_HIGH);
#define dht11_low R_BSP_PinWrite(dht11_port, BSP_IO_LEVEL_LOW);
#define Read_Data R_BSP_PinRead(dht11_port)

struct rec_data {
	unsigned int rec_data[4];
};

//void DHT11_GPIO_Init_OUT(void);
//void DHT11_GPIO_Init_IN(void);
void DHT11_Start(void);
unsigned char DHT11_REC_Byte(void);
struct rec_data DHT11_REC_Data(void);



#endif

dht11.c

#include "dht11.h"               // Device header

void delay_us(uint32_t delay){
    R_BSP_SoftwareDelay(delay, BSP_DELAY_UNITS_MICROSECONDS);
}

void delay_ms(uint32_t delay){
    R_BSP_SoftwareDelay(delay, BSP_DELAY_UNITS_MILLISECONDS);
}
//主机发送开始信号
void DHT11_Start(void)
{
	//DH11_GPIO_Init_OUT(); //输出模式
	
	dht11_high; //先拉高
	delay_us(30);
	
	dht11_low; //拉低电平至少18us
	delay_ms(20);
	
	dht11_high; //拉高电平20~40us
	delay_us(30);
	
	//DH11_GPIO_Init_IN(); //输入模式
}


//获取一个字节
char DHT11_Rec_Byte(void)
{
	unsigned char i = 0;
	unsigned char data;
	
	for(i=0;i<8;i++) //1个数据就是1个字节byte,1个字节byte有8位bit
	{
		while( Read_Data == 0); //从1bit开始,低电平变高电平,等待低电平结束
		delay_us(30); //延迟30us是为了区别数据0和数据1,0只有26~28us
		
		data <<= 1; //左移
		
		if( Read_Data == 1 ) //如果过了30us还是高电平的话就是数据1
		{
			data |= 1; //数据+1
		}
		
		while( Read_Data == 1 ); //高电平变低电平,等待高电平结束
	}
	
	return data;
}

//获取数据

struct rec_data DHT11_REC_Data(void)
{
	unsigned int R_H,R_L,T_H,T_L;
	unsigned char RH,RL,TH,TL,CHECK;
	struct rec_data data;
	
	DHT11_Start(); //主机发送信号
	dht11_high; //拉高电平
	
	if( Read_Data == 0 ) //判断DHT11是否响应
	{
		while( Read_Data == 0); //低电平变高电平,等待低电平结束
		while( Read_Data == 1); //高电平变低电平,等待高电平结束
		
		R_H = DHT11_Rec_Byte();
		R_L = DHT11_Rec_Byte();
		T_H = DHT11_Rec_Byte();
		T_L = DHT11_Rec_Byte();
		CHECK = DHT11_Rec_Byte(); //接收5个数据
		
		dht11_low; //当最后一bit数据传送完毕后,DHT11拉低总线 50us
		delay_us(55); //这里延时55us
		dht11_high; //随后总线由上拉电阻拉高进入空闲状态。
		
		if(R_H + R_L + T_H + T_L == CHECK) //和检验位对比,判断校验接收到的数据是否正确
		{
			RH = R_H;
			RL = R_L;
			TH = T_H;
			TL = T_L;
		}
	}
	data.rec_data[0] = RH;
	data.rec_data[1] = RL;
	data.rec_data[2] = TH;
	data.rec_data[3] = TL;
	

	return data;
}

4.oled 屏幕IIC驱动

4.1配置IIC

参考文章

置RA4M2的I2C接口,使其作为I2C master进行通信。

查看开发板原理图,对应的IIC为P408和P409。

点击Stacks->New Stack->Connectivity -> I2C Master(r_sci_i2c)。

设置IIC的配置,需要注意从机的地址,这里的地址位数是7位,0x3c。

4.2R_SCI_I2C_Open()函数原型

R_SCI_I2C_Open()函数为执行IIC初始化,开启配置如下所示。

/* Initialize the I2C module */
       err = R_SCI_I2C_Open(&g_i2c3_ctrl, &g_i2c3_cfg);
       /* Handle any errors. This function should be defined by the user. */
       assert(FSP_SUCCESS == err);

4.3R_SCI_I2C_Write()函数原型

R_SCI_I2C_Write()函数是向IIC设备中写入数据,写入格式如下所示。

err = R_SCI_I2C_Write(&g_i2c_device_ctrl_1, &g_i2c_tx_buffer[0], I2C_BUFFER_SIZE_BYTES, false);
    assert(FSP_SUCCESS == err);

4.4 sci_i2c_master_callback()回调函数

对于数据是否发送完毕,可以查看是否获取到I2C_MASTER_EVENT_TX_COMPLETE字段。

/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
    i2c_event = I2C_MASTER_EVENT_ABORTED;
    if (NULL != p_args)
    {
        /* capture callback event for validating the i2c transfer event*/
        i2c_event = p_args->event;
    }
}

4.5控制与发送数据

对于发送数据,可以使用R_SCI_I2C_Write()函数,对于是否发送完毕,可以判断I2C_MASTER_EVENT_TX_COMPLETE != i2c_event,并且引入超时机制。

向0x3c设备写命令0x00的IIC_Command指令。

/**********************************************
 IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{

    uint8_t ii[2]={0x00,0x00};
    ii[1] = IIC_Command;



    err = R_SCI_I2C_Write(&g_i2c3_ctrl, ii, 0x02, true);
           assert(FSP_SUCCESS == err);
           /* Since there is nothing else to do, block until Callback triggers*/
           //while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)
           while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms>0)
           {
               R_BSP_SoftwareDelay(100U, BSP_DELAY_UNITS_MICROSECONDS);
               timeout_ms--;
           }
           if (I2C_MASTER_EVENT_ABORTED == i2c_event)
           {
               __BKPT(0);
           }
           /* Read data back from the I2C slave */
           i2c_event = I2C_MASTER_EVENT_ABORTED;
           timeout_ms           = 100000;
}

IIC写数据

向0x3c设备写数据0x40的IIC_Data指令。

/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{


    uint8_t ii[2]={0x40,0x00};
    ii[0] = 0x40;
    ii[1] = IIC_Data;
    err = R_SCI_I2C_Write(&g_i2c3_ctrl, ii, 0x02, true);
           assert(FSP_SUCCESS == err);
           /* Since there is nothing else to do, block until Callback triggers*/
           //while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)
           while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms>0)
           {
               R_BSP_SoftwareDelay(100U, BSP_DELAY_UNITS_MICROSECONDS);
               timeout_ms--;
           }
           if (I2C_MASTER_EVENT_ABORTED == i2c_event)
           {
               __BKPT(0);
           }
           /* Read data back from the I2C slave */
           i2c_event = I2C_MASTER_EVENT_ABORTED;
           timeout_ms           = 100000;

}

实物效果如下

f2deef0518143c749e876060c2afc70.jpg

5 串口配置

配置UART引脚功能

默认创建的RASC项目中,P109、P110为JTAG功能,因此,首先需要关闭JTAG功能,或者修改为SWD模式;

将调试模式从JTAG改为SWD

在RASC中,切换到Pins标签页;找到System:DEBUG -> DEBUG0,将其设置修改为SWD,引脚修改为P108、P300,如下图所示:RASC_DEBUG0_SWD.png

P108、P300引脚也正是和开发板原理图相对应的。

继续找到Connectivity:SCI -> SCI9,将其设置修改如下图所示:

RASC_SCI9_CFG.png

添加UART HAL配置

在RASC中,切换到Stacks标签页,依次点击“New Stack”->“Connectivity”->“UART”,添加一个uart组件,如下图所示:

RASC_add_uart_hal.png

选中之后,在Properties视图中,修改如下几个属性:

RASC_uart_prop_set.png

重定向printf输出到UART

在Keil中,实现UART打印到printf需要重新实现C标准库的putc函数

volatile bool uart_tx_done = false;

void hal_uart9_init()
{
    R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
}

int fputc(int ch, FILE* f)
{
    (void) f;

    uart_tx_done = false;

    R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);

    while (uart_tx_done == false);

    return ch;
}

void g_uart9_callback(uart_callback_args_t* p_args)
{
   switch (p_args->event)
   {
      case UART_EVENT_RX_CHAR:
            break;
      case UART_EVENT_TX_COMPLETE:
            uart_tx_done = true;
            break;
      default:
            break;
   }
}

这样,在hal_entry中调用了hal_uart9_init之后,就可以使用printf输出到串口了。

6.阿里云配置

创建产品和设备

登录物联网平台,选择:设备管理 -->产品 -->创建产品

image.png

image.png

选择标准品类搜索温湿度选择第一个

image.png

确定创建产品

选择设备,添加设备image.png

查看设备 mqtt连接参数1676966359450.png

保存下来后面会用到

AT指令让 ESP8266 连接阿里云

第一步 AT+RST

第二步 AT+CWMODE=1

第三步 AT+CIPSNTPCFG=1.8"ntp1.alivun.com"

第四步 AT+CWJAP="WiFi 名字""WiFi 密码"

第五步 AT+MQTTUSERCFG=0,1,"NULL","用户名","密码",0,0,"

第六步 AT+MQTTCLIENTID=0,"Clienld" //clientld 第二个参数注意每个逗号

前加分隔符

第七步 AT+MQTTCONN=0,"连接域名",1883,1

AT+MQTTSUB=0,"topic",1 //订阅指令

AT+MQTTPUB=0,"topic","Json格式内容",1,0 //发布指令

AT+MQTTCLEAN=O //断开连接

连接WiFi和阿里云

//连接WiFi和阿里云
void AT(void){
    printf("AT\r\n");

    R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);
    printf("AT+RST\r\n");
    R_BSP_SoftwareDelay(4500, BSP_DELAY_UNITS_MILLISECONDS);
    printf("AT+CWMODE=1\r\n");
    R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
    printf("AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pswd);
    R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);
    printf("AT+CIPSNTPCFG=1,8,\"%s\"\r\n",aliyun);
    R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);
    printf("AT+MQTTUSERCFG=0,1,\"NULL\",\"RA4M2&gjkfDbjlzOa\",\"2690e3ffeb901d01fd4732336a1bbf985294e3fd51321d41b36fa1b8bcd2998d\",0,0,\"\"\r\n");
    R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);
    printf("AT+MQTTCLIENTID=0,\"gjkfDbjlzOa.RA4M2|securemode=2\,signmethod=hmacsha256\,timestamp=1676456300908|\"\r\n");
    R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);
    printf("AT+MQTTCONN=0,\"iot-06z00dpzxbgxfgc.mqtt.iothub.aliyuncs.com\",%d,%d\r\n",1883,1);
    R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);

}

发送温湿度数据到阿里云

R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
            printf("AT+MQTTPUB=0,\"/sys/gjkfDbjlzOa/RA4M2/thing/event/property/post\",\"{\\"method\\":\\"thing.event.property.post\\"\\,\\"id\\":\\"1234\\"\\,\\"params\\":{\\"CurrentTemperature\\":%d}\\,\\"version\\":\\"1.0.0\\"}\",1,0\r\n",data.rec_data[2]);
            R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
            printf("AT+MQTTPUB=0,\"/sys/gjkfDbjlzOa/RA4M2/thing/event/property/post\",\"{\\"method\\":\\"thing.event.property.post\\"\\,\\"id\\":\\"1234\\"\\,\\"params\\":{\\"CurrentHumidity\\":%d}\\,\\"version\\":\\"1.0.0\\"}\",1,0\r\n",data.rec_data[0]);
            
            R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);

效果如下

9b98a394acfa4c864e890c3b94a38ff.png

视频演示:

Gitee代码仓库 https://gitee.com/gerhardt1024/ra4m2.git

硬声视频演示链接

目前仅添加温湿度监测上传 ,其他功能后期完善....

回帖(2)

架构师李肯

2023-2-22 22:05:25
gitee代码访问404呢
1 举报

VOR

2023-2-23 18:40:16
请问阿里云固件有吗
举报

更多回帖

发帖
×
20
完善资料,
赚取积分