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

在这里插入图片描述
在这里插入图片描述
什么是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数学运算 fmin()
fmin()是Arduino中的数学运算函数,用于比较两个浮点数的大小,并返回较小的数值。它接受两个参数:待比较的两个浮点数,并返回较小的数值作为结果。它的适用范围:
1)在涉及最优化或决策的情况下,使用fmin()函数可以找出最差或最不利的解或方案。例如,如果要在两个投资项目中选择一个,那么可以使用fmin()函数比较它们的风险率,选择风险率较低的一个。
2)在涉及限制或约束的情况下,使用fmin()函数可以保证数值不高于某个阈值或范围。例如,如果要控制一个电机的转速,那么可以使用fmin()函数限制转速不高于最大转速。
3)在涉及比较或排序的情况下,使用fmin()函数可以简化代码或逻辑,避免使用if-else语句或循环结构。例如,如果要找出一个数组中的最小值,那么可以使用fmin()函数逐个比较数组元素。

主要应用场景:
1)数据处理和筛选:在数据处理中,可能需要比较多个浮点数值的大小,并选择其中最小的值进行进一步处理。fmin()函数可以方便地比较两个数的大小并返回较小的那个值,用于筛选和提取数据中的最小值。
2)控制系统和反馈机制:在控制系统中,常常需要根据不同的输入信号选择适当的控制策略或动作。fmin()函数可以用于比较不同参数或测量值的大小,根据最小值选择合适的控制策略或动作。
3)数值分析和优化算法:在数值分析和优化算法中,经常需要比较不同的数值或评估指标的大小,并根据最小值进行决策或调整。fmin()函数可以方便地比较两个数的大小,用于确定最小值和相关决策。

使用fmin()函数时,需要注意以下事项:
1)fmin()函数可以接受整数或浮点数作为参数,但是返回的结果类型与参数类型相同。如果要将结果赋值给不同类型的变量,需要进行类型转换。
2)fmin()函数需要接受两个参数,即被比较的数值x和y。如果要比较多个数值中的最小值,需要嵌套调用fmin()函数或使用数组或循环结构。
3)fmin()函数使用浮点数运算,所以可能会产生舍入误差或溢出。如果需要更精确或更大范围的计算,可以使用其他库或方法。

以下是Arduino数学运算fmin()的三个实际运用程序案例:
案例一:使用温度传感器和LCD显示屏实现温度记录功能。每隔一段时间读取一次温度,并显示当前温度和历史最低温度。使用fmin()函数更新历史最低温度。

// 引入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 INTERVAL 1000

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

void loop() {
    
    
  // 定义一个静态变量存储历史最低温度,初始值为正无穷大
  static float min_temp = INFINITY;
  
   // 读取温度传感器的模拟值,并将其转换为温度值,单位为摄氏度
   int temp_value = analogRead(TEMP_PIN);
   float temp = temp_value * (5.0 / 1023.0) * 100.0;
   
   // 使用fmin()函数更新历史最低温度,如果当前温度小于历史最低温度,则替换之
   min_temp = fmin(temp, min_temp);
   
   // 在LCD显示屏上显示当前温度和历史最低温度,保留一位小数
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Temp: ");
   lcd.print(temp,1);
   lcd.print(" C");
   
   lcd.setCursor(0,1);
   lcd.print("Min: ");
   lcd.print(min_temp,1);
   lcd.print(" C");
   
   // 延迟一段时间,再次读取温度
   delay(INTERVAL);
}

案例二:使用光敏电阻和LED灯实现声光控制功能。当光敏电阻检测到光线时,LED灯亮起。LED灯的亮度随着光线的强弱而变化,并呈线性关系。使用fmin()函数限制LED灯的亮度不高于最大亮度。

// 定义光敏电阻和LED灯的引脚
#define LDR_PIN A0
#define LED_PIN 9
// 定义光敏电阻的读数的范围
#define LDR_MIN 0
#define LDR_MAX 1023
// 定义LED灯的亮度的范围,单位为PWM值
#define BRIGHTNESS_MIN 0
#define BRIGHTNESS_MAX 255
// 定义LED灯的最大亮度,单位为PWM值
#define BRIGHTNESS_THRESHOLD 200

void setup() {
    
    
  // 设置LED灯为输出模式,并初始化为低电平
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
}

void loop() {
    
    
  // 读取光敏电阻的模拟值,并将其映射到0-1023范围内
  int ldr_value = analogRead(LDR_PIN);
  ldr_value = map(ldr_value, LDR_MIN, LDR_MAX, 0, 1023);
  
   // 根据光敏电阻的读数计算LED灯的亮度,并将其映射到合理的范围内
   float brightness = (float)ldr_value / (LDR_MAX - LDR_MIN) * (BRIGHTNESS_MAX - BRIGHTNESS_MIN) + BRIGHTNESS_MIN;
   brightness = constrain(brightness, BRIGHTNESS_MIN, BRIGHTNESS_MAX);
   // 使用fmin()函数限制LED灯的亮度不高于最大亮度,避免LED灯过亮或损坏
   brightness = fmin(brightness, BRIGHTNESS_THRESHOLD);
   // 使用ceil()函数将亮度转换为整数,并赋值给LED灯
   int brightness_value = ceil(brightness);
   analogWrite(LED_PIN, brightness_value);
}

案例三:使用温湿度传感器和风扇实现温湿度控制功能。当温湿度传感器检测到温湿度低于设定的阈值时,风扇停止。风扇的转速随着温湿度的降低而降低,并呈线性关系。使用fmin()函数计算温湿度指数。

