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

在这里插入图片描述
在这里插入图片描述
什么是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数学运算 pow()
pow()是Arduino中的数学运算函数,用于计算一个数的幂。它接受两个参数:底数和指数,并返回计算结果。它的适用范围:
1)计算一些数学公式或算法,例如二项式定理、牛顿法、快速幂等。
2)实现一些物理模拟或控制,例如重力、摩擦力、指数衰减等。
3)实现一些特殊的效果,例如音量调节、LED灯的呼吸灯等。

应用场景:
1)数值计算:pow()函数常用于进行数值计算,特别是涉及幂运算的场景。例如,计算物体的体积、面积或进行复杂的数学公式计算时,可以使用pow()函数。
2)信号处理:在某些应用中,可能需要对信号进行幂次运算,如信号放大、衰减或变换。pow()函数可以用于进行信号处理,以实现特定的信号转换功能。
3)控制系统:在控制系统中,可能需要进行指数运算来调整控制量的响应。pow()函数可以用于控制系统的非线性响应,以满足特定的控制要求。

使用pow()函数时,需要注意以下事项:
1)pow()函数可以接受整数或浮点数作为参数,但是返回的结果类型与参数类型相同。如果要将结果赋值给不同类型的变量,需要进行类型转换。
2)pow()函数只能接受两个参数,分别是底数和指数。如果要计算多个数值的幂,需要分别调用pow()函数或使用乘法运算符。
3)pow()函数使用浮点数运算,所以可能会产生舍入误差或溢出。如果需要更精确或更大范围的计算,可以使用其他库或方法。
4)pow()函数的参数可以是整数类型(如int、long等)或浮点数类型(如float、double等)。但需要注意,如果参数是整数类型,结果可能会被截断为整数,导致精度丢失。若需要保持浮点数精度,建议使用浮点数类型作为参数。
5)底数和指数可以是正数、负数或零。函数会根据指数的正负自动计算结果。
6)在使用pow()函数时,需要注意数值范围和溢出问题。确保所使用的数值在函数的有效范围内,并注意避免溢出。

以下是Arduino数学运算pow()的三个实际运用程序案例:
案例一:使用电位器和LCD显示屏实现二项式定理的计算。当电位器旋转时,LCD显示屏显示(a+b)^n的结果,其中a和b是固定的常数,n是电位器的读数。使用pow()函数计算幂运算。

// 引入LiquidCrystal库
#include <LiquidCrystal.h>
// 定义电位器和LCD显示屏的引脚
#define POT_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);
// 定义二项式定理中的常数a和b
#define A 2.0
#define B 3.0

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

void loop() {
    
    
  // 读取电位器的模拟值,并将其映射到0-10范围内作为指数n
  int pot_value = analogRead(POT_PIN);
  int n = map(pot_value, 0, 1023, 0, 10);
  // 使用pow()函数计算(a+b)^n的结果,并保留两位小数
  float result = pow(A + B, n);
  result = round(result * 100) / 100.0;
  
   // 在LCD显示屏上显示当前的指数n和结果result
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("(a+b)^n = ");
   lcd.print(result);
   
   lcd.setCursor(0,1);
   lcd.print("n = ");
   lcd.print(n);
}

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

// 引入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.5

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

void loop() {
    
    
  // 请求温度传感器读取数据,并获取当前的温度,单位为摄氏度
  sensors.requestTemperatures();
  float temp = sensors.getTempCByIndex(0);
  // 如果温度高于阈值
  if (temp > TEMP_THRESHOLD) {
    
    
    // 使用pow()函数计算LED灯的闪烁频率,并将其映射到合理的范围内
    float freq = pow(temp - TEMP_THRESHOLD, FREQ_EXP);
    freq = constrain(freq, FREQ_MIN, FREQ_MAX);
    // 根据闪烁频率计算闪烁间隔,单位为毫秒
    int interval = 1000 / (2 * freq);
    // 让LED灯闪烁
    digitalWrite(LED_PIN, HIGH);
    delay(interval);
    digitalWrite(LED_PIN, LOW);
    delay(interval);
  }
}

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

