Автоматический вентилятор с ИК-датчиком и датчиком LM35

В этом проекте используется ИК-датчик для включения и выключения вентилятора и датчик LM35 для управления скоростью вентилятора с помощью ШИМ (PWM, англ. pulse-width modulation, Широтно-импульсная модуляция).

Шаг 1. Комплектующие

Для нашего урока по созданию автоматического вентилятора на Ардуино на этот раз потребуется приличное количество деталей и комплектующих. Также ниже мы перечислим основные инструменты для реализации проекта.

Компоненты оборудования:

  • ИК-датчик движения × 1
  • DFRobot Gravity: аналоговый датчик температуры LM35 для Arduino × 1
  • IRF 530 N × 1
  • Линейный регулятор (7805) × 1
  • Резистор 100 Ом × 1
  • Осевой вентилятор, 12 В постоянного тока × 1
  • Кастомная печатная плата × 1
  • Arduino Uno × 1

Ручные инструменты:

  • Паяльник (универсальный)
  • Припой, без свинца
  • Инструмент для зачистки проводов и резак, провода сечением 18-10 AWG / 0,75-4 мм²
  • Ножницы электрика
  • Горячий клеевой пистолет (универсальный)

Конечно же нам понадобится программное обеспечение в виде Arduino IDE.

Шаг 2. Как работает вентилятор

Идея состоит в том, чтобы создать эффективный вентилятор, чтобы при его использовании не нужно было вручную устанавливать скорость и включать/выключать его. Также теперь нам не больше нужно бояться перерасхода электричества в случае если мы забыли выключить вентилятор.

Как это работает:

  1. ИК-датчик в качестве устройства включения/выключения, который обнаруживает движение.
  2. Датчик LM35 в качестве переключателя вентилятора, который оценивает температуру в помещении и когда температура в помещении становится выше, тогда скорость вентилятора, также повышается, и наоборот.
  3. Мы также используем транзистор IRF530N, поскольку напряжение питания составляет 12 Вольт.

Шаг 3. Схема соединения

Схема соединения всех комплектующих представлена выше.

Шаг 4. Код проекта

Код проекта вы можете скопировать или скачать в архиве ниже.

#include <avr/io.h>

//the time when the sensor outputs a low impulse
long unsigned int lowIn;        

//the amount of milliseconds the sensor has to be low
//before we assume all motion has stopped
long unsigned int pause = 500; 

boolean lockLow = true;
boolean takeLowTime; 

const int pSuhu = A0; //inisialisasi pin to control LM35 pin A0
float suhu, outputlm, adc; //tipe data yang memungkinkan memuat angka desimal
int pirPin = 12;            //digital pin connected to the PIR's output
int pirPos = 13;           //connects to the PIR's 5V pin
int kipas = 3;

void setup(){
  Serial.begin(9600);    //begins serial communication
  pinMode(pirPin, INPUT);
  pinMode(pirPos, OUTPUT);
  pinMode(kipas,OUTPUT);
  digitalWrite(pirPos, HIGH);
  pinMode(pSuhu, INPUT); // set pSuhu(LM35) to be INPUT

  while (digitalRead(pirPin) == HIGH) {
    delay(500);
    Serial.print(".");     
  }
  Serial.println("SENSOR ACTIVE");
}
void lm35(){
  adc = analogRead(pSuhu); //save nilai from LM35 to variabel nilaiLM35
  suhu = adc / 2.0479;
  outputlm=adc*4.883;
  if (suhu >= 25)
  {
    analogWrite(kipas,50);
    Serial.println("Kecepatan=50");
  }
  if (suhu >= 30)
   {
    analogWrite(kipas,100); 
    Serial.println("Kecepatan=100");
  }
  if (suhu >= 35)
   {
    analogWrite(kipas,150); 
    Serial.println("Kecepatan=150");
  }
  if (suhu >= 40)
   {
    analogWrite(kipas,200); 
    Serial.println("Kecepatan=200");
  }
  if (suhu >= 45)
   {
    analogWrite(kipas,255); 
    Serial.println("Kecepatan=255");
  }  
 }
void loop(){
  if(digitalRead(pirPin) == HIGH){  //if the PIR output is HIGH, turn servo
    lm35();
    if(lockLow){ 
      //makes sure we wait for a transition to LOW before further output is made
      lockLow = false;           
      Serial.println("---");
      Serial.print("motion detected at ");
      Serial.print(millis()/1000);
      Serial.println(" sec");
      delay(50);
    }        
    takeLowTime = true;
  }

  if(digitalRead(pirPin) == LOW){      
    digitalWrite(kipas,LOW);
    if(takeLowTime){
      lowIn = millis();             //save the time of the transition from HIGH to LOW
      takeLowTime = false;    //make sure this is only done at the start of a LOW phase
    }
   
    //if the sensor is low for more than the given pause,
    //we can assume the motion has stopped
    if(!lockLow && millis() - lowIn > pause){
      //makes sure this block of code is only executed again after
      //a new motion sequence has been detected
      lockLow = true;                       
      Serial.print("motion ended at "); //output
      Serial.print((millis() - pause)/1000);
      Serial.println(" sec");
      delay(50);
    }
  }
  delay(1000);
  Serial.print(", Suhu: ");
  Serial.print(suhu);
  Serial.println(); //send data ASCII + CR,LF (kode enter)
  delay(1000); 
  Serial.print(", ADC: ");
  Serial.print(adc);
  Serial.println(); //send data ASCII + CR,LF (kode enter)
  delay(1000); 
}

Шаг 5. Итоговое видео

На этом всё, наш вентилятор Ардуино готов. Он будет очень актуален к наступающему лету.

Ардуино+