Skip to content
Home » Kasvuhoone ülesanne konspekt

Kasvuhoone ülesanne konspekt


Tehtud näidisülesanded

4.2. Katse Servo kasutamine

Kood:

#include <Servo.h> // teavitame Arduino IDE-d, et kasutame mootorite juhtimiseks mõeldud Servo.h teeki

// Kui teek on lisatud, saame kohe kasutada selle funktsioone.
// Servo teegi funktsioonide nimekirja leiad: http://arduino.cc/en/Reference/Servo
// Enamik teeke on kättesaadavad menüüst "File / Examples".

Servo mootor; // Loome objekti nimega "mootor", millega juhime pöördemootorit (servomootorit)

void setup()
{
  // Seome mootori juhtimise digitaalse pinni 9 külge.
  // Kui kasutad rohkem kui ühte mootorit, peab iga uus mootor olema seotud eraldi digitaalse pordiga.
  mootor.attach(9); // Ühendame mootori juhtimise digitaalpordi 9 külge. See peab olema PWM-toega väljund.
}

void loop()
{
  int asend;

  mootor.write(90); // Pöörame mootori asendisse 90 kraadi
  delay(1000); 
  mootor.write(180); // Pöörame mootori 180 kraadi
  delay(1000);
  mootor.write(0); // Pöörame mootori tagasi 0 kraadi
  delay(1000);

  // Mootori pööramine aeglaselt päripäeva (0 → 180 kraadi)
  for(asend = 0; asend < 180; asend += 2)
  {
    mootor.write(asend); // Muudame mootori asendit
    delay(20); // Lühike paus sujuvaks liikumiseks
  }

  // Mootori pööramine aeglaselt vastupäeva (180 → 0 kraadi)
  for(asend = 180; asend >= 0; asend -= 1)
  { 
    mootor.write(asend); // Muudame mootori asendit
    delay(20); // Lühike paus sujuvaks liikumiseks
  }
}

Uuritud funktsioonid

updateServo(float temp)

Eesmärk:
Liigutada servomootorit vastavalt temperatuurile.

Kuidas see töötab:

  • Kui temperatuur ≤ 20 °C → sihtnurk = 0°
  • Kui temperatuur ≥ 30 °C → sihtnurk = 180°
  • Kui temperatuur on vahemikus 20–30 °C → map() teisendab temperatuuri vastavaks nurgaks (0–180°)
  • Mootor liigub iga tsükliga ühe kraadi võrra sihtnurgale lähemale
  • myServo.write(currentAngle) määrab uue nurga
  • delay(1) lisab väikese pausi liikumise sujuvuseks

🔧 map(temp, 20, 30, 0, 180)

Eesmärk:
Teisendada temperatuur (20–30 °C) vastavaks servonurgaks (0–180°).

Kuidas see töötab:
Lineaarne teisendus:

  • 20 °C → 0°
  • 25 °C → 90°
  • 30 °C → 180°

🔧 updateLight()

Eesmärk:
Mõõta valguse taset ja juhtida RGB LED-i.

Kuidas see töötab:

Muidu kõik väärtused 0 (LED kustub)

Loeb LDR signaali: lightLevel = analogRead(ldrPin)

Kui lightLevel > 500 (pimedam):

punane = 255

roheline = 0

sinine = 255

Töö kirjeldus

Luua automatiseeritud miniatuurne kasvuhoonesüsteem, mis reageerib ümbritsevale temperatuurile ja valgusele. 

Süsteem peab suutma juhtida servomootorit temperatuurimuutuse alusel ning lülitada valguse sisse või välja vastavalt valgustugevusele, kasutades fototakistit. 

See projekt võimaldab siduda reaalseid keskkonnatingimusi elektroonikaga ja simuleerida taimede automaatset hooldust väikekasvuhoones.

Kasutatud komponeendid

  • Valguse andur (fototakisti)
  • Juhtmed (15 tk)
  • RGB LED
  • Takisti (3tk: 2tk 220 ohm, 1tk 10k ohm)
  • Temperatuuriandur (TMP36)
  • Servomootor
  • Arduino Uno plaat

