Kontroler Kipas Smart Lemari AV – Arduino Nano, DHT11, dan Relay
Tentang Proyek
Penerima AV saya terlalu panas jadi saya ingin menambahkan kipas lemari sebelum panas musim panas. Pada awal saya mencoba menemukan sumber DC 5-12v di luar penerima yang menyala hanya ketika penerima menyala, tetapi hanya dapat menemukan beberapa tempat di dalam penerima. Saya juga ingin kipas tetap berjalan untuk sementara setelah penerima dimatikan, dan mensizing kapasitor untuk itu mulai menjadi sulit.
Suhu ruangan 75F, suhu lemari 109F
Saya melihat kipas pengendali suhu di amazon dan semuanya terlihat lebih mahal dari yang saya pikir seharusnya. Semuanya lebih dari $30 dan pada dasarnya hanya kipas, probe suhu, dan relay...Saya mencari di kotak bagian saya dan sudah memiliki semua itu.
Yep, itu sudah cukup
Pertama saya menulis sketsa kecil untuk Arduino Nano Cina $2. Ditambahkan sensor suhu DHT11 dan relay DC 5v dan bekerja dengan sempurna.
Selanjutnya saya harus menemukan kipas PC lama yang akan berputar dan memindahkan udara hanya dengan 5v karena saya ingin seluruhnya didayai oleh charger telepon USB lama. Saya menemukan dua kipas 80mm dan satu kipas 120mm yang masih memindahkan cukup CFM pada 5v dan tetap di bawah 200mA, jadi saya memotong koneksi molex dan menambahkannya sebagai USB.
Semua berfungsi pada breadboard, jadi akhirnya saya menambahkan beberapa LED status dan buzzer piezo untuk alarm overheat. Semuanya pas dengan baik ke dalam kotak proyek kecil yang saya miliki.
Rapi dan kompak, dan mencampur dengan perangkat AV lainnya
LED status: kiri atas=daya (hijau); kiri bawah=suhu OK (hijau); tengah=kipas menyala (oranye); kanan=overheat (merah)
Kontroler melalui POST startup untuk menunjukkan semua kipas, LED, dan alarm piezo berfungsi
Uji Coba Diri saat Hidup
Sketsa Arduino:
Kontroler mengambil suhu rata-rata selama 30 detik. Jika di atas 95F, kipas menyala selama 5 menit sebelum memeriksa lagi. Jika suhu di atas 120F, alarm berbunyi sementara kipas terus berjalan. Alarm berbunyi setiap 30 detik sampai suhu kembali di bawah 120F.
Dalam praktiknya, kipas menyala sekitar 2 menit setelah penerima dinyalakan dan akan berjalan selama waktu menyala. Setelah mematikan pusat media, kipas berjalan minimal 5 menit sebelum suhu di bawah 95F. Sejauh ini alarm overheat belum terpicu.
Jika saya akan melakukan proyek ini lagi, saya akan mencoba mengganti Arduino Nano dengan ATtiny85 dan relay dengan MOSFET. Ini akan memiliki bentuk yang jauh lebih kecil dan juga memungkinkan saya menggunakan PWM untuk mengontrol kecepatan kipas.
Kode
FanTempController
FanTempControllerC/C++
Sketsa Arduino yang menggunakan pembacaan suhu rata-rata dari sensor DHT11 untuk menyala kipas melalui relay.
// Temperature controller for A/V Cabinet // Fan is controlled by 10A relay connected to a 12v (computer) or 5v (USB) Fan // Piezo alarm for alternate overheating alert int FANTEMP = 95; // High temp at which the fan turns on (90*F) int ALARMTEMP = 120; // Overheating temp (120*F) int FANLED = 2; // Pin for fan "on" LED int TEMPOK = 3; // LED for when temp is under FANTEMP int ALARMLED = 4; // Alarm LED int ALARMPIN = 7; // Audible alarm for overheating // DHTPIN = 8; (defined below) int FANPIN = 9; // Relay for fan switch #include "DHT.h" // Written by ladyada, public domain #define DHTPIN 8 // DHT Sensor // Uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Initialize DHT sensor for normal 16mhz Arduino DHT dht(DHTPIN, DHTTYPE); // NOTE: For working with a faster chip, like an Arduino Due or Teensy, you // might need to increase the threshold for cycle counts considered a 1 or 0. // You can do this by passing a 3rd parameter for this threshold. It's a bit // of fiddling to find the right value, but in general the faster the CPU the // higher the value. The default for a 16mhz AVR is a value of 6. For an // Arduino Due that runs at 84mhz a value of 30 works. // Example to initialize DHT sensor for Arduino Due: //DHT dht(DHTPIN, DHTTYPE, 30); // Readings used for average const int numReadings = 10; // Set variables to zero float avetemp = 0; float temp = 0; float checkdelay = 0; void setup() { Serial.begin(9600); Serial.println("Temp Monitor Started"); dht.begin(); pinMode(FANPIN,OUTPUT); pinMode(ALARMPIN,OUTPUT); pinMode(ALARMLED,OUTPUT); pinMode(FANLED,OUTPUT); pinMode(TEMPOK,OUTPUT); digitalWrite(FANPIN, HIGH); digitalWrite(FANLED, HIGH); digitalWrite(ALARMLED, HIGH); digitalWrite(TEMPOK, HIGH); for(int x = 0; x < 5; x++){ // Test Alarm tone(ALARMPIN, 220 * x, 75); delay(100); } Serial.print("Fan Test Started (5 Seconds) "); for(int x = 0; x < 5; x++){ Serial.print("."); delay(1000); } Serial.println("Done"); digitalWrite(FANPIN, LOW); digitalWrite(FANLED, LOW); digitalWrite(ALARMLED, LOW); digitalWrite(TEMPOK, LOW); noTone(ALARMPIN); } void loop() { // Wait a few seconds between measurements. delay(2000); temp = 0; Serial.print("Realtime Temp: \t"); for (int x = 0; x < numReadings; x++){ float f = dht.readTemperature(true); // Read temperature as Fahrenheit Serial.print(f); Serial.print("\t"); temp = f + temp; delay(3000); // delay in between reads for stability } Serial.println(); avetemp = temp / numReadings; // calculate the average Serial.print("Average Temp is "); Serial.println(avetemp); // send it to the computer as ASCII digits // Check if any reads failed and exit early (to try again). if (isnan(temp)) { Serial.println("Failed to read from DHT sensor!"); return; } // Set off alarm if overheating if (avetemp>ALARMTEMP) { digitalWrite(ALARMLED, HIGH); Serial.print("Temperature is over "); Serial.print(ALARMTEMP); Serial.println(", Alarm is on"); for(int x = 0; x < 3; x++){ // Sound the alarm for 5 seconds tone(ALARMPIN, 660, 1000); // Fan should already be running from last loop, if not, it will start right after alarm sounds delay(500); tone(ALARMPIN, 440, 1000); delay(500); } noTone(ALARMPIN); checkdelay = 30000; // Switch the normal 5 min delay to 30 seconds before going through the loop again } else { digitalWrite(ALARMLED,LOW); Serial.print("Temperature is under "); Serial.print(ALARMTEMP); Serial.println(", Alarm is off"); checkdelay = 300000; // Unless temp is over 120*F the fan runs for 5 minutes before temp is checked again } // Turn on fan if cabinet is warm if (avetemp>FANTEMP) { digitalWrite(FANPIN, HIGH); digitalWrite(FANLED, HIGH); digitalWrite(TEMPOK, LOW); Serial.print("Temperature is over "); Serial.print(FANTEMP); Serial.print(", Fan is on (for "); Serial.print(checkdelay / 1000 / 60); Serial.println(" minutes)"); delay(checkdelay); // turn on minimum of 5 min (unless alarm is going off, then it loops after 30 seconds) } else { digitalWrite(FANPIN,LOW); digitalWrite(FANLED,LOW); digitalWrite(TEMPOK,HIGH); Serial.print("Temperature is under "); Serial.print(FANTEMP); Serial.println(", Fan is off"); // When fan is off, Temp is read every 30 seconds } Serial.println(); Serial.println(); }