Автоматизація поливу в теплиці

Різні схеми викорристання контролерів для автоматизації будинку, господарства та інш
Відповісти
Аватар користувача
Arduino
Site Admin
Повідомлень: 100
З нами з: 16 травня 2017 18:18

Автоматизація поливу в теплиці

Повідомлення Arduino »

_3a2e3e08-ea93-4ab7-b14c-34e57874b84a.jpeg
_3a2e3e08-ea93-4ab7-b14c-34e57874b84a.jpeg (20.38 Кіб) Переглянуто 14986 разів
Код програми стврено ШІ
скетч для Arduino UNO. До контролера підключені дсплей 1602 I2C, DHT11, датчик вологості ґрунту, насос.
Програма повинна кожні 30 сек зчитувати показання датчиків, виводити їх на екран. Насос включати не частіше заданого інтервалу часу в змінній PauseNasos. При досягненні значення вологості ґрунту VologGrunt заданого значення включати насос на час із заданої кількості секунд, зазначених у змінній NasosWorkTime.
для зменшення шуму датчиків і збільшення точності вимірювання застосовано програмний спосіб усереднення значень. Вказані піни підключення датчиків та насоса.
У цьому коді я додав усереднення для всіх вимірюваних параметрів: вологості ґрунту, вологості повітря та температури. Це зменшує шум і робить свідчення більш стабільними.
Цей код зчитує показання датчиків кожні 30 секунд та виводить їх на дисплей. Насос вмикається, коли вологість ґрунту перевищує задане значення VologGrunt, але не частіше, ніж раз в PauseNasos мілісекунд. Насос працює протягом NasosWorkTime мілісекунд. Будь ласка, перевірте та підтвердьте, що ці значення відповідають вашим вимогам.

Також, будь ласка, переконайтеся, що ви правильно підключили датчики та насос до Arduino UNO
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

// Определение пинов и типа датчика DHT
#define DHTPIN 2
#define DHTTYPE DHT11
#define SOIL_MOISTURE_PIN A0
#define PUMP_PIN 3

// Определение количества чтений для усреднения
#define NUM_READINGS 10

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Определение переменных для управления временем
unsigned long previousMillis = 0;
const long interval = 30000;
const int PauseNasos = 60000;
const int VologGrunt = 300;
const int NasosWorkTime = 5000;

// Определение массивов для хранения чтений датчиков
int soilMoistureReadings[NUM_READINGS];
int humidityReadings[NUM_READINGS];
int temperatureReadings[NUM_READINGS];
int readIndex = 0;
int totalSoilMoisture = 0;
int totalHumidity = 0;
int totalTemperature = 0;
int averageSoilMoisture = 0;
int averageHumidity = 0;
int averageTemperature = 0;

void setup() {
lcd.begin(16, 2);
dht.begin();
pinMode(SOIL_MOISTURE_PIN, INPUT);
pinMode(PUMP_PIN, OUTPUT);
for (int thisReading = 0; thisReading < NUM_READINGS; thisReading++) {
soilMoistureReadings[thisReading] = 0;
humidityReadings[thisReading] = 0;
temperatureReadings[thisReading] = 0;
}
}

void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Удаление старых чтений из общих значений
totalSoilMoisture = totalSoilMoisture - soilMoistureReadings[readIndex];
totalHumidity = totalHumidity - humidityReadings[readIndex];
totalTemperature = totalTemperature - temperatureReadings[readIndex];
// Чтение новых значений датчиков
soilMoistureReadings[readIndex] = analogRead(SOIL_MOISTURE_PIN);
humidityReadings[readIndex] = dht.readHumidity();
temperatureReadings[readIndex] = dht.readTemperature();
// Добавление новых чтений к общим значениям
totalSoilMoisture = totalSoilMoisture + soilMoistureReadings[readIndex];
totalHumidity = totalHumidity + humidityReadings[readIndex];
totalTemperature = totalTemperature + temperatureReadings[readIndex];
readIndex = readIndex + 1;
if (readIndex >= NUM_READINGS) {
readIndex = 0;
}
// Вычисление средних значений
averageSoilMoisture = totalSoilMoisture / NUM_READINGS;
averageHumidity = totalHumidity / NUM_READINGS;
averageTemperature = totalTemperature / NUM_READINGS;
// Отображение средних значений на дисплее
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(averageTemperature);
lcd.print(" *C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(averageHumidity);
lcd.print(" %");
lcd.setCursor(0, 2);
lcd.print("Soil Moisture: ");
lcd.print(averageSoilMoisture);
// Включение насоса при достижении порогового значения влажности почвы
if (averageSoilMoisture > VologGrunt && currentMillis - previousMillis >= PauseNasos) {
digitalWrite(PUMP_PIN, HIGH);
delay(NasosWorkTime);
digitalWrite(PUMP_PIN, LOW);
}
}
}
Відповісти

Повернутись до “Автоматизація власного будинку”