【雕爷学编程】Arduino 手册之数学运算 exp()

在这里插入图片描述
在这里插入图片描述
什么是Arduino?
Arduino 是一款开源的电子原型平台,它可以让你用简单的硬件和软件来创建各种创意的项目。无论你是初学者还是专家,Arduino 都能为你提供无限的可能性。你可以用 Arduino 来控制传感器、灯光、马达、机器人、物联网设备等等,只要你能想到的,Arduino 都能帮你实现。

如果你想了解更多关于 Arduino 的信息,你可以访问 Arduino 的官方网站,那里有丰富的资源和教程供你参考。你也可以加入 Arduino 的社区,和来自世界各地的爱好者、学生、设计师和工程师交流心得和经验。此外,你还可以使用 Arduino 的在线编程工具,在云端编写代码并上传到你的开发板上。

Arduino 是一个不断发展和创新的平台,它有着广泛的应用领域和潜力。这里希望本手册能激发你对 Arduino 的兴趣和热情,让你享受 Arduino 带来的创造力和乐趣

在这里插入图片描述

维基百科的定义
Arduino 是一个开源嵌入式硬件平台,用来供用户制作可交互式的嵌入式项目。此外 Arduino 作为一个开源硬件和开源软件的公司,同时兼有项目和用户社群。该公司负责设计和制造Arduino电路板及相关附件。这些产品按照GNU宽通用公共许可证(LGPL)或GNU通用公共许可证(GPL)许可的开源硬件和软件分发的,Arduino 允许任何人制造 Arduino 板和软件分发。 Arduino 板可以以预装的形式商业销售,也可以作为 DIY 套件购买。

Arduino 2005 年时面世,作为意大利伊夫雷亚地区伊夫雷亚互动设计研究所的学生设计,目的是为新手和专业人员提供一种低成本且简单的方法,以建立使用传感器与环境相互作用的装置。初学者和爱好者可用Arduino制造传感器、简单机器人、恒温器和运动检测器等装置。

Arduino 这个名字来自意大利伊夫雷亚的一家酒吧,该项目的一些创始人过去常常会去这家酒吧。 酒吧以伊夫雷亚的 Arduin(Arduin of Ivrea)命名,他是伊夫雷亚边疆伯爵,也是 1002 年至 1014 年期间的意大利国王。

在这里插入图片描述

十七、Arduino数学运算 exp()
在Arduino编程中,exp()是一个数学运算函数,用于计算自然指数函数的值。它可以返回e的x次幂的结果,其中e是自然对数的底数(约等于2.71828),x是函数的参数。它的适用范围:
1)计算一些数学公式或算法,例如指数函数、对数函数、泰勒级数、欧拉公式等。
2)实现一些物理模拟或控制,例如放射衰变、生物增长、电容充放电等。
3)实现一些特殊的效果,例如音量调节、LED灯的呼吸灯等。

应用场景:
1)概率和统计计算:exp()函数在概率和统计学中经常用于处理概率分布和概率密度函数。它可以用于计算指数分布、泊松分布、正态分布等概率密度函数的值。
2)控制动态范围:在一些传感器或测量应用中,输入信号的动态范围可能非常宽广。使用exp()函数可以对输入信号进行非线性映射,将较大的输入值映射到较小的输出范围,以增加动态范围的有效性。
3)信号处理和滤波:在某些信号处理和滤波算法中,exp()函数用于平滑和加权信号。它可以用于对输入信号进行平滑处理,降低噪声和不必要的波动。

使用exp()函数时,需要注意以下事项:
1)exp()函数可以接受整数或浮点数作为参数,但是返回的结果类型与参数类型相同。如果要将结果赋值给不同类型的变量,需要进行类型转换。
2)exp()函数只能接受一个参数,即指数x。如果要计算多个数值的指数,需要分别调用exp()函数或使用乘法运算符。
3)exp()函数使用浮点数运算,所以可能会产生舍入误差或溢出。如果需要更精确或更大范围的计算,可以使用其他库或方法。

以下是Arduino数学运算exp()的几个实际运用程序案例:
案例一:使用温度传感器和LCD显示屏实现温度指示功能。当温度高于设定的阈值时,LCD显示屏显示警告信息。LCD显示屏的亮度随着温度的升高而升高,并呈指数关系。使用exp()函数计算LCD显示屏的亮度值。

