Temperatuuritundlik servolülitus

Eesmärk:

Luua süsteem, mis automaatset juhib kasvuhoone valgustust ja ventilatsiooni, sõltuvalt temperatuurist ja valgusest.


Kasutatud komponendid:

  • TMP36 temperatuuriandur
  • LDR fototakisti (valgusandur)
  • Servo mootor (SG90)
  • RGB LED (lilla valguse jaoks)
  • Arduino Uno
  • Takistid
  • Breadboard ja juhtmed
  • USB toide arvutist

Funktsionaalsus:

Temperatuuripõhine servo juhtimine:

  • ≤ 20°C → servo nurk  → aken suletakse
  • ≥ 30°C → servo nurk 180° → aken avatakse
  • Liikumine on sujuv, sammhaaval.

Valguspõhine valgustus:

  • Kui pime (valgus < 500) → LED süttib (lilla valgus)
  • Kui piisavalt valgust → LED kustub

Olulised tehnilised lahendused:

  • analogRead() andurite lugemiseks
  • map() ja constrain() temperatuuri teisendamiseks servo nurgaks
  • graduaalne servo liikumine: samm-sammuline nurga muutmine
  • analogWrite() RGB LED juhtimiseks
  • Serial.print() andmete kontrollimiseks

Prototüübi ehitus:

Toide tuli arvuti USB kaudu

Kõik komponendid ühendatud breadboardil

RGB LED ühendatud pin’idega (red, green, blue)

TMP36 mõõdab temperatuuri

LDR mõõdab valguse tugevust

Seletus:

Servo mootor keerab 180 kraadile kui temperatuur suurem või võrdleb 35, Servo mootor keerab 0 kraadile kui temperatuur on vähem või võrdleb 22. LED diood põleb kui on pime, ehk kui fototakisti loeb väärtuse suurem kui 100.

Programm:

#include &lt;Servo.h>

//pins
const int tempPin = A0;
const int ldrPin = A1;
const int redPin = 8;
const int bluePin = 9;
const int greenPin = 10;
const int servoPin = 11;

//used vars
float temp = 0.0;
int lightLevel=0;
int targetAngle = 0;
int currentAngle = 0;

//servo obj
Servo myServo;

void setup(){
  	Serial.begin(9600); /////////////
  	
  //Pins setup
  pinMode(ldrPin, INPUT);
  
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  
  myServo.attach(servoPin);
  myServo.write(currentAngle);  // начальная позиция
  
}

float readTemp(){
	int raw = analogRead(tempPin);  //reading the ananlog signal
    float voltage = raw * 5.0 / 1023.0;  //converting to voltage
  	float tempC = (voltage - 0.5) * 100; //Считаем температуру по формуле TMP36
  	return tempC;
}
  
void updateServo(float temp){
  if (temp&lt;=20){
    targetAngle = 0;
  }else if(temp >= 30){
    targetAngle = 180;
  } else{
    targetAngle = map(temp,20,30,0,180); /////////////
  }
  
  //moving the servo gradually
  if (currentAngle &lt; targetAngle){
    currentAngle++;
  } else if (currentAngle > targetAngle){
    currentAngle--;
  }
  
  myServo.write(currentAngle);
  delay(1); 
}
  
  void updateLight(){
    //getting the analog signal for ldr
    lightLevel = analogRead(ldrPin);
    Serial.print("  Light: ");
	Serial.println(lightLevel);
  if (lightLevel > 500) { // темно
    analogWrite(redPin, 255);
    analogWrite(greenPin, 0);
    analogWrite(bluePin, 255);
  } else {
    analogWrite(redPin, 0);
    analogWrite(greenPin, 0);
    analogWrite(bluePin, 0);
  }
  }
  
  
  void loop(){
    temp = readTemp();
    Serial.print("Temp is ");
    Serial.print(temp);
    
    updateServo(temp);
    updateLight();
    
    delay(20);
  }
en_USEnglish