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

在这里插入图片描述
在这里插入图片描述
什么是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数学运算 constrain()
在Arduino编程中,constrain()是一个数学运算函数,用于限制一个值在指定的范围内。它可以确保一个变量的值不超过给定的最小值和最大值,如果超过范围,将返回最小值或最大值。它的适用范围:

1)控制模拟输出的范围,例如PWM信号的占空比,或LED灯的亮度。
2)限制传感器的读数,例如温度或湿度,避免超出有效范围或产生异常值。
3)实现一些数学公式或算法,例如PID控制器的输出,或滤波器的系数。

应用场景:
1)限制传感器数据范围:在Arduino中,常用传感器(如温度传感器、光线传感器等)输出的值可能会超出我们需要的范围。使用constrain()函数可以将传感器数据限制在指定的最小值和最大值之间,以确保数据在可接受的范围内。
2)控制输出范围:有时候需要将某个变量的输出限制在特定的范围内。例如,控制PWM信号的占空比,确保它在0到255之间。使用constrain()函数可以帮助我们确保输出在指定范围内,并防止无效的输出。
3)限制用户输入:当与用户进行交互或接收输入时,需要确保输入的值在合理的范围内。通过使用constrain()函数,可以对用户输入进行有效的限制,以避免无效或不合法的输入。

使用constrain()函数时,需要注意以下事项:
1)constrain()函数的返回值与输入值的数据类型相同。这意味着如果传入的是整数,返回的结果将是整数;如果传入的是浮点数,返回的结果将是浮点数。
2)当最小值大于最大值时,constrain()函数将无法正常工作。因此,在使用函数时需要确保最小值小于等于最大值。
3)constrain()函数只能限制一个值在指定的范围内,无法同时限制多个值。如果需要限制多个值,需要分别调用函数进行限制。
4)constrain()函数可以接受整数或浮点数作为参数,但是返回的结果类型与参数类型相同。如果要将结果赋值给不同类型的变量,需要进行类型转换。
5)constrain()函数只能接受三个参数,分别是被限制的数值,区间的下限和上限。如果要限制多个数值,需要分别调用constrain()函数。
6)constrain()函数不能直接用于复数或字符串等其他类型的数据,如果要限制这些数据的范围,需要使用其他方法或库。

以下是Arduino数学运算constrain()的三个实际运用程序案例:
案例一:使用电位器和继电器控制风扇的开关。当电位器的读数高于设定的阈值时,继电器闭合,风扇开启;当电位器的读数低于设定的阈值时,继电器断开,风扇关闭。使用constrain()函数限制电位器的读数在0到1023之间,防止出现负值或溢出。

// 定义电位器和继电器的引脚
#define POT_PIN A0
#define RELAY_PIN 2
// 定义电位器的阈值
#define THRESHOLD 512

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

void loop() {
    
    
  // 读取电位器的模拟值,并使用constrain()函数限制在0到1023之间
  int pot_value = analogRead(POT_PIN);
  pot_value = constrain(pot_value, 0, 1023);
  // 如果电位器的读数高于阈值
  if (pot_value > THRESHOLD) {
    
    
    // 将继电器设置为高电平,风扇开启
    digitalWrite(RELAY_PIN, HIGH);
  }
  // 如果电位器的读数低于阈值
  else {
    
    
    // 将继电器设置为低电平,风扇关闭
    digitalWrite(RELAY_PIN, LOW);
  }
}

案例二:使用温湿度传感器和LCD显示屏显示当前的温度和湿度。当温度或湿度超出设定的范围时,在LCD显示屏上显示警告信息。使用constrain()函数限制温度和湿度在合理的范围内,避免显示错误或不合理的数据。

// 引入DHT库和LiquidCrystal库
#include <DHT.h>
#include <LiquidCrystal.h>
// 定义DHT传感器的类型和引脚
#define DHT_TYPE DHT11
#define DHT_PIN A0
// 创建DHT对象
DHT dht(DHT_PIN, DHT_TYPE);
// 定义LCD显示屏的引脚
#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_MIN -10.0
#define TEMP_MAX 50.0
#define HUMI_MIN 0.0
#define HUMI_MAX 100.0

void setup() {
    
    
  // 初始化DHT传感器
  dht.begin();
  // 初始化LCD显示屏,设置列数为16,行数为2
  lcd.begin(16, 2);
}

void loop() {
    
    
  // 获取当前的温度和湿度,单位分别为摄氏度和百分比,并使用constrain()函数限制在合理的范围内
  float temp = dht.readTemperature();
  float humi = dht.readHumidity();
  temp = constrain(temp, TEMP_MIN, TEMP_MAX);
  humi = constrain(humi, HUMI_MIN, HUMI_MAX);
  // 在LCD显示屏的第一行显示当前的温度和湿度,保留一位小数
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temp, 1);
  lcd.print(" C");
  lcd.print("   ");
  lcd.print("Humi: ");
  lcd.print(humi, 1);
  lcd.print(" %");
  // 如果温度或湿度超出设定的范围,在LCD显示屏的第二行显示警告信息
  lcd.setCursor(0, 1);
  if (temp == TEMP_MIN || temp == TEMP_MAX || humi == HUMI_MIN || humi == HUMI_MAX) {
    
    
    lcd.print("Warning!");
  }
  else {
    
    
    lcd.print("Normal. ");
  }
}

