#define BLYNK_TEMPLATE_ID "TMPL4YxHzWRLU"
#define BLYNK_TEMPLATE_NAME "Project1"
#define BLYNK_AUTH_TOKEN "MFs5TlQ14ih8V2L2APzgXIK0PpzzsAEz"
#include <AccelStepper.h>
#include <Wire.h>
#include <WiFi.h>
#include <Arduino.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHTesp.h"
#define BLYNK_PRINT Serial
#define humidity_vpin V1 // Номер виртуального пина для влажности
#define temperature_vpin V2
//#define temperature2_vpin V4
//#define humidity2_vpin V5
#define co2_vpin V3
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
DHTesp dhtSensor;
DHTesp dhtSensor2;
#define CO2_PIN 34
#define RAIN_PIN 35
// Создание объекта AccelStepper
const int dirPin = 4; //вывод для направления
const int stepPin = 25; //вывод для шага
const int stepsPerRevolution = 200; //количество шагов на один оборот
AccelStepper stepper(AccelStepper::FULL4WIRE, stepPin, dirPin);
class SensorData {
public:
struct TempAndHumidity {
float temperature;
float humidity;
int co2;
int rain;
float temperature2;
float humidity2;
};
TempAndHumidity getSensorData() {
TempAndHumidity data;
// Получить показания датчика температуры и влажности
data.temperature = dhtSensor.getTemperature();
data.humidity = dhtSensor.getHumidity();
data.temperature2 = dhtSensor2.getTemperature();
data.humidity2 = dhtSensor2.getHumidity();
// Получить показания датчика CO2
int16_t co2Value = analogRead(CO2_PIN);
int16_t rainValue = analogRead(RAIN_PIN);
data.co2 = co2Value * 2;
data.rain = rainValue;
// Получить показания второго датчика DHT
return data;
}
};
float voltage = 1;
// Объявление переменной sensorData глобально
SensorData sensorData;
SensorData::TempAndHumidity data;
bool isRoofOpen = false; // закрыто
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass); // Подключение к Wi-Fi
dhtSensor.setup(14, DHTesp::DHT22); // Инициализация датчика DHT
dhtSensor2.setup(27, DHTesp::DHT22); // Инициализация второго датчика DHT
sensorData = SensorData(); // Инициализация класса SensorData
void sendSensorData(); // Объявление функции
void controlRoof(); // Объявление функции управления крышей
timer.setInterval(2000L, controlRoof); // Установка интервала срабатывания таймера
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
digitalWrite(dirPin, HIGH);
// Установка ускорения и максимальной скорости
stepper.setAcceleration(400); // Значение ускорения (по умолчанию 1000)
stepper.setMaxSpeed(2000); // Значение максимальной скорости (по умолчанию 1000)
}
void loop() {
Blynk.run();
timer.run();
data = sensorData.getSensorData();
// Обновление положения двигателя
stepper.run();
}
void controlRoof() {
// Проверка состояния крыши и выполнение действий
if (isRoofOpen && data.temperature > 24) {
// Если крыша открыта и температура более 24 градусов, закрываем крышу
closeRoof();
isRoofOpen = false;
} else if (!isRoofOpen && data.temperature <= 24) {
// Если крыша закрыта и температура 24 градуса или менее, открываем крышу
openRoof();
isRoofOpen = true;
}
}
void openRoof() {
digitalWrite(dirPin, HIGH);
stepper.moveTo(stepper.currentPosition() + 16000); // Переместить вперед на 200 шагов
}
void closeRoof() {
digitalWrite(dirPin, LOW);
stepper.moveTo(stepper.currentPosition() - 16000); // Переместить назад на 200 шагов
isRoofOpen = false;
}
void sendSensorData() {
// Получить показания датчиков
SensorData::TempAndHumidity data = sensorData.getSensorData();
// Вывод показаний датчиков в Serial
Serial.println("Temp: " + String(data.temperature, 2));
Serial.println("Humidity: " + String(data.humidity, 1));
Serial.println("Temp2: " + String(data.temperature2, 2));
Serial.println("Humidity2: " + String(data.humidity2, 1));
Serial.println("---");
Serial.println("CO2: " + String(data.co2));
Serial.println("RainDrop: " + String(data.rain));
// Отправка показаний датчиков в Blynk
Blynk.virtualWrite(humidity_vpin, data.humidity);
Blynk.virtualWrite(temperature_vpin, data.temperature);
Blynk.virtualWrite(co2_vpin, data.co2);
// Отправка показаний второго датчика в Blynk
//Blynk.virtualWrite(temperature2_vpin, data.temperature2);
//Blynk.virtualWrite(humidity2_vpin, data.humidity2);
}