GD32F470_GY-68 BMP180 新款 BOSCH温度 代替BMP085 气压传感器模块

2.23 BMP180气压传感器

1BMP180是一款高精度、小体积、低能耗的压力传感器,可以轻松应用在移动设备中.在测量海拔高度时,传统的做法是通过测量某一高度的大气压力,再经过换算才能得到高度数据。BMP180不仅可以实时的测量大气压力,还能测量实时温度。同时它还具有IIC总线接口,便于单片机进行访问。另外它的使用也很方便,不需要太多的操作就可读取到气压及测量数据

2.23.1 模块来源

采购链接:
GY-68 BMP180 新款 BOSCH温度 代替BMP085 气压传感器模块
资料下载链接:
https://pan.baidu.com/s/1miTIphm

2.23.2 规格参数

工作电压:1.8~3.6V
工作电流:0.1~1000uA
温度精度:±1℃
温度范围:0~65℃
气压范围:300~1100 hPa
气压精度:1 hPa
输出方式: IIC
管脚数量:3 Pin

2.23.3 移植过程

我们的目标是在梁山派GD32F470上能够测量环境温度、气压、高度。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。

2.23.3.1 查看资料

BMP180共有四种工作模式,每种模式有不同的采样数量、转换速度和噪声等参数的不同。可以通过写入ctrl_meas寄存器来设置模式,默认为第一个ultra low power超低功耗。

在这里插入图片描述
BMP180的气压和温度数值并不是可以直接读取的,每个不同的传感器中,都有自己独特的校准数值,存储在内置的E2PROM存储器中。当微处理器读取传感器的原始温度和气压数值后,再根据E2PROM中的校准数值进行转换,才能得到真正的温度、气压数据。每个校准数值的存储位置如下,微处理器通过这些地址读取校准数值。
在这里插入图片描述
和所有的IIC总线器件一样,BMP180也有一个器件的固定地址,根据其数据手册,出厂时默认BMP180的从机地址为0xEE(写入方向),或0xEF(读出方向)。在这里插入图片描述
以下为读取温度与气压的步骤:

  1. 把16位的校准数值读取到单片机中,可以看到一共有11个数值。需要注意的是高位存储在MSB地址,低位存储在LSB地址。例如数值AC1,高八位存储在0xAA地址,低八位存储在0xAB地址。
  2. 温度初始值读取步骤:
    (1)往寄存器0xf4写入0x2e,等待4、5ms;
    (2)读0xf6(高八位)和0xf7(低八位)两个寄存器;
    (3)进行换算: UT=MSB <<8 +LSB。
  3. 气压初始值读取步骤:
    (1)往寄存器0xf4写入0x34(如果不是默认的工作模式,需要加上oss左移六位的结果,oss为设置工作模式 的寄存器0xf4的bit7、bit6位),等待4、5ms;
    (2)读0xf6(16-23位)、0xf7(8-15位)和0xf8(0-7位)三个寄存器;
    (3)进行换算: UP=MSB <<16 + LSB<<8 + XLSB >> (8-oss(这个同温度初始值读取一样))。
  4. 根据第一步读出来的校准系数和第二步读出来的UT、UP进行换算,最后得出来的T(温度,每个数值代表0.1摄氏度),p(气压,每个数值代表1帕)。
    在这里插入图片描述

2.23.3.2 引脚选择

在这里插入图片描述

2.23.3.3 移植至工程

移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_bmp180.c与bsp_bmp180.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件bsp_bmp180.c中,编写如下代码。