// 引入LiquidCrystal库
#include <LiquidCrystal.h>
// 定义温度传感器和LCD显示屏的引脚
#define TEMP_PIN A0
#define RS_PIN 7
#define EN_PIN 8
#define D4_PIN 9
#define D5_PIN 10
#define D6_PIN 11
#define D7_PIN 12
// 创建LiquidCrystal对象,指定引脚顺序
LiquidCrystal lcd(RS_PIN, EN_PIN, D4_PIN, D5_PIN, D6_PIN, D7_PIN);
// 定义温度的阈值和范围,单位为摄氏度
#define TEMP_THRESHOLD 30.0
#define TEMP_MIN 30.0
#define TEMP_MAX 50.0
// 定义LCD显示屏的亮度范围,单位为PWM值
#define BRIGHTNESS_MIN 0
#define BRIGHTNESS_MAX 255
// 定义LCD显示屏的亮度指数系数
#define BRIGHTNESS_EXP 1.2

void setup() {
  // 初始化LCD显示屏,并清屏
  lcd.begin(16,2);
  lcd.clear();
}

void loop() {
  // 读取温度传感器的模拟值,并将其转换为摄氏度
  int temp_value = analogRead(TEMP_PIN);
  float temp = temp_value * (5.0 / 1023.0) * 100.0;
  
   // 使用exp()函数计算LCD显示屏的亮度,并将其映射到合理的范围内
   // LCD显示屏的亮度与温度成指数关系,公式为b = b_min + (b_max - b_min) * exp(b_exp * (t - t_min))
   // 其中b是LCD显示屏的亮度,t是温度,b_min, b_max, b_exp, t_min是常数
   float brightness = BRIGHTNESS_MIN + (BRIGHTNESS_MAX - BRIGHTNESS_MIN) * exp(BRIGHTNESS_EXP * (temp - TEMP_MIN));
   brightness = constrain(brightness, BRIGHTNESS_MIN, BRIGHTNESS_MAX);
   // 使用ceil()函数将亮度转换为整数,并赋值给LCD显示屏
   int brightness_value = ceil(brightness);
   analogWrite(EN_PIN, brightness_value);
   
   // 在LCD显示屏上显示当前的温度,并根据温度是否超过阈值显示不同的信息
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Temp: ");
   lcd.print(temp,1);
   lcd.print(" C");
   
   lcd.setCursor(0,1);
   if (temp > TEMP_THRESHOLD) {
     lcd.print("Warning: Too Hot!");
   } else {
     lcd.print("Normal: Keep Cool!");
   }
}

案例二:使用光敏电阻和蜂鸣器实现声光控制功能。当光敏电阻检测到光线时,蜂鸣器发出声音。声音的音量随着光线的强弱而变化,并呈指数关系。使用exp()函数计算音量值。

// 定义光敏电阻和蜂鸣器的引脚
#define LDR_PIN A0
#define BUZZ_PIN 3
// 定义光敏电阻的读数的范围
#define LDR_MIN 0
#define LDR_MAX 1023
// 定义蜂鸣器的音量的范围,单位为PWM值
#define VOLUME_MIN 0
#define VOLUME_MAX 255
// 定义蜂鸣器的音量指数系数
#define VOLUME_EXP 1.5

void setup() {
  // 设置蜂鸣器为输出模式,并初始化为低电平
  pinMode(BUZZ_PIN, OUTPUT);
  digitalWrite(BUZZ_PIN, LOW);
}

void loop() {
  // 读取光敏电阻的模拟值,并将其映射到0-1023范围内
  int ldr_value = analogRead(LDR_PIN);
  ldr_value = map(ldr_value, LDR_MIN, LDR_MAX, 0, 1023);
  
   // 使用exp()函数计算蜂鸣器的音量,并将其映射到合理的范围内
   // 蜂鸣器的音量与光敏电阻的读数成指数关系,公式为v = v_min + (v_max - v_min) * exp(v_exp * l)
   // 其中v是蜂鸣器的音量,l是光敏电阻的读数,v_min, v_max, v_exp是常数
   float volume = VOLUME_MIN + (VOLUME_MAX - VOLUME_MIN) * exp(VOLUME_EXP * ldr_value / LDR_MAX);
   volume = constrain(volume, VOLUME_MIN, VOLUME_MAX);
   // 使用ceil()函数将音量转换为整数,并赋值给蜂鸣器
   int volume_value = ceil(volume);
   analogWrite(BUZZ_PIN, volume_value);
}

