注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ ここ]をクリックして今すぐ参加しましょう!

スマートファン

このArduinoプロジェクトでは、ファンの速度が自動的に調整され、温度を適切な範囲内に保ちます。 また、ユーザーはボタンを通じて手動モードに入り、ファンを最大速度で操作できます。

必要なコンポーネント

このプロジェクトには以下のコンポーネントが必要です。

全体のキットを購入すると便利です。こちらがリンクです:

名称

このキットのアイテム数

リンク

Elite Explorer Kit

300+

Elite Explorer Kit

以下のリンクから別々に購入することもできます。

コンポーネント紹介

購入リンク

Arduino Uno R4 WiFi

-

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

LED

購入

ボタン

購入

サーミスター

購入

DCモーター

購入

TA6586 - モータードライバーIC

-

電源モジュール

-

配線図

../_images/06_smart_fan_bb.png

回路図

../_images/06_smart_fan_schematic.png

コード

注釈

  • ファイル 06_smart_fan.inoelite-explorer-kit-main\fun_project\06_smart_fan のパスから直接開くことができます。

  • または、このコードをArduino IDEにコピーしてください。

06_smart_fan.ino
 1/*
 2  This code controls a DC motor fan based on temperature readings from a thermistor. 
 3  It includes a manual override feature using a button. In automatic mode, the fan speed 
 4  is controlled according to the temperature. In manual mode, the fan runs at full speed. 
 5  LEDs are used to indicate the current mode (auto or manual).
 6
 7  Board: Arduino Uno R4 
 8  Component: LED, button, thermistor, and DC motor.
 9*/
10
11// Pin assignments
12#define MOTOR_PIN 9         // PWM compatible pin for DC motor
13#define TEMP_SENSOR_PIN A0  // Analog pin for thermistor
14#define BUTTON_PIN 2        // Digital pin for button
15#define LED_AUTO 3          // Digital pin for AUTO mode LED
16#define LED_MANUAL 4        // Digital pin for MANUAL mode LED
17
18#define TEMP_THRESHOLD 25  // Temperature threshold for fan activation in Celsius
19
20bool manualMode = false;
21
22void setup() {
23
24  Serial.begin(9600);
25
26  // Set pin modes
27  pinMode(MOTOR_PIN, OUTPUT);
28  pinMode(TEMP_SENSOR_PIN, INPUT);
29  pinMode(BUTTON_PIN, INPUT_PULLUP);
30  pinMode(LED_AUTO, OUTPUT);
31  pinMode(LED_MANUAL, OUTPUT);
32
33  // Initialize LEDs
34  digitalWrite(LED_AUTO, HIGH);  // Auto mode is the default
35  digitalWrite(LED_MANUAL, LOW);
36}
37
38void loop() {
39  static bool lastButtonState = HIGH;  // Last state of the button
40
41  // Check for button press
42  bool currentButtonState = digitalRead(BUTTON_PIN);
43  if (currentButtonState == LOW && lastButtonState == HIGH) {
44    manualMode = !manualMode;  // Toggle mode
45    // Update LEDs based on mode
46    if (manualMode) {
47      digitalWrite(LED_AUTO, LOW);
48      digitalWrite(LED_MANUAL, HIGH);
49    } else {
50      digitalWrite(LED_AUTO, HIGH);
51      digitalWrite(LED_MANUAL, LOW);
52    }
53    delay(200);  // Debounce delay
54  }
55  lastButtonState = currentButtonState;
56
57  // Fan control logic
58  if (manualMode) {
59    analogWrite(MOTOR_PIN, 255);  // Full speed in manual mode
60  } else {
61    float voltage = analogRead(TEMP_SENSOR_PIN) * 5.0 / 1023.0;
62    float temperature = voltageToTemperature(voltage);  // Convert voltage to temperature
63    if (temperature > TEMP_THRESHOLD) {
64      // Scale fan speed based on temperature
65      analogWrite(MOTOR_PIN, map(temperature, TEMP_THRESHOLD, 40, 100, 255));
66    } else {
67      analogWrite(MOTOR_PIN, 0);  // Turn off the fan
68    }
69  }
70}
71
72
73// Convert voltage reading from thermistor to temperature in Celsius
74float voltageToTemperature(float voltage) {
75  // Define constants
76  const float referenceResistor = 10000;  // the 'other' resistor
77  const float beta = 3950;                // Beta value (Typical Value)
78  const float nominalTemperature = 25;    // Nominal temperature for calculating the temperature coefficient
79  const float nominalResistance = 10000;  // Resistance value at nominal temperature
80
81  // Convert the reading to resistance
82  float Rt = referenceResistor * (5.0 - voltage) / voltage;
83
84  // Use the Beta parameter equation to calculate temperature in Kelvin
85  float tempK = 1 / (((log(Rt / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));
86
87  // Convert to Celsius
88  float tempC = tempK - 273.15;
89
90  // Print temperature in Celsius to the Serial Monitor
91  Serial.print("Temp: ");
92  Serial.print(tempC);
93  Serial.println(" degree Celsius");
94
95  // Convert to Fahrenheit
96  // float tempF = tempC * 1.8 + 32;
97
98  return tempC;
99}

どのように動作しますか?

以下はコードのステップバイステップの説明です:

  1. 定数と変数の定義:

    様々なハードウェア接続用のピンを定義するために #define を使用します。 TEMP_THRESHOLD は25°Cと定義され、これはファンを起動する温度のしきい値です。 manualMode:手動モードかどうかを示すブール変数。

  2. setup()

    関連するピンのモード(出力、入力、プルアップ付き入力)を設定します。 初期状態は自動モードなので、 LED_AUTO が点灯し、 LED_MANUAL は消灯しています。

  3. loop()

    ボタンの状態を監視します。ボタンが押されると、モードが切り替わり、LEDの状態が変わります。 手動モードでは、ファンは最大速度で稼働します。 自動モードでは、まず温度センサーからの電圧値を読み取り、それを温度値に変換します。 温度がしきい値を超えると、ファンの速度は温度に基づいて調整されます。

  4. voltageToTemperature()

    温度センサーからの電圧値を摂氏の温度値に変換するための補助関数です。 この関数は、サーミスタの標準式を使用して温度を推定します。 戻り値は摂氏です。