/********************************************************************************* 文 件 名: bsp_bmp180.c* 版 本 号: 初版* 修改作者: LC* 修改日期: 2022年04月26日* 功能介绍: 气压传感器bmp180的底层驱动  * 使用说明:******************************************************************************* 开发板官网:www.lckfb.com
*********************************************************************************/#include "bsp_bmp180.h"
#include "bsp_usart.h"
#include "stdio.h"
#include "systick.h"
#include "math.h"typedef struct _BMP180_STRUCT{short AC1;short AC2;short AC3;uint16_t AC4;uint16_t AC5;uint16_t AC6;short B1;short B2;short MB;short MC;short MD;  
}_BMP180_PARAM_;_BMP180_PARAM_ param={0};long B5 = 0;/******************************************************************* 函 数 名 称:BMP180_GPIO_Init* 函 数 说 明:BMP180的引脚初始化* 函 数 形 参:无* 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void BMP180_GPIO_Init(void)
{/* 使能时钟 */rcu_periph_clock_enable(RCU_SCL);rcu_periph_clock_enable(RCU_SDA);/* 配置SCL为输出模式 */gpio_mode_set(PORT_SCL,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_SCL);/* 配置为推挽输出 50MHZ */gpio_output_options_set(PORT_SCL,GPIO_OTYPE_OD,GPIO_OSPEED_50MHZ,GPIO_SCL);/* 配置SDA为输出模式 */gpio_mode_set(PORT_SDA,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_SDA);/* 配置为推挽输出 50MHZ */gpio_output_options_set(PORT_SDA,GPIO_OTYPE_OD,GPIO_OSPEED_50MHZ,GPIO_SDA);
}/******************************************************************* 函 数 名 称:IIC_Start* 函 数 说 明:IIC起始时序* 函 数 形 参:无* 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void IIC_Start(void)
{SDA_OUT();SDA(1);delay_us(5);SCL(1); delay_us(5);SDA(0);delay_us(5);SCL(0);delay_us(5);}
/******************************************************************* 函 数 名 称:IIC_Stop* 函 数 说 明:IIC停止信号* 函 数 形 参:无* 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void IIC_Stop(void)
{SDA_OUT();SCL(0);SDA(0);SCL(1);delay_us(5);SDA(1);delay_us(5);}/******************************************************************* 函 数 名 称:IIC_Send_Ack* 函 数 说 明:主机发送应答或者非应答信号* 函 数 形 参:0发送应答  1发送非应答* 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void IIC_Send_Ack(unsigned char ack)
{SDA_OUT();SCL(0);SDA(0);delay_us(5);if(!ack) SDA(0);else         SDA(1);SCL(1);delay_us(5);SCL(0);SDA(1);
}/******************************************************************* 函 数 名 称:I2C_WaitAck* 函 数 说 明:等待从机应答* 函 数 形 参:无* 函 数 返 回:0有应答  1超时无应答* 作       者:LC* 备       注:无
******************************************************************/
unsigned char I2C_WaitAck(void)
{char ack = 0;unsigned char ack_flag = 10;SCL(0);SDA(1);SDA_IN();delay_us(5);SCL(1);delay_us(5);while( (SDA_GET()==1) && ( ack_flag ) ){ack_flag--;delay_us(5);}if( ack_flag <= 0 ){IIC_Stop();return 1;}else{SCL(0);SDA_OUT();}return ack;
}/******************************************************************* 函 数 名 称:Send_Byte* 函 数 说 明:写入一个字节* 函 数 形 参:dat要写人的数据* 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void Send_Byte(uint8_t dat)
{int i = 0;SDA_OUT();SCL(0);//拉低时钟开始数据传输for( i = 0; i < 8; i++ ){SDA( (dat & 0x80) >> 7 );__nop();SCL(1);delay_us(5);SCL(0);delay_us(5);dat<<=1;}        
}/******************************************************************* 函 数 名 称:Read_Byte* 函 数 说 明:IIC读时序* 函 数 形 参:无* 函 数 返 回:读到的数据* 作       者:LC* 备       注:无
******************************************************************/
unsigned char Read_Byte(void)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){SCL(0);delay_us(5);SCL(1);delay_us(5);receive<<=1;if( SDA_GET() ){        receive|=1;   }delay_us(5); }                                         SCL(0); return receive;
}/******************************************************************* 函 数 名 称:BMP180_Write_Cmd* 函 数 说 明:向BMP180写入一个字节数据* 函 数 形 参:regaddr寄存器地址  cmd写入的数据* 函 数 返 回:无* 作       者:LC* 备       注:regaddr=0xf4, cmd=0X2E
******************************************************************/
void BMP180_Write_Cmd(uint8_t regaddr,uint8_t cmd)
{IIC_Start();//起始信号Send_Byte(0XEE);//器件地址+写if( I2C_WaitAck() == 1 ) printf("Write_Cmd NACK -1\r\n");Send_Byte(regaddr);if( I2C_WaitAck() == 1 ) printf("Write_Cmd NACK -2\r\n");Send_Byte(cmd);if( I2C_WaitAck() == 1 ) printf("Write_Cmd NACK -3\r\n");IIC_Stop();
}/******************************************************************* 函 数 名 称:BMP180_Read16* 函 数 说 明:读取BMP180数据* 函 数 形 参:regaddr读取的地址 len读取的长度* 函 数 返 回:读取到的数据* 作       者:LC* 备       注:无
******************************************************************/
uint16_t BMP180_Read16(uint16_t regaddr,uint8_t len)
{int timeout = 0;uint16_t dat[3] = {0};int i =0;for( i = 0; i < len; i++ ){IIC_Start();//起始信号Send_Byte(0XEE);//器件地址+写if( I2C_WaitAck() == 1 ) printf("Read_Reg NACK -1\r\n");Send_Byte(regaddr+i);if( I2C_WaitAck() == 1 ) printf("Read_Reg NACK -2\r\n");do{timeout++;delay_1ms(1);IIC_Start();//起始信号Send_Byte(0XEF);//器件地址+读    }while(I2C_WaitAck() == 1 && (timeout < 5) );dat[i] = Read_Byte();IIC_Send_Ack(1);    IIC_Stop();delay_1ms(1);}if( len == 2 ) return ( (dat[0]<<8) | dat[1] );if( len == 3 ) return (( (dat[0]<<16) | (dat[1]<<8) | (dat[2]) ) >> 8);return 0;
}   /******************************************************************* 函 数 名 称:BMP180_Get_Temperature* 函 数 说 明:读取温度单位℃* 函 数 形 参:无* 函 数 返 回:温度* 作       者:LC* 备       注:无
******************************************************************/
float BMP180_Get_Temperature(void)
{                       long UT = 0;long X1 = 0, X2 = 0;BMP180_Write_Cmd(0XF4, 0X2E);delay_1ms(6);UT = BMP180_Read16(0xf6,2);X1 = ((long)UT - param.AC6) * param.AC5 / 32768.0;X2 = ((long)param.MC * 2048.0) / ( X1 + param.MD );B5 = X1 + X2;return ((B5+8)/16.0)*0.1f;
}/******************************************************************* 函 数 名 称:BMP180_Get_Pressure* 函 数 说 明:读取气压,单位Pa* 函 数 形 参:无* 函 数 返 回:当前气压,单位Pa* 作       者:LC* 备       注:无
******************************************************************/
float BMP180_Get_Pressure(void)
{                       long UP = 0;uint8_t oss = 0; long X1 = 0, X2 = 0;BMP180_Get_Temperature();BMP180_Write_Cmd(0XF4, (0X34+(oss<<6)));delay_1ms(10);UP = BMP180_Read16(0xf6,3);int32_t B6 = B5 - 4000;X1 = (B6 * B6 >> 12) * param.B2 >> 11;X2 = param.AC2 * B6 >> 11;int32_t X3 = X1 + X2;int32_t B3 = (((param.AC1 << 2) + X3) + 2) >> 2;X1 = param.AC3 * B6 >> 13;X2 = (B6 * B6 >> 12) * param.B1 >> 16;X3 = (X1 + X2 + 2) >> 2; uint32_t B4 = param.AC4 * (uint32_t)(X3 + 32768) >> 15;uint32_t B7 = ((uint32_t)UP - B3) * 50000;int32_t p;if(B7 < 0x80000000){p = (B7 << 1) / B4;  }else{p = B7/B4 << 1;}X1 = (p >> 8) * (p >> 8);X1 = (X1 * 3038) >> 16;X2 = (-7375 * p) >> 16;p = p + ((X1 + X2 + 3791) >> 4);return p;}/******************************************************************* 函 数 名 称:BMP180_Get_Altitude* 函 数 说 明:计算海拔高度* 函 数 形 参:p=当前气压* 函 数 返 回:海拔高度* 作       者:LC* 备       注:无
******************************************************************/
float BMP180_Get_Altitude(float p)
{  
//#define PRESSURE_OF_SEA        101325.0f // 参考海平面压强   float altitude = 0;altitude = 44330*(1 - pow((p)/ 101325.0f, 1.0f / 5.255f));printf("altitude = %.2f\r\n",altitude);return altitude;
}/******************************************************************* 函 数 名 称:BMP180_Get_param* 函 数 说 明:获取出厂校准值* 函 数 形 参:无* 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void BMP180_Get_param(void)
{param.AC1 =  BMP180_Read16(0xaa,2);param.AC2 =  BMP180_Read16(0xac,2);param.AC3 =  BMP180_Read16(0xae,2);param.AC4 =  BMP180_Read16(0xb0,2);param.AC5 =  BMP180_Read16(0xb2,2);param.AC6 =  BMP180_Read16(0xb4,2);param.B1  =  BMP180_Read16(0xb6,2);param.B2  =  BMP180_Read16(0xb8,2);param.MB  =  BMP180_Read16(0xba,2);param.MC  =  BMP180_Read16(0xbc,2);param.MD  =  BMP180_Read16(0xbe,2);
}

在文件bsp_bmp180.h中,编写如下代码。

/********************************************************************************* 文 件 名: bsp_bmp180.h* 版 本 号: 初版* 修改作者: LC* 修改日期: 2022年04月26日* 功能介绍:          ******************************************************************************* 开发板官网:www.lckfb.com
*********************************************************************************/#ifndef _BSP_BMP180_H_
#define _BSP_BMP180_H_#include "gd32f4xx.h"//端口移植
#define RCU_SDA RCU_GPIOF
#define PORT_SDA GPIOF
#define GPIO_SDA GPIO_PIN_9#define RCU_SCL RCU_GPIOF
#define PORT_SCL GPIOF
#define GPIO_SCL GPIO_PIN_7//设置SDA输出模式
#define SDA_OUT()        gpio_mode_set(PORT_SDA,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_SDA)
//设置SDA输入模式
#define SDA_IN()        gpio_mode_set(PORT_SDA,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_SDA)
//获取SDA引脚的电平变化
#define SDA_GET()        gpio_input_bit_get(PORT_SDA,GPIO_SDA)
//SDA与SCL输出
#define SDA(x)          gpio_bit_write(PORT_SDA,GPIO_SDA, (x?SET:RESET))
#define SCL(x)          gpio_bit_write(PORT_SCL,GPIO_SCL, (x?SET:RESET))void BMP180_GPIO_Init(void);
float BMP180_Get_Temperature(void);
float BMP180_Get_Pressure(void);
void BMP180_Write_Cmd(uint8_t regaddr,uint8_t cmd);
void BMP180_Get_param(void);
float BMP180_Get_Altitude(float p);#endif

2.23.4 移植验证

在自己工程中的main主函数中,编写如下。

/********************************************************************************* 文 件 名: main.c* 版 本 号: 初版* 修改作者: LC* 修改日期: 2022年04月19日* 功能介绍:          ******************************************************************************* 开发板官网:www.lckfb.com
*********************************************************************************/#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "sys.h"
#include "bsp_usart.h"
#include "bsp_bmp180.h"/************************************************
函数名称 : main
功    能 : 主函数
参    数 : 无
返 回 值 : 无
作    者 : LC
*************************************************/
int main(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);  // 优先级分组systick_config();                                                  // 滴答定时器初始化usart_gpio_config(9600U);                                          // 串口0初始化BMP180_GPIO_Init();BMP180_Get_param();printf("start\r\n");while(1) {printf("temp = %.2f\r\n", BMP180_Get_Temperature() );printf("Pressure = %.2f\r\n", BMP180_Get_Pressure() );BMP180_Get_Altitude(BMP180_Get_Pressure());delay_1ms(1000);}
}