案例三:使用温度传感器和LED灯实现温度指示功能。当温度高于设定的阈值时,LED灯闪烁。LED灯的闪烁频率随着温度的升高而升高,并呈指数关系。使用exp()函数计算闪烁频率。

// 引入OneWire库和DallasTemperature库
#include <OneWire.h>
#include <DallasTemperature.h>
// 定义温度传感器和LED灯的引脚
#define TEMP_PIN A0
#define LED_PIN 13
// 创建OneWire对象,指定引脚
OneWire oneWire(TEMP_PIN);
// 创建DallasTemperature对象,指定OneWire对象
DallasTemperature sensors(&oneWire);
// 定义温度的阈值和范围,单位为摄氏度
#define TEMP_THRESHOLD 30.0
#define TEMP_MIN 30.0
#define TEMP_MAX 50.0
// 定义LED灯的闪烁频率的范围,单位为赫兹
#define FREQ_MIN 1.0
#define FREQ_MAX 10.0
// 定义LED灯的闪烁频率的指数系数
#define FREQ_EXP 1.2

void setup() {
  // 初始化温度传感器
  sensors.begin();
  // 设置LED灯为输出模式,并初始化为低电平
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
}

void loop() {
  // 请求温度传感器读取温度数据,并等待转换完成
  sensors.requestTemperatures();
  // 获取当前的温度,单位为摄氏度
  float temp = sensors.getTempCByIndex(0);
  
   // 使用exp()函数计算LED灯的闪烁频率,并将其映射到合理的范围内
   // LED灯的闪烁频率与温度成指数关系,公式为f = f_min + (f_max - f_min) * exp(f_exp * (t - t_min))
   // 其中f是LED灯的闪烁频率,t是温度,f_min, f_max, f_exp, t_min是常数
   float freq = FREQ_MIN + (FREQ_MAX - FREQ_MIN) * exp(FREQ_EXP * (temp - TEMP_MIN));
   freq = constrain(freq, FREQ_MIN, FREQ_MAX);
   // 根据闪烁频率计算闪烁周期和占空比,单位为毫秒
   int period = 1000 / freq;
   int duty = period / 2;
   
   // 如果温度高于阈值,控制LED灯按照计算出的周期和占空比闪烁
   if (temp > TEMP_THRESHOLD) {
     digitalWrite(LED_PIN, HIGH);
     delay(duty);
     digitalWrite(LED_PIN, LOW);
     delay(duty);
   }
}

案例四:概率与统计:

float lambda = 0.5; // 指数分布的参数

float x = 2.5; // 指定的随机变量

float probability = exp(-lambda * x); // 计算指数分布的概率密度函数值

Serial.print("Probability: ");
Serial.println(probability);

在此案例中,使用exp()函数计算指数分布的概率密度函数值。根据指数分布的特性,通过指定参数和随机变量,可以计算指定随机变量处的概率密度函数值。最后,将计算结果输出到串口监视器,用于显示或后续的处理。

案例五:信号处理:

float signal = 0.5; // 原始信号

float decayRate = 0.1; // 衰减速率

float attenuatedSignal = signal * exp(-decayRate * time); // 计算衰减后的信号

// 使用衰减后的信号进行后续的信号处理
// ...

在此案例中,使用exp()函数计算信号的衰减系数,用于信号处理中的衰减操作。根据衰减速率和时间,通过计算衰减系数,可以将原始信号进行衰减。最后,可以使用衰减后的信号进行后续的信号处理,如滤波、放大或衰减等操作。

案例六:物理模拟:

float initialIntensity = 10.0; // 初始强度

float decayRate = 0.05; // 衰减速率

float distance = 2.0; // 距离

float intensity = initialIntensity * exp(-decayRate * distance); // 计算衰减后的光强

Serial.print("Intensity: ");
Serial.println(intensity);

在此案例中,使用exp()函数模拟光强的衰减过程。根据初始强度、衰减速率和距离,通过计算衰减系数,可以计算衰减后的光强。最后,将计算结果输出到串口监视器,用于显示或后续的处理。

案例七:计算复利增长:

float principal = 1000.0; // 初始本金
float interestRate = 0.05; // 年利率
float years = 10.0; // 年数
float finalAmount = principal * exp(interestRate * years); // 计算复利增长后的总金额

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("复利增长后的总金额:");
  Serial.println(finalAmount);
  delay(1000);
}

