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