移植现象:每隔一秒测量一次温度、气压和高度,并发送至串口0。

在这里插入图片描述
移植成功示例,见文件2.23.4-1 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/801675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于velero和minio实现k8s数据的备份

1.30部署minio rootk8s-harbor:/etc/kubeasz/clusters/k8s-cluster1# docker run \ -d --restartalways -p 9000:9000 -p 9090:9090 –name minio -v /data/minio/data:/data -e “MINIO_ROOT_USERadmin” -e “MINIO_ROOT_PASSWORD12345678” quay.io/minio/minio server…

智慧安防系统EasyCVR视频汇聚平台接入大华设备无法语音对讲的原因排查与解决

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xff0c;视频画面1、4、9、16个可选&#xff0c;支持自定义视频轮播。EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标…

不同的子序列-java

题目描述(力扣题库115): 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 示例 1&#xff1a; 输入&#xff1a;s "rabbbit", t "rabbit"输出&#xff1a;3 解释&#xff1a; 如下所示…

小型企业网络安全指南

许多小型企业刚刚起步&#xff0c;没有大公司所拥有的相同资源来保护其数据。他们不仅可能没有资金来支持多样化的安全计划&#xff0c;而且也可能没有人力或时间。 网络犯罪分子知道小型企业缺乏这些资源&#xff0c;并利用这些资源来谋取利益。遭受网络攻击后&#xff0c;小…