在这个例子中,我们使用exp()函数计算复利增长后的总金额。通过应用复利公式,计算初始本金与指数增长的乘积。

案例八:模拟电荷放电过程:

float initialCharge = 1000.0; // 初始电荷量
float resistance = 10.0; // 电阻值
float time = 5.0; // 时间(单位:秒)
float finalCharge = initialCharge * exp(-time / resistance); // 模拟电荷放电后的电荷量

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("电荷放电后的电荷量:");
  Serial.println(finalCharge);
  delay(1000);
}

在这个例子中,我们使用exp()函数模拟电荷放电过程。通过应用指数衰减的公式,计算初始电荷量与指数衰减的乘积。

案例九:神经网络中的激活函数:

float input = 0.5; // 输入值
float output = exp(input); // 使用指数函数作为激活函数的输出

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("激活函数的输出:");
  Serial.println(output);
  delay(1000);
}

在这个例子中,我们使用exp()函数作为神经网络中的激活函数。将输入值作为指数函数的指数,得到激活函数的输出。

案例十:计算指数分布:

#include <math.h>

float lambda = 0.5;  // 指数分布的参数

void setup() {
  Serial.begin(9600);
  // ...
}

void loop() {
  float x = random(1000) / 1000.0;  // 生成0到1之间的随机数
  float result = -log(1 - x) / lambda;  // 计算指数分布的值

  Serial.println(result);
  delay(1000);
}

在这个案例中,使用exp()的反函数log()函数和随机数生成器来模拟指数分布。通过计算-log(1 - x) / lambda,可以生成服从指数分布的随机数。

案例十一:控制动态范围:

int sensorPin = A0;
float minValue = 0.0;
float maxValue = 1023.0;

void setup() {
  // ...
}

void loop() {
  int sensorValue = analogRead(sensorPin);  // 读取传感器数据

  // 将传感器数据映射到0到1之间的范围
  float normalizedValue = map(sensorValue, minValue, maxValue, 0, 1);
  
  // 对数据进行非线性映射
  float mappedValue = exp(normalizedValue) - 1;

  // 处理映射后的值
  // ...
}

在这个案例中,analogRead()函数用于读取模拟传感器的值。通过使用map()函数将传感器数据映射到0到1之间的范围,然后使用exp()函数对数据进行非线性映射。这可以使较大的输入值在较小的输出范围内更为显著。

案例十二:信号处理和滤波:

float sensorValue = 0.0;
float filteredValue = 0.0;
float alpha = 0.1;  // 滤波器的平滑系数void setup() {
  // ...
}

void loop() {
  // 读取传感器数据
  sensorValue = analogRead(A0);

  // 使用指数加权滤波器进行平滑处理
  filteredValue = alpha * sensorValue + (1 - alpha) * filteredValue;

  // 处理滤波后的值
  // ...
}

在这个案例中,analogRead()函数用于读取模拟传感器的值。通过使用指数加权滤波器,使用exp()函数进行平滑处理。滤波器的平滑系数alpha决定了当前值和先前值的权重,较大的alpha值会产生更强的平滑效果。

总结:
exp()函数是Arduino中的数学运算函数,用于计算自然指数函数的值。它在概率和统计计算、控制动态范围和信号处理等方面具有广泛的应用。在使用exp()函数时,需要注意参数的数据类型和数值范围,以确保函数的正常工作。通过合理地使用exp()函数,可以实现复杂的数学计算和信号处理任务。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
雕爷学编程Arduino动手做寻迹的实验可以使用TCRT5000红外反射光电开关寻迹传感器模块。这个传感器模块可以通过检测周围的光反射来进行寻迹操作。你可以将这个模块连接到mBot的主控板mCore V1.5的RJ25接口上,因为mBot的主控板兼容Arduino系统,所以你可以使用Arduino编程语言来控制mBot进行寻迹操作。请参考【Arduino】168种传感器模块系列实验中的实验六十六,该实验详细介绍了如何使用TCRT5000红外反射光电开关寻迹传感器模块进行寻迹。祝你成功完成实验!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【雕爷学编程Arduino动手做(194)---makeblock mbot 主控板2](https://blog.csdn.net/weixin_41659040/article/details/132141677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [【雕爷学编程Arduino动手做(65)---红外寻迹传感器](https://blog.csdn.net/weixin_41659040/article/details/106604080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值