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

ここに画像の説明を挿入
ここに画像の説明を挿入
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 の算術演算 fmin()
fmin() は Arduino の算術演算関数で、2 つの浮動小数点数の大小を比較し、小さい方の値を返すために使用されます。これは 2 つの引数を取り、比較する 2 つの浮動小数点数を取り、結果として小さい方の数値を返します。適用範囲:
1) 最適化または意思決定の場合、 fmin() 関数を使用して、最悪または最も不利な解決策または計画を見つけます。たとえば、2 つの投資プロジェクトのうち 1 つを選択する場合、 fmin() 関数を使用してリスク率を比較し、リスク率の低い方を選択できます。
2) 制限または制約が関係する場合は、fmin() 関数を使用して、値が特定のしきい値または範囲を超えないようにします。たとえば、モーターの速度を制御する場合、 fmin() 関数を使用して、速度を最大速度以下に制限できます。
3) 比較または並べ替えの場合、 fmin() 関数を使用するとコードまたはロジックを簡素化し、if-else ステートメントやループ構造の使用を回避できます。たとえば、配列内の最小値を見つけたい場合は、 fmin() 関数を使用して配列要素を 1 つずつ比較できます。

主なアプリケーションシナリオ:
1) データ処理とスクリーニング: データ処理では、複数の浮動小数点値のサイズを比較し、さらなる処理のために最小の値を選択する必要がある場合があります。fmin() 関数は、2 つの数値の大きさを比較して小さい方の値を返すことができ、その値をフィルター処理してデータの最小値を抽出するために使用できます。
2) 制御システムとフィードバック機構: 制御システムでは、さまざまな入力信号に応じて適切な制御戦略または動作を選択する必要があることがよくあります。fmin() 関数を使用すると、さまざまなパラメータまたは測定値のサイズを比較し、最小値に基づいて適切な制御戦略またはアクションを選択できます。
3) 数値解析および最適化アルゴリズム: 数値解析および最適化アルゴリズムでは、異なる値または評価指標の大きさを比較し、最小値に基づいて決定または調整を行う必要があることがよくあります。fmin() 関数は、最小値と関連する決定を決定するために 2 つの数値の大きさを比較するのに便利です。

fmin() 関数を使用する場合は、次の点に注意する必要があります。
1) fmin() 関数はパラメータとして整数または浮動小数点数を受け入れることができますが、返される結果の型はパラメータの型と同じです。結果を別の型の変数に代入する場合は、型変換が必要です。
2) fmin() 関数は 2 つのパラメータ、つまり比較される値 x と y を受け入れる必要があります。複数の値の最小値を比較する場合は、 fmin() 関数をネストして呼び出すか、配列またはループ構造を使用する必要があります。
3) fmin() 関数は浮動小数点演算を使用するため、丸め誤差やオーバーフローが発生する可能性があります。より正確な計算や大規模な計算が必要な場合は、他のライブラリやメソッドを使用できます。

以下に、Arduino 数学演算 fmin() の 3 つの実際的な応用例を示します。
ケース 1: 温度センサーと 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);
}

ケース 2: フォトレジスタと 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);
}

ケース 3: 温湿度センサーとファンを使用して温湿度制御機能を実現します。温湿度センサーが温度と湿度が設定したしきい値より低いことを検出すると、ファンが停止します。ファンの速度は温度と湿度の低下とともに低下し、その関係は線形です。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);
   }
}

ケース 4: 最小値を見つける:

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() 関数を使用して 2 つの数値 a と b を比較し、小さい方の値を返します。このようにして、これら 2 つの数値の最小値を見つけることができます。

ケース 5: 最小値を選択します。

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() 関数を使用して 2 つの数値 value1 と value2 を比較し、小さい方の値を選択します。選択された値が閾値より小さいかどうかに応じて、対応する判断および処理が実行される。

ケース 6: シミュレーション シミュレーション:

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() 関数を使用して 2 つの入力値 input1 と input2 を比較し、小さい方の値を出力として選択します。これにより、さまざまな入力条件下の信号をアナログ シミュレーションで処理できるようになります。

ケース 7: データ処理:

#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() 関数を使用して、2 つの浮動小数点数 data1 と data2 の大きさを比較し、小さい方の値を返します。これにより、データ内の最小値をフィルタリングして抽出することが簡単になります。

ケース 8: 制御システム:

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と比較し、小さい方の値を制御動作の補正量として選択する。このようにして、入力信号の違いに応じて適切な制御戦略を選択することができます。

ケース 9: 数値解析:

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() 関数 value1 を使用して 2 つの浮動小数点数が比較されます。 fmin() は、2 つの浮動小数点数の小さい方の値を返す Arduino の数学関数です。2 つのパラメータを受け取り、そのうちの小さい方を返します。

ここに画像の説明を挿入

おすすめ

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