注釈
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
参加する理由は?
エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。
独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。
特別割引:最新製品の独占割引をお楽しみください。
祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[ ここ]をクリックして今すぐ参加しましょう!
スマートファン
このArduinoプロジェクトでは、ファンの速度が自動的に調整され、温度を適切な範囲内に保ちます。 また、ユーザーはボタンを通じて手動モードに入り、ファンを最大速度で操作できます。
必要なコンポーネント
このプロジェクトには以下のコンポーネントが必要です。
全体のキットを購入すると便利です。こちらがリンクです:
名称 |
このキットのアイテム数 |
リンク |
|---|---|---|
Elite Explorer Kit |
300+ |
以下のリンクから別々に購入することもできます。
コンポーネント紹介 |
購入リンク |
|---|---|
- |
|
- |
|
- |
配線図
回路図
コード
注釈
ファイル
06_smart_fan.inoをelite-explorer-kit-main\fun_project\06_smart_fanのパスから直接開くことができます。または、このコードをArduino IDEにコピーしてください。
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}
どのように動作しますか?
以下はコードのステップバイステップの説明です:
定数と変数の定義:
様々なハードウェア接続用のピンを定義するために
#defineを使用します。TEMP_THRESHOLDは25°Cと定義され、これはファンを起動する温度のしきい値です。manualMode:手動モードかどうかを示すブール変数。setup():関連するピンのモード(出力、入力、プルアップ付き入力)を設定します。 初期状態は自動モードなので、
LED_AUTOが点灯し、LED_MANUALは消灯しています。loop():ボタンの状態を監視します。ボタンが押されると、モードが切り替わり、LEDの状態が変わります。 手動モードでは、ファンは最大速度で稼働します。 自動モードでは、まず温度センサーからの電圧値を読み取り、それを温度値に変換します。 温度がしきい値を超えると、ファンの速度は温度に基づいて調整されます。
voltageToTemperature():温度センサーからの電圧値を摂氏の温度値に変換するための補助関数です。 この関数は、サーミスタの標準式を使用して温度を推定します。 戻り値は摂氏です。