// 定义光敏电阻和蜂鸣器的引脚
#define LDR_PIN A0
#define BUZZ_PIN 3
// 定义光敏电阻的读数的范围
#define LDR_MIN 0
#define LDR_MAX 1023
// 定义蜂鸣器的音调的范围,单位为赫兹
#define TONE_MIN 100
#define TONE_MAX 1000
// 定义蜂鸣器的音调的指数系数
#define TONE_EXP 1.2

void setup() {
    
    
  // 设置蜂鸣器为输出模式
  pinMode(BUZZ_PIN, OUTPUT);
}

void loop() {
    
    
  // 读取光敏电阻的模拟值,并将其映射到0-1023范围内
  int ldr_value = analogRead(LDR_PIN);
  ldr_value = map(ldr_value, LDR_MIN, LDR_MAX, 0, 1023);
  // 使用pow()函数计算蜂鸣器的音调,并将其映射到合理的范围内
  int tone_value = pow(ldr_value, TONE_EXP);
  tone_value = map(tone_value, pow(LDR_MIN, TONE_EXP), pow(LDR_MAX, TONE_EXP), TONE_MIN, TONE_MAX);
  
   // 让蜂鸣器发出声音,持续100毫秒,然后停止100毫秒,形成节奏感
   tone(BUZZ_PIN, tone_value);
   delay(100);
   noTone(BUZZ_PIN);
   delay(100);
}

案例四:数值计算:

float radius = 3.5; // 圆的半径

float volume = pow(radius, 3) * PI; // 计算圆的体积

Serial.print("Volume of the sphere: ");
Serial.println(volume);

在此案例中,使用pow()函数计算半径为3.5的球体的体积。然后,将计算结果输出到串口监视器,用于显示或后续的处理。

案例五:信号处理:

int inputSignal = analogRead(A0); // 读取输入信号值

float amplifiedSignal = pow(inputSignal, 2); // 对输入信号进行平方(信号放大)

analogWrite(9, amplifiedSignal); // 输出放大后的信号到PWM引脚

在此案例中,使用pow()函数对输入信号进行平方运算,实现信号放大的效果。然后,将放大后的信号作为PWM信号输出到引脚,以控制外部设备或执行特定的操作。

案例六:控制系统:

float controlInput = 0.6; // 控制输入量

float controlOutput = pow(controlInput, 0.5); // 对控制输入量进行开方

// 使用开方后的结果进行后续的控制处理
// ...

在此案例中,使用pow()函数对控制输入量进行开方运算,以实现控制系统的非线性响应。然后,可以使用开方后的结果进行后续的控制处理,例如进行比较、计算或输出。

案例七:计算圆的面积:

float radius = 5.0; // 圆的半径
float area = PI * pow(radius, 2); // 计算圆的面积

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

void loop() {
    
    
  Serial.print("圆的面积:");
  Serial.println(area);
  delay(1000);
}

在这个例子中,我们使用pow()函数计算圆的面积。底数为半径,指数为2,即半径的平方。

案例八:计算复利:

float principal = 1000; // 本金
float interestRate = 0.05; // 年利率
int duration = 5; // 存款期限(年)
float compoundAmount = principal * pow(1 + interestRate, duration); // 计算复利总额

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

void loop() {
    
    
  Serial.print("复利总额:");
  Serial.println(compoundAmount);
  delay(1000);
}

在这个例子中,我们使用pow()函数计算复利总额。底数为1加上年利率,指数为存款期限。

案例九:控制LED的亮度渐变:

i

nt ledPin = 9; // LED引脚

void setup() {
    
    
  pinMode(ledPin, OUTPUT);
}

void loop() {
    
    
  for (int i = 0; i <= 255; i++) {
    
    
    int brightness = pow(i, 2) / 255; // 计算亮度值
    analogWrite(ledPin, brightness); // 控制LED的亮度
    delay(10);
  }
}

在这个例子中,我们使用pow()函数计算LED的亮度值,通过循环逐渐改变LED的亮度,实现灯光的渐变效果。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/132648602