案例三:使用陀螺仪和舵机实现平衡小车功能。当小车倾斜时,舵机转动相反的角度,使小车恢复平衡。使用constrain()函数限制舵机的角度在0到180度之间,防止过度转动造成损坏。

// 引入Wire库和Servo库
#include <Wire.h>
#include <Servo.h>
// 定义陀螺仪的地址
#define GYRO_ADDR 0x68
// 创建舵机对象
Servo servo;
// 定义舵机的引脚和初始角度
#define SERVO_PIN 9
#define INIT_ANGLE 90

void setup() {
    
    
  // 初始化串口通信,设置波特率为9600
  Serial.begin(9600);
  // 初始化I2C通信,加入I2C总线
  Wire.begin();
  // 向陀螺仪发送指令,激活陀螺仪
  Wire.beginTransmission(GYRO_ADDR);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  // 将舵机连接到第9号引脚,并转动到初始角度
  servo.attach(SERVO_PIN);
  servo.write(INIT_ANGLE);
}

void loop() {
    
    
   // 向陀螺仪发送指令,请求读取数据
   Wire.beginTransmission(GYRO_ADDR);
   Wire.write(0x3B);
   Wire.endTransmission(false);
   // 接收陀螺仪返回的数据,共14个字节
   Wire.requestFrom(GYRO_ADDR,14,true); 
   int acc_x = Wire.read()<<8|Wire.read(); 
   int acc_y = Wire.read()<<8|Wire.read(); 
   int acc_z = Wire.read()<<8|Wire.read(); 
   int temp = Wire.read()<<8|Wire.read(); 
   int gyro_x = Wire.read()<<8|Wire.read(); 
   int gyro_y = Wire.read()<<8|Wire.read(); 
   int gyro_z = Wire.read()<<8|Wire.read(); 
  
   // 计算X轴方向上的倾斜角度,单位为度,范围为-90到90
   float angle_x = atan2(acc_x, sqrt(acc_y * acc_y + acc_z * acc_z)) * RAD_TO_DEG;
   
   // 根据倾斜角度计算舵机的目标角度,使其与倾斜角度相反,实现平衡效果
   int target_angle = INIT_ANGLE - angle_x;
   
   // 使用constrain()函数限制舵机的角度在0到180度之间
   target_angle = constrain(target_angle,0,180);
   
   // 将舵机转动到目标角度
   servo.write(target_angle);
}

案例四:限制传感器数据范围:

const int sensorPin = A0;
const int minValue = 0;
const int maxValue = 1023;

void setup() {
    
    
  // ...
}

void loop() {
    
    
  int sensorValue = analogRead(sensorPin);  // 读取传感器数据
  int constrainedValue = constrain(sensorValue, minValue, maxValue);  // 限制传感器数据范围

  // 在指定范围内处理传感器数据
  // ...
}

在这个案例中,analogRead()函数用于读取模拟传感器的值。constrain()函数将传感器数据限制在0到1023之间,确保数据在可接受的范围内。

案例五:控制PWM信号范围:

const int outputPin = 9;
const int minValue = 0;
const int maxValue = 255;

void setup() {
    
    
  pinMode(outputPin, OUTPUT);
  // ...
}

void loop() {
    
    
  int inputValue = analogRead(A0);  // 读取输入值
  int constrainedValue = constrain(inputValue, minValue, maxValue);  // 限制输入值范围

  analogWrite(outputPin, constrainedValue);  // 控制PWM输出信号范围
  // ...
}

在这个案例中,analogRead()函数用于读取输入值(例如通过旋钮或电位器输入的值)。constrain()函数将输入值限制在0到255之间,确保输出值在有效的PWM范围内。

案例六:限制用户输入:

int userInput = 0;
const int minValue = 1;
const int maxValue = 10;

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

void loop() {
    
    
  if (Serial.available() > 0) {
    
    
    userInput = Serial.parseInt();  // 从串口读取用户输入
    int constrainedValue = constrain(userInput, minValue, maxValue);  // 限制用户输入范围

    // 处理限制后的用户输入
    // ...
  }
}

在这个案例中,通过串口与用户进行交互,读取用户输入的值。constrain()函数将用户输入限制在1到10之间,确保输入值在有效范围内。然后可以对限制后的用户输入进行进一步处理或执行相应的操作。

案例七:舵机角度限幅

int angle = 120;
int minAngle = 0;
int maxAngle = 180;

angle = constrain(angle, minAngle, maxAngle);

将舵机角度限制在0-180度范围内。

案例八:PWM占空比限幅

int brightness = 255;
int minBright = 0;
int maxBright = 255;

brightness = constrain(brightness, minBright, maxBright);

将亮度PWM限制在0-255范围内。

案例九:温度值限幅

float temperature = 50.5;
float minTemp = 0;
float maxTemp = 100;

temperature = constrain(temperature, minTemp, maxTemp);

将温度值限制在0-100°C范围内。
constrain()函数可以很方便地限制一个变量的值处于特定范围,常用于舵机控制,PWM设置以及传感器转换等场景。

总结:
constrain()函数是一个有用的数学运算函数,在Arduino编程中经常用于限制变量的值在指定的范围内。它适用于限制传感器数据范围、控制输出范围和限制用户输入等场景。在使用constrain()函数时,需要注意参数的数据类型和最小值与最大值的关系,以确保函数的正常工作。通过合理地使用constrain()函数,可以增强程序的稳定性和可靠性。

在这里插入图片描述

猜你喜欢

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