Rust与Go的对比

在各个领域&#xff0c;Rust 都已经成为一流的语言。最近&#xff0c;我们通过将服务的实现从 Go 切换到 Rust&#xff0c;极大地提升了该服务的性能。这里我阐述了重新实现服务为何是有价值的、该过程是如何实现的以及由此带来的性能提升。 Read States 服务 我们从 Go 切换…

01 Php学习:导学篇

Php是什么&#xff1f; PHP 是服务器端脚本语言。 PHP&#xff08;Hypertext Preprocessor&#xff09;是一种通用开源脚本语言&#xff0c;主要用于服务器端开发。PHP脚本在服务器端执行&#xff0c;生成动态网页内容或执行服务器端任务。PHP可以嵌入到HTML中&#xff0c;也…

千视携 NDI 6 轻量化媒体方案亮相北京CCBN展会

展会简介 第30届中国国际广播电视网络技术展览会&#xff08;CCBN&#xff09;将于4月24至26日在北京首钢会展中心举行。此次展会将汇集全球各大数字媒体、广播电视单位以及IT、通信技术厂商。展会重点关注数字化转型、智能媒体、融媒体等主题&#xff0c;并展示最新的5G、4K/8…

【运输层】TCP 的可靠传输是如何实现的?

目录 1、发送和接收窗口&#xff08;滑动窗口&#xff09; &#xff08;1&#xff09;滑动窗口的工作流程 &#xff08;2&#xff09;滑动窗口和缓存的关系 &#xff08;3&#xff09;滑动窗口的注意事项 2、如何选择超时重传时间 &#xff08;1&#xff09;加权平均往返…

