Ülesanne 4 Temperatuuritundlik servolülitus

4.1 Katse Temperatuuri andur


const int temperaturePin = 0;

void setup()
{
Serial.begin(9600);
}

void loop()
{

float voltage, degreesC, degreesF;
// kasutame analogRead(), mis tagastab sisendi väärtused vahemikul 0 ... 1023.
// koostasime getVoltage() funktsioon, mis tagastab pingeväärtus  0 ... 5,

voltage = getVoltage(temperaturePin);
degreesC = (voltage - 0.5) * 100.0;
// degreesC = voltage * 100.0;
degreesF = degreesC * (9.0/5.0) + 32.0;
Serial.print("voltage: ");
Serial.print(voltage);
Serial.print(" deg C: ");
Serial.print(degreesC);
Serial.print(" deg F: ");
Serial.println(degreesF);


//Ekraanil ilmub järgmine tekst: "voltage: 0.73 deg C: 22.75 deg F: 72.96"
delay(1000); // ootame 1 sek
}

float getVoltage(int pin)
{
return (analogRead(pin) * 0.004882814);
// teisendame pinge vahemikust 0,0 ... 5,0 V, vahemikku 0 до 1023.
}

4.2. Katse Servo kasutamine

#include  <Servo.h> // nii teavitame Arduino IDE-t vajadusest kasutada Servo.h teeki (подключаем дополнительную библиотеку)
// Как только вы "подключаете" библиотеку, так сразу получаете доступ к этим функциям. Вы можете найти список функций в библиотеке
// сервопривода в: http://arduino.cc/en/Reference/Servo. Большинство библиотек доступно из меню "Файл / примеры".

Servo servo1; // Peame looma servo objekti nimega servo1 (объект управления сервоприводом)

void setup()
{
// Сейчас мы прикрепим (attach) объект servo1 к цифровому пину 9. Если вы собираетесь управлять более чем одним
// сервоприводом, Вы должны прикрепить каждый новый объект серво к своему, отдельному порту, причем это порт должен быть цифровым.
servo1.attach(9); //ütleme Arduinole, et infosuhtlus servo-objektiga servo käib läbi klemmi number 9. Tegu on digitaal-klemmiga--PWM digitaalne osa! Kontrollime, kas skeemil kasutame sama klemmi.
}
void loop()
{
int position;

servo1.write(90); //pööramise nurk =90
delay(1000); 
servo1.write(180); //pööramise nurk =180
delay(1000);
servo1.write(0); //pööramise nurk =0
delay(1000);

// servo positsiooni muutmine väike kiirusega pärisuunas:
for(position = 0; position < 180; position += 2)
{
servo1.write(position); // positsiooni muutmine
delay(20); 
}

// servo positsiooni muutmine väike kiirusega vastupäeva:
for(position = 180; position >= 0; position -= 1)
{ 
servo1.write(position); // positsiooni muutmine
delay(20); 
}
}

Ülesanne 4 Temperatuuritundlik servolülitus(Kasvuhoone temperatuuri reguleegimine)

1. Tehtud Näidisülesanded

Projekti ülesanne oli luua miniatuurne automatiseeritud kasvuhoonesüsteem, mis reageerib ümbritsevale temperatuurile ja valgusele. Kasutati erinevaid elektroonilisi komponente, et juhtida servomootorit temperatuuri alusel ning lülitada valgus sisse või välja vastavalt ümbritseva valguse tasemele. Projekti eesmärk oli simuleerida taimede automaatset hooldust väikekasvuhoones.


2. Uuritud Funktsioonid

