#include "DHT.h"
#include <DS1302.h>
#define DHTPIN 6
#define DHTTYPE DHT21
int maxHum = 50; // предел влажность
int maxTemp = 28; // предел температура
float currentTemp = 25; // текущая температура, в процессе работы ее значение меняеться
float currentHum = 32; // текущая влажность, в процессе работы ее значение меняеться
DHT dht(DHTPIN, DHTTYPE);
Time t;
int d; // Переменная в которую записываются текущий показатель часов
int m; // Переменная в которую записываются текущий показатель минут
int s; // Переменная в которую записываются текущий показатель секунд
DS1302 rtc(7, 8, 9); /* Подключение the DS1302
CE pin (RES) -> Arduino Digital 7
I/O pin (DAT) -> Arduino Digital 8
SCLK pin(CLK) -> Arduino Digital 9
*/
uint32_t myTimer1;
int period = 99000; //
uint32_t myTimerVentil;
uint32_t myTimerPump;
uint32_t myTimerWater;
// пины для поключения
int lamp = 5;
int ventil = 4;
int water = 3;
int pump = 2;
int sensorPin = A1;
bool lampState = false;
int lastMin;
int last15Min;
int lastHour;
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(ventil, OUTPUT);//вентилятор
pinMode(lamp, OUTPUT);//лампа
pinMode(water, OUTPUT);//увлажнитель воздуха
pinMode(pump, OUTPUT); //помпа
}
void loop() {
//getValueDHT(5, 2);
t = rtc.getTime();
// Передать дату
//Serial.print(rtc.getDateStr());
//Serial.print(" -- ");
d = t.hour, DEC;
m = t.min, DEC;
s = t.sec, DEC;
// Передать время
//Serial.println(rtc.getTimeStr());
//delay(1000); // задержка 1 сек
if (d >= 5 && d < 23) { //выключаем лампу с 5 по 23
digitalWrite(lamp, HIGH);
if (!lampState) Serial.println("Лампа включена");
lampState = true;
}
// выключаем лампу в 23
else {
digitalWrite(lamp, LOW);
if (lampState) Serial.println("Лампа выключена");
lampState = false;
}
// здесь запускаем вытяжку каждые 15 минут
if (m % 15 == 0 && m != last15Min) {
Serial.print(rtc.getTimeStr());
last15Min = m;
digitalWrite(ventil, HIGH); // включаем вытяжку
Serial.println(" - Вытяжка запущена на 20 c.");
delay(20000); // время работы вытяжки
digitalWrite(ventil, LOW); // отключаем вытяжку
Serial.println("Вытяжка остановлена");
}
//if (millis() - myTimer1 >= period) { // выполняется через кажде пять минут
if (m % 5 == 0 && m != lastMin) { // выполняется через каждые 5 минут, период менять ЗДЕСЬ
Serial.println("--");
Serial.println(rtc.getTimeStr());
lastMin = m;
myTimer1 += period; // сброс таймера
getValueDHT(5, 2); // запускаем функцию измерения влажности и температуры 5 измерений с интервалом 2 сек.
if (currentTemp > maxTemp && !digitalRead(ventil)) {
digitalWrite(ventil, HIGH); // включаем кулер
myTimerVentil = millis(); // фиксируем время включение кулера
Serial.println("Кулер запущен");
}
if (currentHum < maxHum && !digitalRead(water)) {
digitalWrite(water, HIGH); // включаем увлажнитель
myTimerWater = millis(); // фиксируем время включения увлажнителя
Serial.println("Включен увлажнитель");
}
}
if (d % 2 > 0 && m < 1 && s >= 35 && d != lastHour) { // выполняется каждую первую минуту нечетного часа т.е. раз в 2 часа
Serial.println(rtc.getTimeStr());
lastHour = d;
if (getValueSensor(10, 3) < 900) { // запускаем функцию измерения влажности почвы и полученое значение сравниваем с пределом. ПРЕДЕЛ ДЛЯ ПОМПЫ МЕНЯТЬ ЗДЕСЬ
digitalWrite(pump, HIGH); // включаем помпу
myTimerPump = millis(); // фиксируем время включения помпы
Serial.println("Помпа запущена");
}
}
if (millis() - myTimerVentil >= 30000) { // выключаем кулер через 30 с.
if (digitalRead(ventil)) {
Serial.print(rtc.getTimeStr());
Serial.println(" Кулер остановлен");
}
digitalWrite(ventil, LOW);
}
if (millis() - myTimerWater >= 60000) { // выключаем увлажнитель через 60 с.
if (digitalRead(water)) {
Serial.print(rtc.getTimeStr());
Serial.println(" Увлажнитель отключен");
}
digitalWrite(water, LOW);
}
if (millis() - myTimerPump >= 10000) { // выключаем помпу через 10 с.
if (digitalRead(pump)) {
Serial.print(rtc.getTimeStr());
Serial.println(" Помпа остановлена");
}
digitalWrite(pump, LOW);
}
}
//функция определения влажности почвы
int getValueSensor(int quantity, int Interval) {
int sum = 0;
for (int i = 0; i < quantity; i++) {
sum += analogRead(sensorPin);
delay (Interval);
}
int result = sum / quantity;
Serial.print(result);
Serial.println(" - Влажность почвы");
return result;
}
//функция определения температуры и влажности
void getValueDHT(int quantity, int Interval) {
if (isnan(dht.readHumidity()) || isnan(dht.readTemperature())) {
Serial.println("Failed to read from DHT sensor!");
return;
}
float h = 0;
float t = 0;
for (int i = 0; i < quantity; i++) {
h += dht.readHumidity();
t += dht.readTemperature();
delay (Interval);
}
h = h / quantity;
t = t / quantity;
currentTemp = t;
currentHum = h;
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
return;
}
Делаю гроубокс с автоматическим включением, выключением лампы, регулировкой температуры и влажности. Имеются таки железки:
Искал готовый скетч под мои желания, но находил все не то, с какими-то экранами, энкодерами, кнопками, менюшками. А мне хотелось попроще. В итоге заказал человеку код. Скетч меня полностью устраивает, хотя, может он и не идеальный, я не сильно разбираюсь, но главное - работает так, как я хочу. Я вижу в нем где можно изменить пределы температуры и влажности, периоды и продолжительность работы железок.
НО, пришла платка Wemos D1 mini и я хочу переделать этот код под неё. Для начала хотя-бы просмотр показаний датчиков в браузере и управление железом, ну а предел мечтаний получить такой функционал на смартфон (через Blynk, MIT App Inventor или что-то другое). Видел несколько таких проектов, но опять же они не совпадают с моими желаниями и сделаны под другое железо.
Вопрос, может кто-то сможет переделать мой код под Wemos D1 mini? Или у кого-то есть похожий скетч?
Вопрос
uamiha 2
#include "DHT.h"
#include <DS1302.h>
#define DHTPIN 6
#define DHTTYPE DHT21
int maxHum = 50; // предел влажность
int maxTemp = 28; // предел температура
float currentTemp = 25; // текущая температура, в процессе работы ее значение меняеться
float currentHum = 32; // текущая влажность, в процессе работы ее значение меняеться
DHT dht(DHTPIN, DHTTYPE);
Time t;
int d; // Переменная в которую записываются текущий показатель часов
int m; // Переменная в которую записываются текущий показатель минут
int s; // Переменная в которую записываются текущий показатель секунд
DS1302 rtc(7, 8, 9); /* Подключение the DS1302
CE pin (RES) -> Arduino Digital 7
I/O pin (DAT) -> Arduino Digital 8
SCLK pin(CLK) -> Arduino Digital 9
*/
uint32_t myTimer1;
int period = 99000; //
uint32_t myTimerVentil;
uint32_t myTimerPump;
uint32_t myTimerWater;
// пины для поключения
int lamp = 5;
int ventil = 4;
int water = 3;
int pump = 2;
int sensorPin = A1;
bool lampState = false;
int lastMin;
int last15Min;
int lastHour;
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(ventil, OUTPUT);//вентилятор
pinMode(lamp, OUTPUT);//лампа
pinMode(water, OUTPUT);//увлажнитель воздуха
pinMode(pump, OUTPUT); //помпа
}
void loop() {
//getValueDHT(5, 2);
t = rtc.getTime();
// Передать дату
//Serial.print(rtc.getDateStr());
//Serial.print(" -- ");
d = t.hour, DEC;
m = t.min, DEC;
s = t.sec, DEC;
// Передать время
//Serial.println(rtc.getTimeStr());
//delay(1000); // задержка 1 сек
if (d >= 5 && d < 23) { //выключаем лампу с 5 по 23
digitalWrite(lamp, HIGH);
if (!lampState) Serial.println("Лампа включена");
lampState = true;
}
// выключаем лампу в 23
else {
digitalWrite(lamp, LOW);
if (lampState) Serial.println("Лампа выключена");
lampState = false;
}
// здесь запускаем вытяжку каждые 15 минут
if (m % 15 == 0 && m != last15Min) {
Serial.print(rtc.getTimeStr());
last15Min = m;
digitalWrite(ventil, HIGH); // включаем вытяжку
Serial.println(" - Вытяжка запущена на 20 c.");
delay(20000); // время работы вытяжки
digitalWrite(ventil, LOW); // отключаем вытяжку
Serial.println("Вытяжка остановлена");
}
//if (millis() - myTimer1 >= period) { // выполняется через кажде пять минут
if (m % 5 == 0 && m != lastMin) { // выполняется через каждые 5 минут, период менять ЗДЕСЬ
Serial.println("--");
Serial.println(rtc.getTimeStr());
lastMin = m;
myTimer1 += period; // сброс таймера
getValueDHT(5, 2); // запускаем функцию измерения влажности и температуры 5 измерений с интервалом 2 сек.
if (currentTemp > maxTemp && !digitalRead(ventil)) {
digitalWrite(ventil, HIGH); // включаем кулер
myTimerVentil = millis(); // фиксируем время включение кулера
Serial.println("Кулер запущен");
}
if (currentHum < maxHum && !digitalRead(water)) {
digitalWrite(water, HIGH); // включаем увлажнитель
myTimerWater = millis(); // фиксируем время включения увлажнителя
Serial.println("Включен увлажнитель");
}
}
if (d % 2 > 0 && m < 1 && s >= 35 && d != lastHour) { // выполняется каждую первую минуту нечетного часа т.е. раз в 2 часа
Serial.println(rtc.getTimeStr());
lastHour = d;
if (getValueSensor(10, 3) < 900) { // запускаем функцию измерения влажности почвы и полученое значение сравниваем с пределом. ПРЕДЕЛ ДЛЯ ПОМПЫ МЕНЯТЬ ЗДЕСЬ
digitalWrite(pump, HIGH); // включаем помпу
myTimerPump = millis(); // фиксируем время включения помпы
Serial.println("Помпа запущена");
}
}
if (millis() - myTimerVentil >= 30000) { // выключаем кулер через 30 с.
if (digitalRead(ventil)) {
Serial.print(rtc.getTimeStr());
Serial.println(" Кулер остановлен");
}
digitalWrite(ventil, LOW);
}
if (millis() - myTimerWater >= 60000) { // выключаем увлажнитель через 60 с.
if (digitalRead(water)) {
Serial.print(rtc.getTimeStr());
Serial.println(" Увлажнитель отключен");
}
digitalWrite(water, LOW);
}
if (millis() - myTimerPump >= 10000) { // выключаем помпу через 10 с.
if (digitalRead(pump)) {
Serial.print(rtc.getTimeStr());
Serial.println(" Помпа остановлена");
}
digitalWrite(pump, LOW);
}
}
//функция определения влажности почвы
int getValueSensor(int quantity, int Interval) {
int sum = 0;
for (int i = 0; i < quantity; i++) {
sum += analogRead(sensorPin);
delay (Interval);
}
int result = sum / quantity;
Serial.print(result);
Serial.println(" - Влажность почвы");
return result;
}
//функция определения температуры и влажности
void getValueDHT(int quantity, int Interval) {
if (isnan(dht.readHumidity()) || isnan(dht.readTemperature())) {
Serial.println("Failed to read from DHT sensor!");
return;
}
float h = 0;
float t = 0;
for (int i = 0; i < quantity; i++) {
h += dht.readHumidity();
t += dht.readTemperature();
delay (Interval);
}
h = h / quantity;
t = t / quantity;
currentTemp = t;
currentHum = h;
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
return;
}
Делаю гроубокс с автоматическим включением, выключением лампы, регулировкой температуры и влажности. Имеются таки железки:
- Arduino Uno;
- аналоговый датчик влажности почвы;
- модуль часов в реальном времени DS1302;
- датчик температуры и влажности DHT 21;
- 4-х канальный твердотельный релейный модуль G3MB-202P.
Искал готовый скетч под мои желания, но находил все не то, с какими-то экранами, энкодерами, кнопками, менюшками. А мне хотелось попроще. В итоге заказал человеку код. Скетч меня полностью устраивает, хотя, может он и не идеальный, я не сильно разбираюсь, но главное - работает так, как я хочу. Я вижу в нем где можно изменить пределы температуры и влажности, периоды и продолжительность работы железок.
НО, пришла платка Wemos D1 mini и я хочу переделать этот код под неё. Для начала хотя-бы просмотр показаний датчиков в браузере и управление железом, ну а предел мечтаний получить такой функционал на смартфон (через Blynk, MIT App Inventor или что-то другое). Видел несколько таких проектов, но опять же они не совпадают с моими желаниями и сделаны под другое железо.
Вопрос, может кто-то сможет переделать мой код под Wemos D1 mini? Или у кого-то есть похожий скетч?
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
2 ответа на этот вопрос
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас