【貂蝉がプログラミングを学ぶ】Arduinoマニュアルの数学演算floor()

ここに画像の説明を挿入
ここに画像の説明を挿入
Arduinoとは何ですか?
Arduino は、シンプルなハードウェアとソフトウェアでさまざまな創造的なプロジェクトを作成できるオープンソースの電子プロトタイピング プラットフォームです。初心者でも専門家でも、Arduino は無限の可能性を提供します。Arduino を使用してセンサー、照明、モーター、ロボット、IoT デバイスなどを制御できます。思いつく限り、Arduino はそれを実現するのに役立ちます。

Arduino についてさらに詳しく知りたい場合は、Arduino の公式 Web サイトにアクセスしてください。そこには、参考となる豊富なリソースとチュートリアルがあります。また、Arduino コミュニティに参加して、世界中の愛好家、学生、デザイナー、エンジニアとアイデアや経験を交換することもできます。さらに、Arduino のオンライン プログラミング ツールを使用して、クラウドにコードを作成し、開発ボードにアップロードすることもできます。

Arduino は、幅広い用途と可能性を備え、常に進化する革新的なプラットフォームです。このマニュアルが皆様の Arduino への興味と熱意を刺激し、Arduino がもたらす創造性と楽しさを楽しんでいただければ幸いです。

ここに画像の説明を挿入

Wikipedia の定義
Arduino は、ユーザーがインタラクティブな組み込みプロジェクトを作成するためのオープンソースの組み込みハードウェア プラットフォームです。さらに、Arduino はオープンソース ハードウェアおよびオープンソース ソフトウェア企業として、プロジェクトとユーザー コミュニティの両方を持っています。同社は、Arduino ボードと関連アクセサリを設計および製造しています。これらの製品は、GNU Lesser General Public License (LGPL) または GNU General Public License (GPL) に基づいてライセンスされたオープン ソース ハードウェアおよびソフトウェアの下で配布されており、Arduino を使用すると、誰でも Arduino ボードを構築してソフトウェアを配布できます。Arduino ボードは、事前に組み立てられた状態で市販されているか、DIY キットとして購入されています。

2005 年に導入された Arduino は、イタリアのイヴレーア地方にあるイヴレーア インタラクティブ デザイン研究所の学生として設計されました。その目的は、センサーを使用して相互作用するインタラクティブ デバイスを低コストで簡単に構築できる方法を初心者や専門家に提供することです。環境や設置の仕方により異なります。初心者や愛好家は、Arduino を使用して、センサー、単純なロボット、サーモスタット、モーション検出器などのデバイスを作成できます。

Arduino という名前は、プロジェクトの創設者の何人かがよくたむろしていたイタリアのイヴレーアにあるバーに由来しています。このバーの名前は、イヴレーア辺境の伯爵であり、1002 年から 1014 年までイタリア王であったイヴレーアのアルドゥインにちなんで名付けられました。

ここに画像の説明を挿入

17. Arduino の算術演算 Floor()
Floor() は Arduino の算術演算関数で、切り捨て、つまり指定された値以下の最大の整数を取るために使用されます。丸められる値という 1 つのパラメータを受け取り、計算の結果を返します。適用範囲:
1) ページングまたはグループ化の場合、floor() 関数を使用して、必要なページまたはグループの数を計算します。たとえば、データが 100 個あり、各ページに 9 個が表示される場合、必要なページ数は、floor(100/9) + 1 = 12 となります。
2) 丸めが含まれる場合は、floor() 関数を使用して切り捨ての効果を実現します。たとえば、1.5 元を切り捨てて 1 元にしたい場合は、floor(1.5) = 1 を使用できます。
3) 浮動小数点演算の場合は、floor() 関数を使用して、小数点エラーやオーバーフローを回避します。たとえば、浮動小数点数の階乗を計算する場合は、演算を実行する前に、floor() 関数を使用して整数に変換できます。

アプリケーション シナリオ:
1) データ処理: Floor() 関数は、浮動小数点数を切り捨てる必要があるシナリオでよく使用されます。たとえば、データの取得と処理では、整数の結果を得るために浮動小数点数の小数部分を四捨五入する必要がある場合があります。
2) 数学的演算: 一部の数学的演算では、計算要件を満たすために浮動小数点数を四捨五入する必要があります。Floor() 関数は、離散数学、幾何学、最適化アルゴリズムなどの分野での演算などの場合に使用できます。
3) 数値変換: 浮動小数点数を整数に変換する必要がある場合がありますが、丸めは望ましくありません。Floor() 関数は、下方丸めを実行し、浮動小数点数をそれ以下の最も近い整数に変換できます。

Floor() 関数を使用する場合は、次の点に注意する必要があります。
1) Floor() 関数はパラメータとして整数または浮動小数点数を受け入れることができますが、返される結果の型はパラメータの型と同じです。結果を別の型の変数に代入する場合は、型変換が必要です。
2) Floor() 関数は、切り捨てられた値である 1 つのパラメータのみを受け入れることができます。複数の値を丸める場合は、floor() 関数を個別に呼び出すか、配列またはループ構造を使用する必要があります。
3) Floor() 関数は浮動小数点演算を使用するため、より多くのメモリと時間を消費する可能性があります。小数点以下の桁数が必要ない場合は、他の方法を使用できます。

以下に、Arduino 数学演算 Floor() の 3 つの実際的な応用例を示します。
ケース 1: ポテンショメータと LCD ディスプレイを使用してページング表示機能を実現します。ポテンショメータを回転させると、LCD ディスプレイに異なるページ番号と内容が表示されます。総ページ数と現在のページ番号を計算するには、floor() 関数を使用します。

// 引入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显示屏,并清屏
  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);
  
   // 使用floor()函数计算总页数和当前页码
   int total_pages = floor((float)CONTENTS_LENGTH / CONTENTS_PER_PAGE) + 1;
   int current_page = floor((float)pot_value / (1024 / total_pages)) + 1;
   
   // 在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(" ");
     }
   }
}

ケース 2: 温度センサーと LED ライトを使用して温度表示機能を実現します。温度が設定されたしきい値より高い場合、LED が点灯します。LED ランプの明るさは温度の上昇とともに増加し、直線的な関係があります。LED ライトの輝度値を計算するには、floor() 関数を使用します。

// 引入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);
    // 使用floor()函数将亮度转换为整数,并赋值给LED灯
    int brightness_value = floor(brightness);
    analogWrite(LED_PIN, brightness_value);
  }
}

ケース 3: フォトレジスタとブザーを使用して音と光の制御機能を実現します。フォトレジスタが光を感知するとブザーが鳴ります。音のピッチは光の強さに応じて直線的に変化します。ピッチはfloor()関数を使用して計算されます。

// 定义光敏电阻和蜂鸣器的引脚
#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);
   // 使用floor()函数将音调转换为整数,并赋值给蜂鸣器
   int tone_value = floor(tone_value);
   tone(BUZZ_PIN, tone_value);
}

ケース 4: データ処理:

float rawValue = 3.7; // 原始浮点数值

int integerValue = floor(rawValue); // 转换为整数

Serial.print("Integer Value: ");
Serial.println(integerValue);

この場合、floor() 関数を使用して浮動小数点値を整数に変換します。小数部分を切り捨てて、元の値以下の最も近い整数を求めます。最後に、表示または後続の処理のために変換結果をシリアル モニタに出力します。

ケース 5: 数学的演算:

f

loat x = 5.3; // 浮点数值

int y = floor(sqrt(x)); // 对开方结果进行向下取整

Serial.print("Result: ");
Serial.println(y);

この場合、平方根の結果は、floor() 関数を使用して切り捨てられます。浮動小数点数の演算を実行し、floor() 関数を使用して丸めることにより、計算要件を満たす整数の結果を取得できます。最後に、計算結果は表示またはその後の処理のためにシリアル モニターに出力されます。

ケース 6: 数値変換:

float floatValue = 7.9; // 浮点数值

int intValue = floor(floatValue); // 将浮点数值向下取整转换为整数

// 使用转换后的整数进行后续处理
// ...

この場合、floor() 関数を使用して浮動小数点値を切り捨て、整数に変換します。浮動小数点数を整数に変換することで、配列のインデックス付けやデータ型の変換などの特定のニーズを満たすことができます。最後に、変換された整数は後続の処理に使用できます。

ケース 7: スコアを計算する:

float score = 87.9; // 分数
int roundedScore = floor(score); // 向下取整得到分数的整数部分

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

void loop() {
    
    
  Serial.print("分数的整数部分:");
  Serial.println(roundedScore);
  delay(1000);
}

この例では、floor() 関数を使用して小数部の整数部分を計算します。小数以下の最も近い整数、つまり小数の整数部分に切り捨てます。

ケース 8: 離散化時間:

float time = 3.8; // 连续时间
int discreteTime = floor(time); // 向下取整得到离散时间

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

void loop() {
    
    
  Serial.print("离散时间:");
  Serial.println(discreteTime);
  delay(1000);
}

この例では、floor() 関数を使用して連続時間を離散時間に変換します。連続時間 (離散時間) 以下の最も近い整数に切り捨てられます。

ケース 9: 画像処理におけるピクセル操作:

float pixelValue = 145.6; // 像素值
int roundedPixelValue = floor(pixelValue); // 向下取整得到像素的整数值

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

void loop() {
    
    
  Serial.print("像素的整数值:");
  Serial.println(roundedPixelValue);
  delay(1000);
}

この例では、floor() 関数を使用して画像内のピクセル値を処理します。ピクセル値以下の最も近い整数 (ピクセルの整数値) に切り捨てられます。

ケース 10: 数値処理:

#include <math.h>

float value = 3.8;

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

void loop() {
    
    
  int intValue = floor(value);  // 向下取整

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

この場合、floor() 関数を使用して浮動小数点変数の値を切り捨て、value 以下の最も近い整数を取得します。

ケース 11: 数値変換:

float temperature = 25.6;
int rangeMin = 0;
int rangeMax = 100;

void setup() {
    
    
  // ...
}

void loop() {
    
    
  int mappedValue = map(floor(temperature), rangeMin, rangeMax, 0, 255);

  // 使用映射后的值进行其他操作
  // ...
}

この場合、floor() 関数を使用して温度値の値を切り捨て、次に、map() 関数を使用して丸められた温度値を整数の範囲にマップします。これにより、浮動小数点温度が、LED の明るさの制御など、他の操作に使用できる離散整数値に変換されます。

ケース 12: 描画と表示:

#include <Adafruit_ILI9341.h>

Adafruit_ILI9341 tft(TFT_CS, TFT_DC, TFT_RST);

float xPos = 50.5;
float yPos = 70.3;

void setup() {
    
    
  // ...
  tft.begin();
  // ...
}

void loop() {
    
    
  int x = floor(xPos);
  int y = floor(yPos);

  // 在(x, y)坐标处绘制图形或显示内容
  // ...
}

この場合、floor() 関数を使用して浮動小数点座標 xPos および yPos を切り捨て、整数座標を描画および表示操作に使用します。これにより、浮動小数点座標が整数座標に変換され、ピクセル グリッドまたは離散化された表示単位に適合します。

概要:
Floor() 関数は Arduino の算術演算関数であり、切り捨てに使用されます。数値処理、数値変換、図面表示など幅広い用途に使用できます。Floor() 関数を使用する場合、関数が正常に動作するように、データ型の範囲と精度に注意する必要があります。Floor() 関数を適切に使用することで、特定のアプリケーション要件を満たすように値の丸めと変換を実現できます。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_41659040/article/details/132651087