当前位置:   article > 正文

【雕爷学编程】Arduino 手册之数学运算 ceil()_arduino取整

arduino取整

在这里插入图片描述
在这里插入图片描述
什么是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数学运算 ceil()
ceil()是Arduino中的数学运算函数,用于向上取整,即返回大于或等于给定参数的最小整数。它接受一个参数:待取整的数值,并返回计算结果。它的适用范围:
1)在涉及分页或分组的情况下,使用ceil()函数可以计算出需要的页数或组数。例如,如果有100个数据,每页显示10个,那么需要的页数就是ceil(100/10) = 10。
2)在涉及四舍五入的情况下,使用ceil()函数可以实现向上取整的效果。例如,如果要将1.5元向上取整为2元,那么可以使用ceil(1.5) = 2。
3)在涉及浮点数运算的情况下,使用ceil()函数可以避免出现小数误差或溢出。例如,如果要计算一个浮点数的阶乘,那么可以使用ceil()函数将其转换为整数再进行运算。

应用场景:
1)数据处理:ceil()函数常用于需要对数据进行上取整处理的场景。例如,在测量数据处理中,可能需要将测量结果向上取整到整数,以满足特定的要求。
2)数值调整:在某些应用中,可能需要调整数值以满足特定的要求。ceil()函数可以用于向上调整数值,以满足特定的数值约束条件。
3)界面设计:在涉及界面设计和显示的应用中,可能需要将数值进行舍入,以便正确显示和呈现给用户。ceil()函数可以用于界面设计中的数值舍入操作。

使用ceil()函数时,需要注意以下事项:
1)ceil()函数可以接受整数或浮点数作为参数,但是返回的结果类型与参数类型相同。如果要将结果赋值给不同类型的变量,需要进行类型转换。
2)ceil()函数只能接受一个参数,即被上取整的数值。如果要对多个数值进行上取整,需要分别调用ceil()函数或使用数组或循环结构。
3)ceil()函数使用浮点数运算,所以可能会消耗较多的内存和时间。如果不需要精确到小数点后的位数,可以使用其他方法。

以下是Arduino数学运算ceil()的三个实际运用程序案例:
案例一:使用电位器和LCD显示屏实现分页显示功能。当电位器旋转时,LCD显示屏显示不同的页码和内容。使用ceil()函数计算总页数和当前页码。

// 引入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);
// 定义内容数组,每个元素表示一页的内容
String contents[] = {"Hello", "World", "This", "Is", "A", "Test"};
// 定义内容数组的长度和每页显示的内容个数
#define CONTENTS_LENGTH 6
#define CONTENTS_PER_PAGE 2

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

