Ülesanne #1

Komponendid

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

Automatiseeritud Kasvuhoone

Video

https://drive.google.com/file/d/14WEiq3X64DxQ8Vvfomwj3XfYJX6dIXIO/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

a

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);
}