Ülesanne #1

Komponendid

  • Arduino UNO plaat (1tk)
  • Arendusplaat (1tk)
  • Juhtmed (4tk)
  • Temperatuuriandur (1tk)
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.
}

Ülesanne #2

Komponendid

  • Arduino UNO plaat (1tk)
  • Arendusplaat (1tk)
  • Juhtmed (3tk)
  • Servo mootor (1tk)
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
  }
}

Automatiseeritud Kasvuhoone

Video

https://drive.google.com/file/d/1j2XqSyrrOibpEpn1XoF3oKUsbBSE_HyW/view?usp=sharing

Kirjeldus

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. 

Komponendid

  • Arduino UNO plaat (1tk)
  • Arendusplaat (1tk)
  • Juhtmed (15tk)
  • 10 kΩ Takisti (4tk)
  • RGB LED (1tk)
  • Fotoresistor(1tk)
  • Servo mootor(1tk)
  • Temperatuuriandur (1tk)

Uuritud funktsioonid

#include <Servo.h>Lisab koodi Servo teegi, mis võimaldab servomootoreid juhtida. Tänu sellele saab kasutada funktsioone nagu attach() ja write().
mootor.write(asend)Seab servomootori etteantud nurga (0–180 kraadi), mis arvutatakse tavaliselt keskkonnatingimuste põhjal.
float getVoltage(int pin)
{ return analogRead(pin) * 0.004882814; }
Funktsioon, mis teisendab analoogsignaali pingeks voltides, kus iga samm on ligikaudu 0.00488 V (5 V / 1023).
degreesC = (voltage – 0.5) * 100.0Arvutab TMP36 anduri mõõdetud pingest temperatuuri Celsiuse kraadides: 0.5 V = 0 °C, iga täiendav volt = +100 °C.
degreesF = degreesC * (9.0 / 5.0) + 32.0Teisendab Celsiuse kraadid Fahrenheiti kraadideks, kasutades vastavat valemit.

Selgitus

Ühendame servojuhtimise teegi. Deklareerime pin’id temperatuurianduri, fotoresistori, RGB-LED-i ja servo ajami ühendamiseks.

#include <Servo.h>

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

Loome muutujad praeguste temperatuuri, valgustaseme ja servo nurkade väärtuste salvestamiseks. Deklareerime objekti myServo servo mootori juhtimiseks.

float temp = 0.0;
int lightLevel = 0;
int targetAngle = 0;
int currentAngle = 0;

Servo myServo;

Initsialiseerime järjestikuse andmeedastuse ja määrame pin’ide režiimid. Ühendame servo ajami pin’iga ja määrame sellele algse asendi.

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

  pinMode(ldrPin, INPUT);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  myServo.attach(servoPin);
  myServo.write(currentAngle);
}

Loeme analoogsignaali temperatuuriandurilt, teisendame selle pingeks ja seejärel temperatuuriks kraadides Celsiuse järgi, kasutades TMP36 valemit.

float readTemp() {
  int raw = analogRead(tempPin);
  float voltage = raw * 5.0 / 1023.0;
  float tempC = (voltage - 0.5) * 100;
  return tempC;
}

Määrame sihtnurgad temperatuuri alusel: alla 20 °C — minimaalne nurk, üle 30 °C — maksimaalne nurk. Nende väärtuste vahel arvutame nurga proportsionaalselt. Seejärel lähendame järk-järgult praegust nurka sihtnurgale.

void updateServo(float temp) {
  if (temp <= 20) {
    targetAngle = 0;
  } else if (temp >= 30) {
    targetAngle = 180;
  } else {
    targetAngle = map(temp, 20, 30, 0, 180);
  }

  if (currentAngle < targetAngle) {
    currentAngle++;
  } else if (currentAngle > targetAngle) {
    currentAngle--;
  }

  myServo.write(currentAngle);
  delay(1);
}

Saame valgustaseme fotoresistorilt. Kui väärtus on üle 500 (pimedus), lülitame sisse lilla valguse (punase ja sinise segu). Vastasel juhul lülitame kõik värvid välja.

void updateLight() {
  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);
  }
}

Loeme temperatuuri, kuvame selle portaali jälgimises, uuendame servo ajami asendit ja LEDide olekut. Tsüklite vahel teeme väikese viivituse.

void loop() {
  temp = readTemp();
  Serial.print("Temp is ");
  Serial.print(temp);

  updateServo(temp);
  updateLight();

  delay(20);
}

Kood

#include <Servo.h>

// määrame pinni numbrid
const int tempPin = A0;
const int ldrPin = A1;
const int redPin = 8;
const int bluePin = 9;
const int greenPin = 10;
const int servoPin = 11;

// loome muutujad temperatuuri ja valguse jaoks
float temp = 0.0;
int lightLevel = 0;
int targetAngle = 0;
int currentAngle = 0;

// loome objekti servo mootorile
Servo myServo;

void setup() {
  Serial.begin(9600); // käivitame jadapordi suhtluse

  // määrame pinni töörežiimid
  pinMode(ldrPin, INPUT);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  // ühendame servo mootoriga ja seame algasendi
  myServo.attach(servoPin);
  myServo.write(currentAngle);
}

// funktsioon temperatuuri lugemiseks TMP36 andurilt
float readTemp() {
  int raw = analogRead(tempPin); // loeme anduri analoogsignaali
  float voltage = raw * 5.0 / 1023.0; // teisendame selle pingeks
  float tempC = (voltage - 0.5) * 100; // arvutame temperatuuri celsiuse kraadides
  return tempC;
}

// funktsioon servo nurga juhtimiseks temperatuuri põhjal
void updateServo(float temp) {
  if (temp <= 20) {
    targetAngle = 0; // kui temperatuur on madal, seame nurga väikseks
  } else if (temp >= 30) {
    targetAngle = 180; // kui temperatuur on kõrge, seame nurga maksimaalseks
  } else {
    targetAngle = map(temp, 20, 30, 0, 180); // arvutame sobiva nurga vahemikus
  }

  // liigume samm-sammult soovitud nurgani
  if (currentAngle < targetAngle) {
    currentAngle++;
  } else if (currentAngle > targetAngle) {
    currentAngle--;
  }

  myServo.write(currentAngle); // uuendame servo asendi
  delay(1);
}

// funktsioon led-tulede juhtimiseks vastavalt valgusele
void updateLight() {
  lightLevel = analogRead(ldrPin); // loeme valguse taseme andurilt
  Serial.print("  Light: ");
  Serial.println(lightLevel);

  if (lightLevel > 500) {
    // kui on hämar, lülitame sisse lilla valguse
    analogWrite(redPin, 255);
    analogWrite(greenPin, 0);
    analogWrite(bluePin, 255);
  } else {
    // kui on piisavalt valgust, lülitame tule välja
    analogWrite(redPin, 0);
    analogWrite(greenPin, 0);
    analogWrite(bluePin, 0);
  }
}

// põhitsükkel, mis töötab pidevalt
void loop() {
  temp = readTemp(); // loeme temperatuuri andurilt
  Serial.print("Temp is ");
  Serial.print(temp);

  updateServo(temp); // uuendame servo asendi vastavalt temperatuurile
  updateLight(); // uuendame valguse oleku vastavalt mõõdetud tasemele

  delay(20);
}