Ühendamise skeem

Programm

#include <Servo.h> // Servo teek servomootori juhtimiseks

// pinide määramine
const int tempPin = A0;    // temperatuurisensor TMP36 on ühendatud A0 külge
const int ldrPin = A1;     // valgussensor (LDR) on ühendatud A1 külge
const int redPin = 8;      // punane LED-pin
const int bluePin = 9;     // sinine LED-pin
const int greenPin = 10;   // roheline LED-pin
const int servoPin = 11;   // servomootori juhtimise pin

// kasutatavad muutujad
float temp = 0.0;          // mõõdetud temperatuur
int lightLevel = 0;        // valguse tase
int targetAngle = 0;       // sihtnurk servole
int currentAngle = 0;      // hetke asend servol

Servo myServo; // loome servo objekti

void setup(){
  Serial.begin(9600); // alustame seriaalühendust monitorimiseks

  pinMode(ldrPin, INPUT); // LDR on sisend

  // LED-id väljundiks
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  myServo.attach(servoPin);       // ühendame servo määratud pinniga
  myServo.write(currentAngle);    // määrame algasendi (0°)
}

float readTemp(){
  int raw = analogRead(tempPin);                  // loeme TMP36 anduri väärtuse (0–1023)
  float voltage = raw * 5.0 / 1023.0;              // teisendame selle pingeks (0–5V)
  float tempC = (voltage - 0.5) * 100;             // TMP36 valem: 0.5V = 0°C, 10mV = 1°C
  return tempC;                                    // tagastame temperatuuri kraadides
}

void updateServo(float temp){
  if (temp <= 20) {
    targetAngle = 0;                               // kui temperatuur ≤ 20 °C → servo 0°
  } else if (temp >= 30) {
    targetAngle = 180;                             // kui ≥ 30 °C → servo 180°
  } else {
    targetAngle = map(temp, 20, 30, 0, 180);       // vahepealne — lineaarne teisendus (map)
  }

  // liigutame servo aeglaselt sihtasendisse
  if (currentAngle < targetAngle) {
    currentAngle++;                                // suurendame nurka
  } else if (currentAngle > targetAngle) {
    currentAngle--;                                // vähendame nurka
  }

  myServo.write(currentAngle);                     // määrame servo uue nurga
  delay(1);                                        // väike paus sujuvaks liikumiseks
}

void updateLight(){
  lightLevel = analogRead(ldrPin);                 // loeme valguse taseme
  Serial.print("  Light: ");
  Serial.println(lightLevel);

  if (lightLevel > 500) {                          // kui liiga pime
    analogWrite(redPin, 255);                      // punane 100%
    analogWrite(greenPin, 0);
    analogWrite(bluePin, 255);                     // sinine 100% (tulemus: lilla)
  } else {
    analogWrite(redPin, 0);                        // kustutame kõik LEDid
    analogWrite(greenPin, 0);
    analogWrite(bluePin, 0);
  }
}

void loop(){
  temp = readTemp();                               // mõõdame temperatuuri
  Serial.print("Temp is ");
  Serial.print(temp);

  updateServo(temp);                               // uuendame servoasendit
  updateLight();                                   // uuendame LED-tuld vastavalt valgusele

  delay(20);                                       // väike paus tsükli vahel
}

Video

Kasutamisvõimalused tavaelus

1. Valgustundlik RGB LED

  • Kui toas või keskkonnas läheb pimedaks (LDR näitab väikest valgustaset), süttib lilla LED-valgus.
  • Päevavalguses valgus kustub automaatselt.

2. Nutikas kodu / mini-automaatika süsteem

  • Mõõdab keskkonnatingimusi (valgus ja temperatuur)
  • Annab visuaalset tagasisidet LED-iga
  • Tegutseb mehhaaniliselt (servo) vastavalt oludele