// 引入DHT库
#include <DHT.h>
// 定义DHT传感器的类型和引脚
#define DHT_TYPE DHT11
#define DHT_PIN A0
// 创建DHT对象
DHT dht(DHT_PIN, DHT_TYPE);
// 定义风扇的引脚
#define FAN_PIN 9
// 定义温湿度的阈值和范围,单位为摄氏度和百分比
#define TEMP_THRESHOLD 20.0
#define TEMP_MIN 10.0
#define TEMP_MAX 30.0
#define HUMIDITY_THRESHOLD 40.0
#define HUMIDITY_MIN 20.0
#define HUMIDITY_MAX 60.0
// 定义风扇的转速范围,单位为PWM值
#define SPEED_MIN 0
#define SPEED_MAX 255

void setup() {
    
    
  // 初始化DHT传感器
  dht.begin();
  // 设置风扇为输出模式,并初始化为低电平
  pinMode(FAN_PIN, OUTPUT);
  digitalWrite(FAN_PIN, LOW);
}

void loop() {
    
    
  // 获取当前的温湿度,单位为摄氏度和百分比
  float temp = dht.readTemperature();
  float humidity = dht.readHumidity();
  
   // 使用fmin()函数计算温湿度指数,单位为摄氏度
   // 温湿度指数等于温度减去湿度乘以一个系数,公式为t_h = t - k * h
   // 其中t_h是温湿度指数,t是温度,h是湿度,k是一个系数
   float temp_humidity = fmin(temp, humidity * K);
   
   // 如果温湿度指数低于阈值,停止风扇
   if (temp_humidity < TEMP_THRESHOLD + HUMIDITY_THRESHOLD) {
    
    
     // 关闭风扇
     digitalWrite(FAN_PIN, LOW);
   }
   else {
    
    
     // 否则,根据温湿度指数计算风扇的转速,并将其映射到合理的范围内
     float speed = (temp_humidity - (TEMP_THRESHOLD + HUMIDITY_THRESHOLD)) / ((TEMP_MAX + HUMIDITY_MAX) - (TEMP_THRESHOLD + HUMIDITY_THRESHOLD)) * (SPEED_MAX - SPEED_MIN) + SPEED_MIN;
     speed = constrain(speed, SPEED_MIN, SPEED_MAX);
     // 使用floor()函数将转速转换为整数,并赋值给风扇
     int speed_value = floor(speed);
     analogWrite(FAN_PIN, speed_value);
   }
}

案例四:寻找最小值:

float a = 12.5; // 数字a
float b = 18.9; // 数字b
float minNum = fmin(a, b); // 比较a和b,得到较小的值

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

void loop() {
    
    
  Serial.print("较小的值:");
  Serial.println(minNum);
  delay(1000);
}

在这个例子中,我们使用fmin()函数比较两个数字a和b,并返回较小的值。这样我们就能找到这两个数字中的最小值。

案例五:选择最小值:

float value1 = 5.7; // 数值1
float value2 = 9.2; // 数值2
float threshold = 7.0; // 阈值
float selectedValue = fmin(value1, value2); // 比较value1和value2,得到较小的值

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

void loop() {
    
    
  if (selectedValue < threshold) {
    
    
    Serial.println("选择的值小于阈值");
  } else {
    
    
    Serial.println("选择的值大于或等于阈值");
  }
  delay(1000);
}

在这个例子中,我们使用fmin()函数比较两个数值value1和value2,并选择较小的值。根据选择的值是否小于阈值,进行相应的判断和处理。

案例六:模拟仿真:

float input1 = 3.2; // 输入1
float input2 = 4.8; // 输入2
float output = 0.0; // 输出

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

void loop() {
    
    
  output = fmin(input1, input2); // 比较输入1和输入2,得到较小的值
  Serial.print("输出:");
  Serial.println(output);
  delay(1000);
}

在这个例子中,我们使用fmin()函数比较两个输入值input1和input2,并选择较小的值作为输出。这样可以在模拟仿真中处理不同输入情况下的信号。

案例七:数据处理:

#include <math.h>

float data1 = 10.5;
float data2 = 15.2;

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

void loop() {
    
    
  float minData = fmin(data1, data2); // 比较并获取最小值

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

在这个案例中,使用fmin()函数比较两个浮点数data1和data2的大小,并返回较小的那个值。这样可以方便地筛选和提取数据中的最小值。

案例八:控制系统:

float setpoint = 50.0;
float input = 40.0;
float error = 0.0;

void setup() {
    
    
  // ...
}

void loop() {
    
    
  error = setpoint - input;

  if (error < 0) {
    
    
    float correction = fmin(error * 0.1, -1.0); // 根据误差大小选择控制策略
    // 执行相应的控制动作
    // ...
  }
  // ...
}

在这个案例中,使用fmin()函数根据误差大小选择合适的控制策略。根据误差error的值,将其乘以一个比例因子0.1并与-1.0进行比较,选择较小的值作为控制动作的修正量。这样可以根据输入信号的差异选择适当的控制策略。

案例九:数值分析:

float value1 = 10.5;
float value2 = 15.2;
float threshold = 12.0;

void setup() {
    
    
  // ...
}

void loop() {
    
    
  float minValue = fmin(value1, value2); // 比较并获取最小值

  if (minValue < threshold) {
    
    
    // 根据最小值进行进一步的数值分析和优化算法
    // ...
  }
  // ...
}

在这个案例中,使用fmin()函数比较两个浮点数value1fmin()是Arduino中的数学运算函数,用于返回两个浮点数中的较小值。它接受两个参数并返回其中较小的那个值。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/132652224
今日推荐