5.网络编程-socker(golang版)

目录 一、什么是socket&#xff1f; 二、Golang中使用TCP TCP服务端 TCP客户端​​​​​​​ 三、TCP黏包&#xff0c;拆包 1.什么是粘包&#xff0c;拆包&#xff1f; 2.为什么UDP没有粘包&#xff0c;拆包&#xff1f; 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …

解决 IDEA每次打开新的项目都要重新设置maven问题

目录 一、当前项目设置maven 如下图&#xff1a; 二、设置打开的新项目的maven 如下图&#xff1a;​ 一、当前项目设置maven 对于当前项目我们都知道设置maven的配置要在 File -- Settings -- Build -- Maven 中设置 如下图&#xff1a; 二、设置打开的新项目的maven F…

整理的微信小程序日历(单选/多选/筛选)

一、日历横向多选&#xff0c;支持单日、双日、三日、工作日等选择 效果图 wxml文件 <view class"calendar"><view class"section"><view class"title flex-box"><button bindtap"past">上一页</button&…

stm32与esp8266WIFI模块

硬件介绍 WIFI模块ESP-01S 使用AT指令控制1-ESP8266-AT指令初试化及部分基础知识_ch_pd-CSDN博客 项目需求 通过ESP-01SWIFI模块控制LED状态模拟插座 串口1用于与ESP8266通讯&#xff0c;串口2连接PC&#xff0c;用于打印log&#xff0c;查看系统状态 项目接线 将WIFI模块的…

