/*
// подключим библиотеки для энкодера и дисплея
#include "GyverTM1637.h"
#include "GyverEncoder.h"
//Определим пины
//энкодера
#define ENC_A 5
#define ENC_B 6
#define ENC_SW 7
#define ENC_TYPE 0 // тип энкодера, 0 или 1
//дисплея
#define CLK A4
#define DIO A5
//#difine pumpPin 4
//определим границы интервалов
// полива (в секундах)
#define MaxFlow 60
#define MinFlow 1
//промежутка между поливами (в днях)
#define MaxPeriod 70
#define MinPeriod 1
//определим переменные и начальные данные
int pumpPin = 4; // Пин, реле управление насосом
int volume=10;
int period=10;
uint32_t mainTimer, myTimer;
//флаги
boolean state = false; // насос
boolean chFlag = false; //настройка параметра
boolean dispFlag = false; //дисплей
//инициализация энкодера и дисплея
GyverTM1637 disp(CLK, DIO);
Encoder enc(ENC_A,ENC_B,ENC_SW);
void setup() {
//Serial.begin(9600);
disp.clear(); //очистка дисплея
disp.brightness(7); // яркость, 0 - 7 (минимум - максимум)
enc.setType(TYPE2);
digitalWrite(pumpPin, LOW);
//вывод значения потока
disp.displayByte(3, _F);
disp.display(0, volume/10);
disp.display(1, volume%10);
}
void loop() {
enc.tick(); //опрашиваем энкодер
if (enc.isRight()) { //крутим энкодер вправо (увеличиваем...)
if (!chFlag) {//время полива
if (volume>MaxFlow-2) {
volume=MinFlow-1;
}
volume++;
disp.displayByte(3, _F);
disp.display(0, volume/10);
disp.display(1, volume%10);
}
else { //интервал между поливами
if (period>MaxPeriod-2){
period=MinFlow-1;
}
period++;
disp.displayByte(3, _P);
disp.display(0, period/10);
disp.display(1, period%10);
}
}
if (enc.isLeft()) {//крутим энкодер влево (уменьшаем...)
if (!chFlag) { //время полива
if (volume<MinFlow+1) {
volume=MaxFlow;
}
volume--;
disp.displayByte(3, _F);
disp.display(0, volume/10);
disp.display(1, volume%10);
}
else { //интервал между поливами
if (period<MinPeriod+1) {
period=MaxPeriod;
}
period--;
disp.displayByte(3, _P);
disp.display(0, period/10);
disp.display(1, period%10);
}
}
if (enc.isDouble()) { //клик энкодером переключает то, что вращением энкодера изменяется (полив или интервал)
if (!chFlag) {
chFlag = true;
disp.clear();
disp.displayByte(3, _P);
disp.display(0, period/10);
disp.display(1, period%10);
}
else { // если помпа включена
chFlag = false; // флаг на выкл
disp.clear();
disp.displayByte(3, _F);
disp.display(0, volume/10);
disp.display(1, volume%10);
}
}
if (enc.isClick()) { //клик энкодером переключает то, что вращением энкодера изменяется (полив или интервал)
if (!dispFlag) {
dispFlag = true;
disp.clear();
}
else { // если помпа включена
dispFlag = false; // флаг на выкл
disp.displayByte(3, _F);
disp.display(0, volume/10);
disp.display(1, volume%10);
}
}
mainTimer=millis(); //главный таймер
if (!state) { // если насос не включен
if ((long)mainTimer - myTimer > period*100) { // таймер периода межу поливами
myTimer = mainTimer; // сброс таймера
state = true; // флаг на запуск
disp.point(POINT_ON);
pinMode(pumpPin, OUTPUT);
digitalWrite(pumpPin, HIGH); // включаем насос
}
}
else { // если помпа включена
if ((long)mainTimer - myTimer >volume*100) { // таймер времени работы
myTimer = mainTimer; // сброс
state = false; // флаг на выкл
disp.point(POINT_OFF);
pinMode(pumpPin, INPUT);
digitalWrite(pumpPin, LOW);
}
}
}
*/
// подключим библиотеки для энкодера и дисплея
#include "GyverTM1637.h"
#include "GyverEncoder.h"
#include "DHT.h"
#define DHTPIN 2
//Определим пины
//энкодера
#define ENC_A 10
#define ENC_B 11
#define ENC_SW 12
#define ENC_TYPE 0 // тип энкодера, 0 или 1
#define DHTTYPE DHT22
//дисплея
#define CLK A1
#define DIO A2
//#difine pumpPin 4
//определим границы интервалов
// полива (в секундах)
#define MaxFlow 60
#define MinFlow 1
//промежутка между поливами (в днях)
#define MaxPeriod 70
#define MinPeriod 1
#define MaxHumidity 60
#define MinHumidity 30
#define MaxTemperature 30
#define MinTemperature 23
//определим переменные и начальные данные
int pumpPin = 3; // Пин, реле управление насосом
int flow=5;
int flowDelta;
int periodDelta;
int period=7;
int disFlag=1;
float Humi, Tempe, Heat;
uint32_t mainTimer, myTimer;
//флаги
boolean state = false; // насос
//инициализация энкодера и дисплея
GyverTM1637 disp(CLK, DIO);
Encoder enc(ENC_A,ENC_B,ENC_SW);
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
// Serial.println(disFlag);
dht.begin();
pinMode(2, INPUT);
disp.clear(); //очистка дисплея
disp.brightness(7); // яркость, 0 - 7 (минимум - максимум)
enc.setType(TYPE2);
digitalWrite(pumpPin, LOW);
displ();
//вывод значения потока
}
void loop() {
enc.tick(); //опрашиваем энкодер
if (enc.isRight()) { //крутим энкодер вправо (увеличиваем...)
if (disFlag==1) {//время полива
if (flow>MaxFlow-2) {
flow=MinFlow-1;
}
flow++;
displ();
}
if (disFlag==2) { //интервал между поливами
if (period>MaxPeriod-2){
period=MinFlow-1;
}
period++;
displ();
}
}
if (enc.isLeft()) {//крутим энкодер влево (уменьшаем...)
if (disFlag==1) { //время полива
if (flow<MinFlow+1) {
flow=MaxFlow;
}
flow--;
displ();
}
if (disFlag==2) { //интервал между поливами
if (period<MinPeriod+1) {
period=MaxPeriod;
}
period--;
displ();
}
}
/*
if (enc.isDouble()) { //клик энкодером переключает то, что вращением энкодера изменяется (полив или интервал)
if (!chFlag) {
chFlag = true;
disp.clear();
disp.displayByte(3, _P);
disp.display(0, period/10);
disp.display(1, period%10);
}
else { // если помпа включена
chFlag = false; // флаг на выкл
disp.clear();
disp.displayByte(3, _F);
disp.display(0, flow/10);
disp.display(1, flow%10);
}
}*/
if (enc.isClick()) { //клик энкодером переключает то, что вращением энкодера изменяется (полив или интервал)
disFlag++;
if (disFlag>6){
disFlag=1;
}
//Serial.println(disFlag);
displ();
}
//данные с датчика температуры
Humi = dht.readHumidity();
// Read temperature as Celsius (the default)
Tempe = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
// Check if any reads failed and exit early (to try again).
if (isnan(Humi) || isnan(Tempe)) {
// Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Compute heat index in Celsius (isFahreheit = false)
Heat = dht.computeHeatIndex(Tempe, Humi, false);
float heat1= (map(Humi, MinHumidity, MaxHumidity, MinFlow, MaxFlow));
float heat2= (map(Tempe, MinTemperature, MaxTemperature, MinFlow, MaxFlow));
// float heat3 = dht.computeHeatIndex(heat2, heat1, false);
flowDelta= dht.computeHeatIndex((map(Tempe, MinTemperature, MaxTemperature, MinFlow, MaxFlow)), (map(Humi, MinHumidity, MaxHumidity, MinFlow, MaxFlow)), false);
//float heat1=dht.computeHeatIndex(20, 60, false);//;
//#define MaxHumidity 60
//#define MinHumidity/? 30
//#define MaxTemperature 28 (29 при 60) (27 при 30)
//#define MinTemperature 20 (19 при 60 )(18 при 30)
//Serial.println(Tempe);
/*
Тепловой индекс - это параметр, который учитывает температуру и относительную влажность, чтобы определить
кажущуюся температуру или воспринимаемую человеком эквивалентную температуру. Индекс тепла был разработан
в 1978 году Джорджем Винтерлингом и был принят в следующем году. Он также известен какгумитура.
Чтобы вычислить этот индекс, необходимо знать текущую температуру и относительную влажность.
Простой способ найти и то, и другое - использовать плату разработки Arduino с датчиком DHT (DHT11, DHT22).
Эти датчики измеряют температуру и влажность и отправляют ее на микроконтроллер с помощью цифрового протокола.
Таким образом, нет необходимости в калибровке. Вы можете считывать значения непосредственно из сенсорного модуля.
Однако следует учитывать, что точность этих датчиков не самая лучшая. DHT11 имеет точность +/-5% для влажности и +/-2 градуса
Цельсия для температуры. DHT22 (AM2302) немного лучше с точностью +/-2% для влажности и +/-0,5 градусов Цельсия для температуры.
Более того, DHT22 расширил диапазоны как температуры, так и влажности.
Функция пропорционально переносит значение (value) из текущего диапазона значений (fromLow .. fromHigh) в новый диапазон (toLow .. toHigh), заданный параметрами.
Функция map() не ограничивает значение рамками диапазона, как это делает функция constrain(). Contrain() может быть использован до или после вызова map(), если необходимо ограничить допустимые значения заданным диапазоном.
Обратите внимание, что "нижняя граница" может быть как меньше, так и больше "верхней границы". Это может быть использовано для того чтобы "перевернуть" диапазон:
y = map(x, 1, 50, 50, 1);
Возможно использование отрицательных значений:
y = map(x, 1, 50, 50, -100);
Функция map() оперирует целыми числами. При пропорциональном переносе дробная часть не округляется по правилами, а просто отбрасывается.
*/
mainTimer=millis(); //главный таймер
//Serial.print(mainTimer-myTimer);
// Serial.print(", ");
if (!state) { // если насос не включен
if ((long)mainTimer - myTimer > (period+periodDelta)*1000) { // таймер периода межу поливами
myTimer = mainTimer; // сброс таймера
state = true; // флаг на запуск
// disp.point(POINT_ON);
pinMode(pumpPin, OUTPUT);
digitalWrite(pumpPin, HIGH); // включаем насос
Serial.println("КАЧАЕМ");
}
}
else { // если помпа включена
if ((long)mainTimer - myTimer >(flow+flowDelta)*1000) { // таймер времени работы
myTimer = mainTimer; // сброс
state = false; // флаг на выкл
// disp.point(POINT_OFF);
pinMode(pumpPin, INPUT);
digitalWrite(pumpPin, LOW);
Serial.println("ЖДЕМ");
}
}
}
void displ() {
if (disFlag==1){
disp.displayByte(3, _F);
disp.display(0, flow/10);
disp.display(1, flow%10);
}
if (disFlag==2){
disp.displayByte(3, _P);
disp.display(0, period/10);
disp.display(1, period%10);
}
if (disFlag==3){
disp.displayByte(3, _h);
disp.display(0, (byte)Humi/10);
disp.display(1, (byte)Humi%10);
}
if (disFlag==4){
disp.displayByte(3, _t);
disp.display(0, (byte)Tempe/10);
disp.display(1, (byte)Tempe%10);
}
if (disFlag==5){
disp.displayByte(3, _c);
disp.display(0, (byte)Heat/10);
disp.display(1, (byte)Heat%10);
}
if (disFlag==6){
disp.clear();
}
}