Temp / Ser

4.1 Katse Temperatuuri andur

const int temperaturePin = 0; // Аналоговый пин A0, к которому подключён датчик температуры
 
void setup()
{
  Serial.begin(9600); // Запускаем последовательную передачу данных на скорости 9600 бод
}
 
void loop()
{
  float voltage, degreesC, degreesF; // Переменные для хранения напряжения и температуры
 
  // Считываем напряжение с пина, используя вспомогательную функцию
  voltage = getVoltage(temperaturePin);
 
  // Преобразуем напряжение в температуру по Цельсию:
  // Для датчика TMP36: 0.5 В соответствует 0°C, далее 10 мВ на 1°C
  degreesC = (voltage - 0.5) * 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);
 
  delay(1000); // Задержка 1 секунда перед следующим измерением
}
 
// Функция для перевода значения с аналогового входа в напряжение (0.0 – 5.0 В)
float getVoltage(int pin)
{
  return (analogRead(pin) * 0.004882814); // 5.0 / 1023 ≈ 0.00488
}

Принцип работы программы:

  1. К аналоговому пину A0 подключён температурный датчик (например, TMP36).
  2. Функция analogRead() считывает значение от 0 до 1023, соответствующее напряжению от 0 до 5 В.
  3. getVoltage() преобразует это значение в напряжение в вольтах.
  4. Затем программа пересчитывает напряжение в температуру в градусах Цельсия и Фаренгейта.
  5. Результаты выводятся в монитор последовательного порта каждую секунду.

Такой код подходит для визуального отслеживания температуры в реальном времени через компьютер.

4.2. Katse Servo kasutamine

// Paljud saadaolevad teegid (library’d) on leitavad aadressilt http://arduino.cc/en/Reference/Libraries
 
#include <Servo.h> // Подключаем библиотеку Servo для управления сервоприводами
 
// После подключения библиотеки мы можем использовать все её функции.
// Список команд библиотеки Servo: http://arduino.cc/en/Reference/Servo
// Большинство библиотек можно найти в меню "File / Examples".
 
Servo mootor; // Создаём объект "mootor", представляющий один сервопривод
 
void setup()
{
  // Привязываем объект "mootor" к цифровому пину 9.
  // Если нужно подключить больше сервоприводов, каждый подключается к своему цифровому выходу.
  mootor.attach(9); // Пин 9 должен поддерживать ШИМ (PWM)
}
 
void loop()
{
  int asend; // Переменная для хранения текущего положения мотора
 
  // Двигаем мотор в конкретные позиции с задержками:
  mootor.write(90);   // Повернуть на 90°
  delay(1000);        // Ждём 1 секунду
  mootor.write(180);  // Повернуть на 180°
  delay(1000);
  mootor.write(0);    // Вернуться к 0°
  delay(1000);
 
  // Плавный поворот мотора по часовой стрелке: от 0° до 180° с шагом 2°
  for(asend = 0; asend < 180; asend += 2)
  {
    mootor.write(asend); // Устанавливаем угол
    delay(20);           // Короткая задержка для плавности
  }
 
  // Плавный поворот мотора против часовой стрелки: от 180° до 0° с шагом 1°
  for(asend = 180; asend >= 0; asend -= 1)
  { 
    mootor.write(asend); // Устанавливаем угол
    delay(20);           // Короткая задержка для плавности
  }
}

Принцип работы программы:

  1. Инициализация: Сначала подключаем библиотеку Servo.h и создаём объект mootor, управляющий сервоприводом.
  2. Настройка: В setup() привязываем сервопривод к цифровому пину 9.
  3. Основной цикл (loop):
    • Перемещаем сервопривод сразу в три фиксированные позиции: 90°, 180°, 0° — с паузой в 1 секунду между каждой.
    • Затем выполняется плавное движение:
      • Сначала вперёд: от 0° до 180° с шагом 2° и паузой 20 мс.
      • Потом назад: от 180° до 0° с шагом 1° и той же паузой.
  4. Программа зациклена, так что эти действия повторяются бесконечно.

