Сейчас ваша корзина пуста!
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 0° → 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 <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<=20){
targetAngle = 0;
}else if(temp >= 30){
targetAngle = 180;
} else{
targetAngle = map(temp,20,30,0,180); /////////////
}
//moving the servo gradually
if (currentAngle < 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);
}