void loop() {
  // 读取电位器的模拟值,并将其映射到0-1023范围内
  int pot_value = analogRead(POT_PIN);
  pot_value = map(pot_value, 0, 1023, 0, 1023);
  
   // 使用ceil()函数计算总页数和当前页码
   int total_pages = ceil((float)CONTENTS_LENGTH / CONTENTS_PER_PAGE);
   int current_page = ceil((float)pot_value / (1024 / total_pages));
   
   // 在LCD显示屏上显示当前页码和对应的内容
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Page ");
   lcd.print(current_page);
   lcd.print("/");
   lcd.print(total_pages);
   
   lcd.setCursor(0,1);
   for (int i = (current_page - 1) * CONTENTS_PER_PAGE; i < current_page * CONTENTS_PER_PAGE; i++) {
     if (i < CONTENTS_LENGTH) {
       lcd.print(contents[i]);
       lcd.print(" ");
     }
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

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

// 引入DHT库
#include <DHT.h>
// 定义DHT传感器的类型和引脚
#define DHT_TYPE DHT11
#define DHT_PIN A0
// 创建DHT对象
DHT dht(DHT_PIN, DHT_TYPE);
// 定义LED灯的引脚
#define LED_PIN 9
// 定义温度的阈值和范围,单位为摄氏度
#define TEMP_THRESHOLD 30.0
#define TEMP_MIN 30.0
#define TEMP_MAX 50.0
// 定义LED灯的亮度范围,单位为PWM值
#define BRIGHTNESS_MIN 0
#define BRIGHTNESS_MAX 255

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

void loop() {
  // 获取当前的温度,单位为摄氏度
  float temp = dht.readTemperature();
  // 如果温度高于阈值
  if (temp > TEMP_THRESHOLD) {
    // 根据温度计算LED灯的亮度,并将其映射到合理的范围内
    float brightness = (temp - TEMP_THRESHOLD) / (TEMP_MAX - TEMP_THRESHOLD) * (BRIGHTNESS_MAX - BRIGHTNESS_MIN) + BRIGHTNESS_MIN;
    brightness = constrain(brightness, BRIGHTNESS_MIN, BRIGHTNESS_MAX);
    // 使用ceil()函数将亮度转换为整数,并赋值给LED灯
    int brightness_value = ceil(brightness);
    analogWrite(LED_PIN, brightness_value);
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

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

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

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);
  
   // 根据光敏电阻的读数计算蜂鸣器的音调,并将其映射到合理的范围内
   float tone_value = (float)ldr_value / (LDR_MAX - LDR_MIN) * (TONE_MAX - TONE_MIN) + TONE_MIN;
   tone_value = constrain(tone_value, TONE_MIN, TONE_MAX);
   // 使用ceil()函数将音调转换为整数,并赋值给蜂鸣器
   int tone_value = ceil(tone_value);
   tone(BUZZ_PIN, tone_value);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

案例四:数据处理:

float measurement = 8.7; // 测量结果

int roundedMeasurement = ceil(measurement); // 向上取整

Serial.print("Rounded Measurement: ");
Serial.println(roundedMeasurement);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在此案例中,使用ceil()函数对测量结果进行向上取整处理。将测量结果取整到最接近的整数,并将结果输出到串口监视器,用于显示或后续的处理。

案例五:数值调整:

float value = 3.2; // 数值

float adjustedValue = ceil(value); // 向上调整

// 使用调整后的数值进行后续的处理
// ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在此案例中,使用ceil()函数对数值进行向上调整。通过向上取整,将数值调整为大于或等于原始数值的最小整数。然后,可以使用调整后的数值进行后续的处理,例如进行比较、计算或输出。

案例六:界面设计:

float inputValue = 12.6; // 输入数值

float roundedValue = ceil(inputValue); // 向上舍入

// 在界面上显示舍入后的数值
// ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在此案例中,使用ceil()函数对输入数值进行舍入操作。通过向上取整,将数值舍入到大于或等于输入数值的最小整数。然后,可以将舍入后的数值显示在界面上,以满足界面设计的需求。

案例七:计算货币金额:

float price = 9.99; // 商品价格
int totalAmount = ceil(price); // 计算货币金额

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

void loop() {
  Serial.print("货币金额:");
  Serial.println(totalAmount);
  delay(1000);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这个例子中,我们使用ceil()函数计算货币金额。将浮点数商品价格向上取整,得到最接近的整数金额。

案例八:计算需要整数参与的循环次数:

float items = 7.5; // 商品数量
int totalLoops = ceil(items); // 计算循环次数

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

void loop() {
  for (int i = 0; i < totalLoops; i++) {
    // 执行循环操作
    Serial.println("循环中...");
    delay(1000);
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这个例子中,我们使用ceil()函数计算循环次数。将浮点数商品数量向上取整,得到最接近的整数循环次数。

案例九:将浮点数转换为整数索引:

float position = 3.7; // 实际位置
int index = ceil(position); // 将浮点数转换为整数索引

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

void loop() {
  Serial.print("整数索引:");
  Serial.println(index);
  delay(1000);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这个例子中,我们使用ceil()函数将浮点数转换为整数索引。将实际位置向上取整,得到最接近的整数索引。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/617314
推荐阅读
相关标签
  

闽ICP备14008679号