Такой код полезен для демонстрации возможностей сервопривода, тестирования углов позиционирования и создания плавной анимации.

Ülesanne 4 Temperatuuritundlik servolülitus

Цель:

Создать автоматизированную миниатюрную систему теплицы, которая реагирует на температуру и освещённость окружающей среды.
Система должна управлять сервомотором в зависимости от изменения температуры и автоматически включать или выключать освещение в зависимости от уровня света, используя фоторезистор.
Этот проект позволяет связать реальные условия окружающей среды с электроникой и смоделировать автоматический уход за растениями в мини-теплице.


Необходимые компоненты:

  • Температурный датчик (например, LM35, DHT11 или TMP36)
  • Фоторезистор (LDR – Light Dependent Resistor)
  • Сервомотор (небольшой, например SG90)
  • Светодиод (LED) — для имитации или добавления освещения
  • Arduino Uno
  • Резисторы (для LDR и LED)
  • Провода и breadboard
  • Коробка или монтажная площадка для размещения датчиков и компонентов
  • Источник питания (USB, батарейка или аккумулятор)

Описание работы и функциональность:

1. Управление сервомотором на основе температуры:

  • Если температура ≤ 20°C, сервомотор переходит в положение (например, закрывается окно теплицы).
  • Если температура ≥ 30°C, сервомотор переходит в положение 180° (окно открывается для охлаждения).
  • Движение сервомотора должно быть плавным, а не резким (движение происходит с небольшими шагами).

2. Автоматическое освещение с использованием фоторезистора:

  • Если освещённость низкая (темно), светодиод включается автоматически.
  • Если света достаточно, светодиод выключается.

Используемые функции и техники Arduino:

Преобразование температуры в угол сервомотора:

int servoAngle = map(temperature, 22, 35, 0, 180);
servoAngle = constrain(servoAngle, 0, 180); // ограничение угла в пределах 0–180°

Плавное движение сервомотора:

if (currentAngle < targetAngle) {
  currentAngle++;
} else if (currentAngle > targetAngle) {
  currentAngle--;
}
servo.write(currentAngle);
delay(15); // плавное движение

Считывание уровня света с LDR и управление светодиодом:

int lightLevel = analogRead(LDRPin);
if (lightLevel < 500) {  // если темно
  digitalWrite(ledPin, HIGH); // включить свет
} else {
  digitalWrite(ledPin, LOW);  // выключить свет
}

Полный код

#include <Servo.h>
 
const int led = 12;
const int sensorPin = A1;
int lightLevel, high = 0, low = 1023;
 
const int temperaturePin = A0;
Servo servo1;
 
int currentAngle = 0; // текущий угол сервопривода
 
void setup() {
  pinMode(led, OUTPUT);
  servo1.attach(13); // подключаем сервомотор к пину 13
  Serial.begin(9600);
}
 
void loop() {
  // === Яркость LED по уровню освещенности ===
  lightLevel = analogRead(sensorPin);
  analogWrite(led, lightLevel);
 
  // обновление максимального значения (по желанию)
  if (lightLevel > high) {
    high = lightLevel;
  }
 
  // === Считываем температуру ===
  float voltage = getVoltage(temperaturePin);
  float degreesC = (voltage - 0.5) * 100.0;
  float 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);
 
  // === Определяем целевой угол по температуре ===
  int targetAngle;
 
  if (degreesC <= 25) {
    targetAngle = 0; // Закрыто
  } else if (degreesC >= 35) {
    targetAngle = 180; // Полностью открыто
  } else {
    targetAngle = map(degreesC, 26, 34, 0, 180); // Промежуточные значения
  }
 
  // === Плавное движение к целевому углу ===
  if (currentAngle < targetAngle) {
    currentAngle++;
  } else if (currentAngle > targetAngle) {
    currentAngle--;
  }
 
  servo1.write(currentAngle);
  delay(15); // плавность движения
}
 
// === Получение напряжения с аналогового входа ===
float getVoltage(int pin) {
  return analogRead(pin) * 0.004882814;
}

Video: https://youtube.com/shorts/3stRm1hFpsE?si=gTfYzQBZxYio7JCV