Servo juhtimine (#include <Servo.h>): Servo liikumiseks kasutatud raamatukogu, võimaldades servomootori liikumist määratud nurkadesse.

Temperatuuri lugemine (getVoltage()): Loeb analoogpinni kaudu temperatuurianduri pinge ja arvutab selle temperatuuriks (Celsiuse järgi).

LED-de juhtimine: Kui temperatuur on madal, süttib sinine LED; kõrge temperatuuri korral punane LED. Kui temperatuur on normaalne, süttib roheline LED.

Servo liikumine (moveServoSmooth()): Liigutab servomootori sujuvalt 0° või 180° asendisse vastavalt temperatuurile.

Pidev servo liikumine (swingServo()): Kui temperatuur on üle 34°C, liigub servomootor edasi-tagasi, et jahutada kasvuhoonet. Kui temperatuur langeb, peatub liikumine ja servo liigub tagasi 0° asendisse.

3. Töö Kirjeldus

Projekti ülesandeks oli luua süsteem, mis suudaks automaatselt reguleerida kasvuhoone sisemist keskkonda. Kasvuhoone temperatuur ja valgustus on seotud järgmiste funktsioonidega:

  1. Temperatuuri alusel servomootori juhtimine:
    • Kui temperatuur on madalam kui 22°C, siis servomootor sulgeb akna (servo 0°).
    • Kui temperatuur ületab 34°C, siis servomootor avab akna (servo 180°).
    • Temperatuuride vahemikus liigutatakse servomootorit sujuvalt.
  2. LDR abil valgustuse juhtimine:
    • Kui ümbritsev valgus on väike (pimedus), süttib LED.
    • Kui valgust on piisavalt, siis LED kustub.

4. Kasutatud Komponendid

  • Temperatuuriandur (LM35): Kasutatud kasvuhoone temperatuuri mõõtmiseks.
  • Fototakisti (LDR): Kasutatud ümbritseva valgustuse taseme mõõtmiseks.
  • Servomootor (SG90): Kasutatud akna avamiseks ja sulgemiseks temperatuuri alusel.
  • LED: Kasutatud valgustuse simuleerimiseks või taimede valgustamiseks.
  • Arduino Uno: Kasutatud süsteemi juhtimiseks.
  • Takistid: Kasutatud LDR ja LED puhul.
  • Breadboard ja juhtmed: Kasutatud ühenduste tegemiseks.
  • Toiteallikas (USB/patarei): Kasutatud süsteemi toiteks.

5. Ühendamise Skeem (Tinkercad)

Ühendamisdiagramm on loodud Tinkercad-is, kus kõik komponendid on õigesti ühendatud. Skeemis on näha, kuidas temperatuuriandur, LDR, servomootor on ühendatud Arduino Uno-le.

Link skeemile Tinkercad-is:

https://www.tinkercad.com/things/3JhxidDXPrc-parnik

6. Programm

Arduino kood, mis juhib süsteemi:

#include <Servo.h>

const int RedPin = 6;
const int BluePin = 5;
const int GreenPin = 3;
const int temperaturePin = A0;

Servo servo1;
int currentAngle = 0;
bool swinging = false; // kas servo on pöörlemisrežiimis

void setup() {
  Serial.begin(9600);
  servo1.attach(11);
  pinMode(RedPin, OUTPUT);
  pinMode(GreenPin, OUTPUT);
  pinMode(BluePin, OUTPUT);
  servo1.write(currentAngle);
}

void loop() {
  float voltage = getVoltage(temperaturePin);
  float degreesC = (voltage - 0.5) * 100.0;

  Serial.print("Voltage: ");
  Serial.print(voltage);
  Serial.print(" °C: ");
  Serial.println(degreesC);

  if (degreesC < 22) {
    digitalWrite(BluePin, HIGH);
    digitalWrite(RedPin, LOW);
    digitalWrite(GreenPin, LOW);
    swinging = false;
    moveServoSmooth(0);
  } else if (degreesC > 34) {
    digitalWrite(RedPin, HIGH);
    digitalWrite(GreenPin, LOW);
    digitalWrite(BluePin, LOW);
    swingServo(); // pidev liikumine edasi-tagasi
  } else {
    digitalWrite(RedPin, LOW);
    digitalWrite(GreenPin, HIGH);
    digitalWrite(BluePin, LOW);
    swinging = false;
    moveServoSmooth(0);
  }

  delay(100); // väike paus loopi lõpus
}

float getVoltage(int pin) {
  return (analogRead(pin) * 0.004882814);
}

// Servo liigutamine ühekordselt sujuvalt sihtnurka
void moveServoSmooth(int targetAngle) {
  if (currentAngle < targetAngle) {
    for (int i = currentAngle; i <= targetAngle; i++) {
      servo1.write(i);
      delay(10);
    }
  } else if (currentAngle > targetAngle) {
    for (int i = currentAngle; i >= targetAngle; i--) {
      servo1.write(i);
      delay(10);
    }
  }
  currentAngle = targetAngle;
}

// Servo pidev liikumine edasi-tagasi
void swingServo() {
  if (!swinging) {
    swinging = true;
    while (true) {
      // Kontrolli uuesti temperatuuri iga tsükli alguses
      float temp = (getVoltage(temperaturePin) - 0.5) * 100.0;
      if (temp <= 34) {
        swinging = false;
        moveServoSmooth(0);
        break; // katkestame tsükli
      }

      moveServoSmooth(180);
      delay(500);
      moveServoSmooth(0);
      delay(500);
    }
  }
}

7. Video

Link videole:

kood ja skeem videolt:


#include <Servo.h>

// Пины
const int tempPin = A0;    // Пин датчика температуры (TMP36)
const int ldrPin = A1;     // Пин фотосопротивления
const int ledPin = 2;      // Пин LED
const int servoPin = 13;    // Пин сервомотора

// Переменные
Servo servo;
int currentAngle = 0;      // Текущий угол серво
int targetAngle = 0;       // Целевой угол серво

void setup() {
  pinMode(ledPin, OUTPUT);
  servo.attach(servoPin);
  servo.write(currentAngle); // Начальная позиция
  Serial.begin(9600);       // Для отладки
}

void loop() {
  // Чтение температуры
  int tempReading = analogRead(tempPin);
  float voltage = tempReading * (5.0 / 1023.0);
  float temperature = (voltage - 0.5) * 100; // Для TMP36

  // Определение целевого угла
  if (temperature <= 20) {
    targetAngle = 0;   // Окно закрыто
  } else if (temperature >= 30) {
    targetAngle = 130; // Окно открыто
  } else {
    targetAngle = currentAngle; // Не менять угол
  }

  // Плавное перемещение серво
  if (currentAngle != targetAngle) {
    servo.attach(servoPin); // Подключаем серво
    if (currentAngle < targetAngle) {
      currentAngle++; // Увеличиваем угол
      servo.write(currentAngle);
      delay(15); // Задержка для плавности
    } else if (currentAngle > targetAngle) {
      currentAngle--; // Уменьшаем угол
      servo.write(currentAngle);
      delay(15); // Задержка для плавности
    }
    // Если угол достигнут, отключаем серво
    if (currentAngle == targetAngle) {
      delay(100); // Ждём стабилизации
      servo.detach(); // Отключаем серво
    }
  }

  // Чтение фотосопротивления и управление LED
  int lightLevel = analogRead(ldrPin);
  if (lightLevel > 500) { // Если темно
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

  // Отладка
  Serial.print("Temp: ");
  Serial.print(temperature);
  Serial.print("C, Angle: ");
  Serial.print(currentAngle);
  Serial.print(", Light: ");
  Serial.println(lightLevel);

  delay(100); // Пауза между циклами


8. Kasutamisvõimalused Tavaelus

Automatiseeritud kasvuhoonesüsteem võib leida rakendusi järgmistes valdkondades:

  • Taimede kasvatamine: See süsteem aitab hoida stabiilset temperatuuri ja valgustingimusi kasvuhoonetes, optimeerides taimede kasvu.
  • Koduaiandus: Väikeste kasvuhoonete automatiseerimine, et tagada optimaalne keskkond.
  • Laste haridus: Haridussektoris saab kasutada seda projekti õppimiseks ja teaduse, tehnoloogia, inseneriteaduse ja matemaatika (STEM) tutvustamiseks.

Süsteem võiks ka tulevikus integreeruda IoT (Internet of Things) lahendustega, et kaugjuhtimise teel jälgida ja reguleerida kasvuhoone tingimusi.


Kokkuvõte:
Projekti eesmärk oli luua funktsionaalne automatiseeritud kasvuhoone, mis suudab reageerida ümbritsevale keskkonnale. Kasutatud komponendid ja tarkvara täidavad ülesandeid täpselt ning süsteem on valmis kasutamiseks kasvuhoonetes või haridusprojektides.