智慧农场物联网系统:重塑农业的未来

随着科技的进步&#xff0c;物联网技术正在逐渐改变我们的生活。在农业领域&#xff0c;物联网系统也正在发挥着越来越重要的作用&#xff0c;为智慧农场的发展提供了新的可能。本文将深入探讨智慧农场物联网系统的优势、应用场景、技术实现以及未来发展趋势。 一、智慧农场物…

ATAM方法架构评估实践

用ATAM方法评估软件体系结构&#xff0c;其工作分为4个基本阶段&#xff0c;即演示、调查和分析、测试和报告ATAM&#xff08;如图1所示&#xff09;。接下来分别就每个阶段的实践进行详细介绍。 图1 ATAM方法的评估实践阶段划分 1.阶段1——演示&#xff08;Presentation&…

转化延迟预估

转化数据延迟久&#xff0c;但实时反馈至关重要涉及到模型预估准度&#xff0c;进而影响客户成本。 现状&#xff1a;超过12h的转化被视为负例&#xff0c;12h以内的为正例&#xff0c;这样会导致模型低估。公示如下&#xff1a; P ( 转化 ∣ 点击 ) 延迟 ≤ 12 h 的转化 未转…

什么是人工智能?人工智能、机器学习、深度学习三者之间有什么关系吗?

深度学习是机器学习的一个分支。深度学习是机器学习的一部分&#xff0c;与机器学习的其他分支学科&#xff0c;以及统计学、人工智能等学科都有着紧密的联系。深度学习、机器学习、人工智能、统计学之间的关系如图1-4所示。 图1-4 深度学习、机器学习、人工智能、统计学之间的…

【C语言】指针篇(指针数组,数组指针,函数指针,一级、二级指针)

文章目录 一、指针基础1.什么是指针2.指针的定义和初始化3.指针的解引用4.野指针和空指针5.指针的类型6.指针的大小7.指针的运算8.指针和数组9.指针和字符串10.二级指针 二、指针数组和数组指针1.指针数组2.数组指针3.练习 三、数组传参和指针传参1.一维数组传参2.二维数组传参…

Maven POM元素解析

这是对Maven中使用的Maven项目描述符的引用。 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/…

GEE:基于CHIRPS数据集的累积降水量影像下载

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine(GEE)平台上使用“UCSB-CHG/CHIRPS/DAILY”数据集计算某一段时期(某年/某个季节/某月)的累积降雨量图像,并下载。 结果如下图所示, 文章目录 一、核心函数二、代码链接三、完整代码一、核心函数 .sum() // 对影…

02 Php学习:变量

Php 变量声明 Php 变量赋值 在PHP中&#xff0c;变量赋值是指将一个值赋给一个变量。变量赋值是 PHP 中最基本和常见的操作之一&#xff0c;以下是关于变量赋值的详细说明和示例&#xff1a; 变量赋值语法&#xff1a; $variable value;$variable&#xff1a;要赋值的变量名…