4.1 Katse Temperatuuri andur

Katse temperatuuri mõõtmiseks temperatuurianduri abil.
Saadud tulemused kirjutame  iga sekundi tagant Serial Monitori.

const int temperaturePin = 0;

void setup()
{
Serial.begin(9600); // инициализируется сериал-порт со скоростью 9600 бод
}

void loop()
{

float voltage, degreesC, degreesF;  
// 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;

// Преобразование из Цельсия в Фаренгейты по формуле: °F = °C × 9/5 + 32
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
}

// Функция читает аналоговое значение (0–1023) и переводит его в напряжение (0.0–5.0 В).
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

// Paljud saadaolevad teegid (library’d) on leitavad aadressilt http://arduino.cc/en/Reference/Libraries

#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.
// В setup() указываем, что серво подключён к цифровому пину 9. Этот пин должен поддерживать PWM (широтно-импульсную модуляцию).
}

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)
 // Плавно увеличиваем угол от 0 до 180° с шагом 2 градуса.
Пауза delay(20) делает движение медленным и плавным.
  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
  }
}



Ülesanne 4. Temperatuuritundlik servolülitus
Kasvuhoone temperatuuri reguleegimine

Töö kirjeldus



Kasutatud komponenid



Töö protsess



Uuritud funktsioonid




Kasutamisvõimalused tavaelus



Interaktiivne skeem



Skeem



Video (link)



Programm

#include <Servo.h>
 
const int temperaturePin = A0;
const int LDRPin = A1;
const int WhiteLedPin = 8;
const int BlueLedPin = 7;
const int servoPin = 9;
 
Servo mootor;
 
float voltage, degreesC;
int currentAngle = 90;   // servo mootori algasend
 
 
void setup()
{ 
  Serial.begin(9600);
  mootor.attach(9);
  pinMode(WhiteLedPin, OUTPUT);
  pinMode(BlueLedPin, OUTPUT);
}
 
void loop()
{
  // Temperatuur
  voltage = analogRead(temperaturePin) * 0.004882814;
  degreesC = (voltage - 0.5) * 100.0;
   
  // Nurga arvutamine
  int targetAngle;
   
  if (degreesC <= 20) {
    targetAngle = 0;
  } else if (degreesC >= 30) {
    targetAngle = 180;
  } else {
    targetAngle = map(degreesC, 22, 35, 0, 180);
  }
   
  targetAngle = constrain(targetAngle, 0, 180);
   
  // Servo mootori sujuv liikumine
  if (currentAngle < targetAngle)
  {
    currentAngle++;
  } else if (currentAngle > targetAngle)
  {
    currentAngle--;
  }
  mootor.write(currentAngle);
  delay(10); 
 
  // Valguseandur ja LEDid
  int lightLevel = analogRead(LDRPin);
  lightLevel = map(lightLevel, 300, 800, 0, 255);
  lightLevel = constrain(lightLevel, 0, 255);
   
  // kui on pime ja külm
  if (lightLevel > 85 && degreesC <= 25)
  {
    digitalWrite(WhiteLedPin, HIGH);
    digitalWrite(BlueLedPin, LOW);
  }
  // kui on pime ja soe
  else if (lightLevel > 85 && degreesC >= 25)
  {
    digitalWrite(WhiteLedPin, LOW);
    digitalWrite(BlueLedPin, HIGH);
  }
  else
  {
    digitalWrite(WhiteLedPin, LOW);
    digitalWrite(BlueLedPin, LOW);
  }
   
 
  Serial.print("Voltage: ");
  Serial.print(voltage);
  Serial.print(" V | Temp: ");
  Serial.print(degreesC);
  Serial.print(" °C | Servo: ");
  Serial.print(currentAngle);
  Serial.print("° | Light level: ");
  Serial.println(lightLevel);
 
  delay(100);
}