Перейти к содержанию

Борьба С Влажностью


Рекомендуемые сообщения

Здрасте всем!

Имеется гараж с подвалом!

Есть желание избавиться от влаги из помещения как гаража так и подвала!

Расклад такой:

1. Arduino nano

2. LCD 16X2

3. I2C модуль для подключения LCD к 4, 5 ножкам Arduino

4. Вентиляторы - 3 шт. 220В. для вытяжек в квартирах.

5. Релейный модуль на 4 релюшки

Текст программки для зашивки в Аrduino

#include <DHT.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#define I2C_SDA 4 // I2C модуль для подключения LCD

#define I2C_SLC 5 // I2C модуль для подключения LCD

#define DHTPIN_U 2 // DHT-11 с улицы

#define DHTPIN_G 3 // DHT-11 в гараже

#define DHTPIN_P 6 // DHT-11 в подвале

#define VEN_U 7 // нога управления релюшкой вентилятора В1

#define VEN_G 8 // нога управления релюшкой вентилятора В2

#define VEN_P 9 // нога управления релюшкой вентилятора В3

LiquidCrystal_I2C lcd(0x27,16,2);

#define DHTTYPE DHT11

DHT dht_U(DHTPIN_U, DHTTYPE); //Улица

DHT dht_G(DHTPIN_G, DHTTYPE); //Гараж

DHT dht_P(DHTPIN_P, DHTTYPE); //Подвал

void setup (void)

{

lcd.init();

lcd.backlight();

// Serial.begin(9600);

dht_U.begin();

dht_G.begin();

dht_P.begin();

pinMode (VEN_U,OUTPUT); digitalWrite(VEN_U, LOW);

pinMode (VEN_G,OUTPUT); digitalWrite(VEN_G, LOW);

pinMode (VEN_P,OUTPUT); digitalWrite(VEN_P, LOW);

}

void loop ()

{

float h_U = dht_U.readHumidity();

float t_U = dht_U.readTemperature();

if (isnan(t_U) || isnan(h_U))

{

Serial.println("Failed to read from DHT_U");

} else

{

// Serial.print("Hum:"); Serial.print(h_U); Serial.print(" %\t");

// Serial.print("Tem:"); Serial.print(t_U); Serial.println(" *C");

lcd.print("H_U="); lcd.print(h_U);

lcd.print("T_U="); lcd.print(t_U);

}

if (t_U < 0) digitalWrite(VEN_U, LOW);

if (h_U > 90) digitalWrite(VEN_U, LOW);

float h_G = dht_G.readHumidity();

float t_G = dht_G.readTemperature();

if (isnan(t_G) || isnan(h_G))

{

Serial.println("Failed to read from DHT_G");

} else

{

// Serial.print("Hum:"); Serial.print(h_G); Serial.print(" %\t");

// Serial.print("Tem:"); Serial.print(t_G); Serial.println(" *C");

lcd.print("H_G="); lcd.print(h_G);

lcd.print("T_G="); lcd.print(t_G);

}

if (h_G > h_U) digitalWrite(VEN_U, HIGH);

if (h_G > 90) digitalWrite(VEN_G, LOW);

if (t_G < 0) digitalWrite(VEN_G, LOW);

float h_P = dht_P.readHumidity();

float t_P = dht_P.readTemperature();

if (isnan(t_P) || isnan(h_P))

{

Serial.println("Failed to read from DHT_P");

} else

{

// Serial.print("Hum:"); Serial.print(h_P); Serial.print(" %\t");

// Serial.print("Tem:"); Serial.print(t_P); Serial.println(" *C");

lcd.print("H_P="); lcd.print(h_P);

lcd.print("T_P="); lcd.print(t_P);

}

if (h_P > h_G) digitalWrite(VEN_P, HIGH);

if (t_G < 0) digitalWrite(VEN_G, LOW);

}

Пока жду комплектацию по почте, может подскажете что еще можно учесть и добавить!

post-151627-0-17961300-1420374155_thumb.png

Изменено пользователем AndreyASUNO
Ссылка на комментарий
Поделиться на другие сайты

Схема - приблизительно такая!

Алгоритм:

Поочередный опрос трех датчиков влажности размещенных на улиже в гараже и подвале!

И включение и выключение вентиляторов в зависимости от данных по плажности и температуры!

post-151627-0-24034500-1420377325_thumb.jpg

Изменено пользователем AndreyASUNO
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

как вариант попроще = ставь крупную свечку под вытяжку в подвал на час... два,три. а там сам увидишь.

http://www.drive2.ru/b/1240725/

и почитай коментарии...

Изменено пользователем Rede RED

Что обещано- УЖЕ НЕ ТВОЕ

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Датчики влажности, дадут не всюинформацию, нужно еще учитывать градиент температуры.

А вообще, дам совет, идея реализуема, но геморна! Лучше сделать осушитель, и поставить один датчик.

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Про градиент температур - не знаю куда примкнуть данные о температуре от датчиков, а с осушителем интересно! Что именно Вы имеете в виду за осушитель ?

Ссылка на комментарий
Поделиться на другие сайты

Если стены и пол подвала сделаны из простого бетона, то избавиться от влажности очень сложно. Никакая вентиляция не поможет.

Для закупоривания капилляров бетона нужно пропитать стены и пол раствором силикатного клея с последующей сушкой в течение нескольких часов тепловентилятором. Пропитывать и сушить нужно несколько раз, пока не перестанет впитываться раствор.

Ссылка на комментарий
Поделиться на другие сайты

Что именно Вы имеете в виду за осушитель ?

Идея не моя, есть патентованное решение. Силикагель, пересыпается постоянно из одной полости в другую. Одна полость нагревается, и силикагель сушится, она сообщаться с атмосферой, таким образом уносится пар. Вторая полость, сообщается с осушаемым пространством. Датчик, стоит на выходе осушенного воздуха, регулируя интенсивность перемешивания и нагрева.

Очень эффективно! Установка в 9 кВт, держит 60% влажность в неотапливаемом помещении в 18000 куб метров, в любое время года.

Для гаража, это будет ватт 40, и то работать будет по мере надобности.

А с градиентом, если в гараже холодно, а на улице потеплело, то по притоку пойдет насыщение, вплоть до росы. Хоть, и сухой снаружи воздух.

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Ссылка на комментарий
Поделиться на другие сайты

На производстве сушат воздух в компрессорной. Блок осушки содержит два "бака":

-один поглощает влагу

-другой в это время нагревается до 140 (уточните в НЕТ) градусов с продувкой воздухом (140 имеет воздух). Автоматика такова - после прогрева силикагеля до 140 нагрев выключается, он считается высушенным. Если воздухом не продувать - это будет неправильно.

-------------------------------

Если силикагель перегреть - будет квака!

Также при вентиляции важно учитывать температуру:

наружную

и внутреннюю

Делать вывод о целесообразности вентиляции *потери тепла!) или же перегрев погреба летом.

По простому:

-при морозе вЫключать вентиляторы,

-летом днём не вентилировать.

Изменено пользователем Гор
Ссылка на комментарий
Поделиться на другие сайты

Ну а если под вытяжную трубу в подвале поставить не свечу а керамическую трубку обмотанную нихромом и управление завести на контроллер! Мне кажется это будет более безопасно чем горящая свеча среди стелажей и ящиков!

Ссылка на комментарий
Поделиться на другие сайты

Всё нужно КОНТРОЛЛировать, поэтому кроме влажности обязательно учитывать наружную температуру и эвристически "предвидеть" последствия вентилирования (либо невентилирования) при данных условиях, и делать выбор о необходимости и режиме вентилирования, осушения, подогрева... либо закупоривания труб.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
  • 1 месяц спустя...

По мере работ по разработки ПО и и самого железа столкнулся с тем что DHT-11 вовольно сильно врут относительно друг друга! Три датчика находять на полутора сантиметровом расстоянии друг от друга дают показания по температуре : 1ый- 32, 2ой- 24, 3тий- 23 градуса! Подскажите кто игрался с DHT-22, они по точности также врут!

Для калибровки датчиков ввел в схему Dallas 18B20! 747605.jpgПолучилась вот такая железка! (Назовем ее блочёк!) Появились три окошка с показаниями датчиков и статистики за последний час работы с дискретой вывода данных в 4 минуты! Добавил расчет точки росы для гаража и подвала, при котором блокируется работа вентиляторов!

747606.jpg, 747608.jpg, 747609.jpg, появился режим принудительной продувки! 747610.jpgи менюшка сводных данных с показанием температур точек росы!747611.jpgКому интересно могу выложить полную рабочую схему и текст прошивки!

Изменено пользователем AndreyASUNO
Ссылка на комментарий
Поделиться на другие сайты

#include <Bounce.h>

#include <math.h>

#include <Wire.h>

#include <DHT.h>

#include <LiquidCrystal_I2C.h>

#include <OneWire.h>

#define DHTPIN_U 2 // DHT-11 с улицы

#define DHTPIN_G 3 // DHT-11 в гараже

#define DHTPIN_P 4 // DHT-11 в подвале

#define DL_18B20 5 // Dallas 18B20

#define VEN_U 6 // Включение - выключение вентилятора с улицы в гараж

#define VEN_G 7 // Включение - выключение вентилятора из гаража в подвал

#define VEN_P 8 // Включение - выключение вентилятора из подвала на улицу

#define OBOGREV 9 // Включение - выключение оборгева

#define BUT_LEFT 11 // Кнопка левая

#define BUT_RIGH 10 // Кнопка правая

#define BUZER 12 // Пищалка

#define DHTTYPE DHT11 // тип датчика влажности для библиотеки <DHT.h>

DHT dht_U(DHTPIN_U, DHTTYPE); //сделали датчик для улицы

DHT dht_G(DHTPIN_G, DHTTYPE); //сделали датчик для гаража

DHT dht_P(DHTPIN_P, DHTTYPE); //сделали датчик для подвала

OneWire ds(DL_18B20); // //сделали датчик для гаража калибровочный

Bounce bouncer_BUT_LEFT = Bounce( BUT_LEFT,1); //Создали левую кнопку

Bounce bouncer_BUT_RIGH = Bounce( BUT_RIGH,1); //Создали правую кнопку

LiquidCrystal_I2C lcd(0x27,16,2); //

int h_U, t_U , h_G ; // переменные для влажности

int t_G, h_P , t_P ; // переменные для температуры

int matrix_h_U[17]; int matrix_t_U[17]; //массивы для улицы

int matrix_h_G[17]; int matrix_t_G[17]; //массивы для гаража

int matrix_h_P[17]; int matrix_t_P[17]; //массивы для подваля

int secundy=-1; int i=1; int tackt=0;

const float a=17.27;

const float b=237.7;

double c_G, c_P, c_U, vl_P, vl_G;

int Tochka_Rosy_G, Tochka_Rosy_P,Tochka_Rosy_U;

//---------------------------------------------------------------------------------------------------------

void produvka(void)//принудительная продувка 600 сек по нажатию правой кнопки!

{

lcd.clear();

int door=600;

while (door!=0)

{

digitalWrite(VEN_U, LOW); digitalWrite(VEN_G, LOW); digitalWrite(VEN_P, LOW); digitalWrite(OBOGREV, LOW);

lcd.setCursor(0,0); lcd.print("PRODUVKA 600 Sec");

lcd.setCursor(0,1); lcd.print("OcTalocb "); lcd.print(door); lcd.print(" Sec");

delay(1000);

door--;

}

digitalWrite(VEN_U, HIGH); digitalWrite(VEN_G, HIGH); digitalWrite(VEN_P, HIGH); digitalWrite(OBOGREV, HIGH);

lcd.clear();

}

//-----------------------------------------------------------------------------------------------------------------------------

void matrix_init (void) //заполяем массивы нулями

{int i_matrix=0;

for (i_matrix=0; i_matrix<60; i_matrix++)

{

matrix_h_U[i_matrix]=0; matrix_t_U[i_matrix]=0;

matrix_h_G[i_matrix]=0; matrix_t_G[i_matrix]=0;

matrix_h_P[i_matrix]=0; matrix_t_P[i_matrix]=0;

}

}

//----------------------------------------------------------------------------------------------------------------------------

void datchiki(void)//принятие решения на вкл или выкл релюшек

{

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

vl_G = double(h_G)/100;

vl_P = double(h_P)/100;

c_G = ((a*t_G)/(b+t_G))+log(vl_G);

Tochka_Rosy_G=int((b*c_G)/(a-c_G));

c_P = ((a*t_P)/(b+t_P))+log(vl_P);

Tochka_Rosy_P=int((b*c_P)/(a-c_P));

int Tochka_Rosy_G_min=Tochka_Rosy_G-2;

int Tochka_Rosy_G_max=Tochka_Rosy_G+2;

int Tochka_Rosy_P_min=Tochka_Rosy_P-2;

int Tochka_Rosy_P_max=Tochka_Rosy_P+2;

if (t_U<0) {digitalWrite(VEN_U, HIGH);}

else

{

if (t_G>Tochka_Rosy_G_min&&t_G<Tochka_Rosy_G_max) digitalWrite(VEN_U, HIGH); else

{

if (h_U>50) digitalWrite(VEN_U, HIGH); else digitalWrite(VEN_U, LOW);

};

};

if (t_G<0) {digitalWrite(VEN_G, HIGH);}

else

{

if (t_P>Tochka_Rosy_P_min&&t_P<Tochka_Rosy_P_max) digitalWrite(VEN_P, HIGH); else

{

if (h_G>50) digitalWrite(VEN_G, HIGH); else digitalWrite(VEN_G, LOW);

};

};

if (t_P<0) digitalWrite(VEN_P, HIGH);

else

{

if (h_P>50) digitalWrite(VEN_P, LOW); else digitalWrite(VEN_P, HIGH);

};

if (t_P<0) digitalWrite(OBOGREV, LOW);

else

{

if (h_P>60) digitalWrite(OBOGREV, LOW); else digitalWrite(OBOGREV, HIGH);

};

}

//--------------------------------------------------------------------------------------------------------------------------------

void svode (void) // сводная таблица с температурами и влажностями со всех трех DHT

{

//-------------------------

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

lcd.setCursor(0,0); lcd.print("T:="); lcd.print(t_U); lcd.print(" ");

lcd.setCursor(0,1); lcd.print("H:="); lcd.print(h_U); lcd.print(" ");

//-------------------------

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

lcd.setCursor(5,0); lcd.print("="); lcd.print(t_G); lcd.print(" ");

lcd.setCursor(5,1); lcd.print("="); lcd.print(h_G); lcd.print(" ");

//--------------------------

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

lcd.setCursor(8,0); lcd.print("="); lcd.print(t_P); lcd.print("Tg=");lcd.print(Tochka_Rosy_G); lcd.print(" ");

lcd.setCursor(8,1); lcd.print("="); lcd.print(h_P); lcd.print("Tp=");lcd.print(Tochka_Rosy_P); lcd.print(" ");

//--------------------------

delay(5000); lcd.clear(); //рисуется 5 сек и перетирает экран

}

//-------------------------------------------------------------------------------------------------------------------------------------------------

void menu_U (void)//получение влажности и температуры с улици

{

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

lcd.setCursor(0,0); lcd.print("OUTDOR:H="); lcd.print(h_U); lcd.print(" T=");lcd.print(t_U);

int a=0;

for (-1; a<16; a++)

{ lcd.setCursor(a,1);

int s =(matrix_h_U[a]/10);

switch (s)

{case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//-----------------------------------------------------------------------------------------------------------------------------------------------

void menu_G(void)//получение влажности и температуры из гаража

{

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

lcd.setCursor(0,0); lcd.print("GARAGE:H="); lcd.print(h_G); lcd.print(" T=");lcd.print(t_G);

int a=0;

for (-1; a<16; a++)

{ lcd.setCursor(a,1);

int s =int(matrix_h_G[a]/10);

switch (s)

{case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//-------------------------------------------------------------------------------------------------------------------------------------------------

void menu_P (void) //получение влажности и температуры из подвала

{

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

lcd.setCursor(0,0); lcd.print("BASEME:H="); lcd.print(h_P); lcd.print(" T=");lcd.print(t_P);

int a=0;

for (-1; a<16; a++)

{

lcd.setCursor(a,1);

int s =int(matrix_h_P[a]/10);

switch (s){

case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//----------------------------------------------------------------------------------------------------------------------------------------------------

void opros_datchikov (void)

{

//------------------------------------

lcd.setCursor(0,0); lcd.print("T:");

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

if (isnan(t_U) || isnan(h_U)) { lcd.print("Fail"); } else { lcd.print(t_U); lcd.setCursor(0,1); lcd.print("H:"); lcd.print(h_U); } ;

//-----------------------------------

lcd.setCursor(4,0); lcd.print("\4");

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

if (isnan(t_G) || isnan(h_G)) { lcd.print("Fail"); } else { lcd.print(t_G); lcd.setCursor(4,1); lcd.print("\4"); lcd.print(h_G); } ;

//-----------------------------------

lcd.setCursor(7,0); lcd.print("\4");

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

if (isnan(t_P) || isnan(h_P)) { lcd.print("Fail"); } else { lcd.print(t_P); lcd.setCursor(7,1); lcd.print("\4"); lcd.print(h_P); } ;

//------------------------------------

byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius;

if ( !ds.search(addr)) { ds.reset_search(); delay(250); return; }

switch (addr[0]) { case 0x10: type_s = 1; break; case 0x28: type_s = 0; break; case 0x22: type_s = 0; break; return;

} ds.reset(); ds.select(addr); ds.write(0x44, 1); delay(1000);

present = ds.reset(); ds.select(addr); ds.write(0xBE);

for ( i = 0; i < 9; i++) { data = ds.read(); } int16_t raw = (data[1] << 8) | data[0];

if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60);

if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; }

celsius = (float)raw / 16.0;

lcd.setCursor(10,0); lcd.print("\4"); lcd.print(celsius);

lcd.setCursor(10,1); lcd.print("\4"); lcd.print("\6");lcd.print("\4");lcd.print("\2");lcd.print("\5");lcd.print("\7");

//---------------------------------------

}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void setup (void)

{

dht_U.begin(); delay(1000);

dht_G.begin(); delay(1000);

dht_P.begin(); delay(1000);

lcd.init();

lcd.backlight(); delay(200);

lcd.noBacklight();

pinMode(VEN_U, OUTPUT); digitalWrite(VEN_U, HIGH);

pinMode(VEN_G, OUTPUT); digitalWrite(VEN_G, HIGH);

pinMode(VEN_P, OUTPUT); digitalWrite(VEN_P, HIGH);

pinMode(OBOGREV, OUTPUT); digitalWrite(OBOGREV, HIGH);

pinMode(BUT_LEFT,INPUT);

pinMode(BUT_RIGH,INPUT);

matrix_init();//заполняем нулями

byte linia_0 [8] = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111,}; lcd.createChar(0, linia_0);

byte linia_15[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111,}; lcd.createChar(1, linia_15);

byte linia_30[8] = { B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111,}; lcd.createChar(2, linia_30);

byte linia_45[8] = { B00000, B00000, B00000, B00000, B11111, B11111, B11111, B11111,}; lcd.createChar(3, linia_45);

byte linia_60[8] = { B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(4, linia_60);

byte linia_75[8] = { B00000, B00000, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(5, linia_75);

byte linia_90[8] = { B00000, B11111, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(6, linia_90);

byte linia_100[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(7, linia_100);

opros_datchikov();

delay(4000);

lcd.clear();

}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void loop (void)//вечный цикл в петле

{

datchiki(); //переключаем релюшки в зависимости от показаний датчиков

bouncer_BUT_LEFT.update ( ); int value_BUT_LEFT = bouncer_BUT_LEFT.read();

bouncer_BUT_RIGH.update ( ); int value_BUT_RIGH = bouncer_BUT_RIGH.read();

if ( value_BUT_LEFT == HIGH) { i++; if (i>4) i=1;}

if ( value_BUT_RIGH == HIGH) { produvka();} else {delay(1);}

switch (i)

{

case 1: menu_U() ; break;

case 2: menu_G() ; break;

case 3: menu_P() ; break;

case 4: {svode() ; delay(5000); i=1;} break;

}

tackt++;

//запись в массивы температуры и влажности

if (tackt>=115) // время между циклами записи в массивы порядка 4 минут

{tackt=0; secundy++; if (secundy>15)secundy=0;

matrix_h_U[secundy]=h_U; matrix_t_U[secundy]=t_U;

matrix_h_G[secundy]=h_G; matrix_t_G[secundy]=t_G;

matrix_h_P[secundy]=h_P; matrix_t_P[secundy]=t_P;

tone(12, 2000, 150); } // Попискивание при записи очередных элементов массива */

}

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Ссылка на комментарий
Поделиться на другие сайты

В гараже беда! Прикрепил к стене, подключил датчики! Влажность в гараже 92 при температуре +2, в подвале 95 при температуре +4С! Вроде все завертелось закрутилось! Спустя минут 10 от первого включения на LCD начали пропадать столбцы отрисовки! Через 2 часа работы потухло процентов 70, невозможно разобрать ни температуру ни влажность! Беда!

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
  • 2 года спустя...
В 24.02.2015 в 16:24, AndreyASUNO сказал:

#include <Bounce.h>

#include <math.h>

#include <Wire.h>

#include <DHT.h>

#include <LiquidCrystal_I2C.h>

#include <OneWire.h>

#define DHTPIN_U 2 // DHT-11 с улицы

#define DHTPIN_G 3 // DHT-11 в гараже

#define DHTPIN_P 4 // DHT-11 в подвале

#define DL_18B20 5 // Dallas 18B20

#define VEN_U 6 // Включение - выключение вентилятора с улицы в гараж

#define VEN_G 7 // Включение - выключение вентилятора из гаража в подвал

#define VEN_P 8 // Включение - выключение вентилятора из подвала на улицу

#define OBOGREV 9 // Включение - выключение оборгева

#define BUT_LEFT 11 // Кнопка левая

#define BUT_RIGH 10 // Кнопка правая

#define BUZER 12 // Пищалка

#define DHTTYPE DHT11 // тип датчика влажности для библиотеки <DHT.h>

DHT dht_U(DHTPIN_U, DHTTYPE); //сделали датчик для улицы

DHT dht_G(DHTPIN_G, DHTTYPE); //сделали датчик для гаража

DHT dht_P(DHTPIN_P, DHTTYPE); //сделали датчик для подвала

OneWire ds(DL_18B20); // //сделали датчик для гаража калибровочный

Bounce bouncer_BUT_LEFT = Bounce( BUT_LEFT,1); //Создали левую кнопку

Bounce bouncer_BUT_RIGH = Bounce( BUT_RIGH,1); //Создали правую кнопку

LiquidCrystal_I2C lcd(0x27,16,2); //

int h_U, t_U , h_G ; // переменные для влажности

int t_G, h_P , t_P ; // переменные для температуры

int matrix_h_U[17]; int matrix_t_U[17]; //массивы для улицы

int matrix_h_G[17]; int matrix_t_G[17]; //массивы для гаража

int matrix_h_P[17]; int matrix_t_P[17]; //массивы для подваля

int secundy=-1; int i=1; int tackt=0;

const float a=17.27;

const float b=237.7;

double c_G, c_P, c_U, vl_P, vl_G;

int Tochka_Rosy_G, Tochka_Rosy_P,Tochka_Rosy_U;

//---------------------------------------------------------------------------------------------------------

void produvka(void)//принудительная продувка 600 сек по нажатию правой кнопки!

{

lcd.clear();

int door=600;

while (door!=0)

{

digitalWrite(VEN_U, LOW); digitalWrite(VEN_G, LOW); digitalWrite(VEN_P, LOW); digitalWrite(OBOGREV, LOW);

lcd.setCursor(0,0); lcd.print("PRODUVKA 600 Sec");

lcd.setCursor(0,1); lcd.print("OcTalocb "); lcd.print(door); lcd.print(" Sec");

delay(1000);

door--;

}

digitalWrite(VEN_U, HIGH); digitalWrite(VEN_G, HIGH); digitalWrite(VEN_P, HIGH); digitalWrite(OBOGREV, HIGH);

lcd.clear();

}

//-----------------------------------------------------------------------------------------------------------------------------

void matrix_init (void) //заполяем массивы нулями

{int i_matrix=0;

for (i_matrix=0; i_matrix<60; i_matrix++)

{

matrix_h_U[i_matrix]=0; matrix_t_U[i_matrix]=0;

matrix_h_G[i_matrix]=0; matrix_t_G[i_matrix]=0;

matrix_h_P[i_matrix]=0; matrix_t_P[i_matrix]=0;

}

}

//----------------------------------------------------------------------------------------------------------------------------

void datchiki(void)//принятие решения на вкл или выкл релюшек

{

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

vl_G = double(h_G)/100;

vl_P = double(h_P)/100;

c_G = ((a*t_G)/(b+t_G))+log(vl_G);

Tochka_Rosy_G=int((b*c_G)/(a-c_G));

c_P = ((a*t_P)/(b+t_P))+log(vl_P);

Tochka_Rosy_P=int((b*c_P)/(a-c_P));

int Tochka_Rosy_G_min=Tochka_Rosy_G-2;

int Tochka_Rosy_G_max=Tochka_Rosy_G+2;

int Tochka_Rosy_P_min=Tochka_Rosy_P-2;

int Tochka_Rosy_P_max=Tochka_Rosy_P+2;

if (t_U<0) {digitalWrite(VEN_U, HIGH);}

else

{

if (t_G>Tochka_Rosy_G_min&&t_G<Tochka_Rosy_G_max) digitalWrite(VEN_U, HIGH); else

{

if (h_U>50) digitalWrite(VEN_U, HIGH); else digitalWrite(VEN_U, LOW);

};

};

if (t_G<0) {digitalWrite(VEN_G, HIGH);}

else

{

if (t_P>Tochka_Rosy_P_min&&t_P<Tochka_Rosy_P_max) digitalWrite(VEN_P, HIGH); else

{

if (h_G>50) digitalWrite(VEN_G, HIGH); else digitalWrite(VEN_G, LOW);

};

};

if (t_P<0) digitalWrite(VEN_P, HIGH);

else

{

if (h_P>50) digitalWrite(VEN_P, LOW); else digitalWrite(VEN_P, HIGH);

};

if (t_P<0) digitalWrite(OBOGREV, LOW);

else

{

if (h_P>60) digitalWrite(OBOGREV, LOW); else digitalWrite(OBOGREV, HIGH);

};

}

//--------------------------------------------------------------------------------------------------------------------------------

void svode (void) // сводная таблица с температурами и влажностями со всех трех DHT

{

//-------------------------

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

lcd.setCursor(0,0); lcd.print("T:="); lcd.print(t_U); lcd.print(" ");

lcd.setCursor(0,1); lcd.print("H:="); lcd.print(h_U); lcd.print(" ");

//-------------------------

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

lcd.setCursor(5,0); lcd.print("="); lcd.print(t_G); lcd.print(" ");

lcd.setCursor(5,1); lcd.print("="); lcd.print(h_G); lcd.print(" ");

//--------------------------

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

lcd.setCursor(8,0); lcd.print("="); lcd.print(t_P); lcd.print("Tg=");lcd.print(Tochka_Rosy_G); lcd.print(" ");

lcd.setCursor(8,1); lcd.print("="); lcd.print(h_P); lcd.print("Tp=");lcd.print(Tochka_Rosy_P); lcd.print(" ");

//--------------------------

delay(5000); lcd.clear(); //рисуется 5 сек и перетирает экран

}

//-------------------------------------------------------------------------------------------------------------------------------------------------

void menu_U (void)//получение влажности и температуры с улици

{

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

lcd.setCursor(0,0); lcd.print("OUTDOR:H="); lcd.print(h_U); lcd.print(" T=");lcd.print(t_U);

int a=0;

for (-1; a<16; a++)

{ lcd.setCursor(a,1);

int s =(matrix_h_U[a]/10);

switch (s)

{case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//-----------------------------------------------------------------------------------------------------------------------------------------------

void menu_G(void)//получение влажности и температуры из гаража

{

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

lcd.setCursor(0,0); lcd.print("GARAGE:H="); lcd.print(h_G); lcd.print(" T=");lcd.print(t_G);

int a=0;

for (-1; a<16; a++)

{ lcd.setCursor(a,1);

int s =int(matrix_h_G[a]/10);

switch (s)

{case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//-------------------------------------------------------------------------------------------------------------------------------------------------

void menu_P (void) //получение влажности и температуры из подвала

{

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

lcd.setCursor(0,0); lcd.print("BASEME:H="); lcd.print(h_P); lcd.print(" T=");lcd.print(t_P);

int a=0;

for (-1; a<16; a++)

{

lcd.setCursor(a,1);

int s =int(matrix_h_P[a]/10);

switch (s){

case 0: lcd.print("\0") ;break;

case 1: lcd.print("\1") ;break;

case 2: lcd.print("\1") ;break;

case 3: lcd.print("\2") ;break;

case 4: lcd.print("\3") ;break;

case 5: lcd.print("\4") ;break;

case 6: lcd.print("\5") ;break;

case 7: lcd.print("\6") ;break;

case 8: lcd.print("\7") ;break; }

}

}

//----------------------------------------------------------------------------------------------------------------------------------------------------

void opros_datchikov (void)

{

//------------------------------------

lcd.setCursor(0,0); lcd.print("T:");

t_U = dht_U.readTemperature()-14;

h_U = dht_U.readHumidity()-2;

if (isnan(t_U) || isnan(h_U)) { lcd.print("Fail"); } else { lcd.print(t_U); lcd.setCursor(0,1); lcd.print("H:"); lcd.print(h_U); } ;

//-----------------------------------

lcd.setCursor(4,0); lcd.print("\4");

t_G = dht_G.readTemperature()-1;

h_G = dht_G.readHumidity();

if (isnan(t_G) || isnan(h_G)) { lcd.print("Fail"); } else { lcd.print(t_G); lcd.setCursor(4,1); lcd.print("\4"); lcd.print(h_G); } ;

//-----------------------------------

lcd.setCursor(7,0); lcd.print("\4");

t_P = dht_P.readTemperature();

h_P = dht_P.readHumidity();

if (isnan(t_P) || isnan(h_P)) { lcd.print("Fail"); } else { lcd.print(t_P); lcd.setCursor(7,1); lcd.print("\4"); lcd.print(h_P); } ;

//------------------------------------

byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius;

if ( !ds.search(addr)) { ds.reset_search(); delay(250); return; }

switch (addr[0]) { case 0x10: type_s = 1; break; case 0x28: type_s = 0; break; case 0x22: type_s = 0; break; return;

} ds.reset(); ds.select(addr); ds.write(0x44, 1); delay(1000);

present = ds.reset(); ds.select(addr); ds.write(0xBE);

for ( i = 0; i < 9; i++) { data = ds.read(); } int16_t raw = (data[1] << 8) | data[0];

if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60);

if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; }

celsius = (float)raw / 16.0;

lcd.setCursor(10,0); lcd.print("\4"); lcd.print(celsius);

lcd.setCursor(10,1); lcd.print("\4"); lcd.print("\6");lcd.print("\4");lcd.print("\2");lcd.print("\5");lcd.print("\7");

//---------------------------------------

}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void setup (void)

{

dht_U.begin(); delay(1000);

dht_G.begin(); delay(1000);

dht_P.begin(); delay(1000);

lcd.init();

lcd.backlight(); delay(200);

lcd.noBacklight();

pinMode(VEN_U, OUTPUT); digitalWrite(VEN_U, HIGH);

pinMode(VEN_G, OUTPUT); digitalWrite(VEN_G, HIGH);

pinMode(VEN_P, OUTPUT); digitalWrite(VEN_P, HIGH);

pinMode(OBOGREV, OUTPUT); digitalWrite(OBOGREV, HIGH);

pinMode(BUT_LEFT,INPUT);

pinMode(BUT_RIGH,INPUT);

matrix_init();//заполняем нулями

byte linia_0 [8] = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111,}; lcd.createChar(0, linia_0);

byte linia_15[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111,}; lcd.createChar(1, linia_15);

byte linia_30[8] = { B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111,}; lcd.createChar(2, linia_30);

byte linia_45[8] = { B00000, B00000, B00000, B00000, B11111, B11111, B11111, B11111,}; lcd.createChar(3, linia_45);

byte linia_60[8] = { B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(4, linia_60);

byte linia_75[8] = { B00000, B00000, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(5, linia_75);

byte linia_90[8] = { B00000, B11111, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(6, linia_90);

byte linia_100[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111,}; lcd.createChar(7, linia_100);

opros_datchikov();

delay(4000);

lcd.clear();

}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void loop (void)//вечный цикл в петле

{

datchiki(); //переключаем релюшки в зависимости от показаний датчиков

bouncer_BUT_LEFT.update ( ); int value_BUT_LEFT = bouncer_BUT_LEFT.read();

bouncer_BUT_RIGH.update ( ); int value_BUT_RIGH = bouncer_BUT_RIGH.read();

if ( value_BUT_LEFT == HIGH) { i++; if (i>4) i=1;}

if ( value_BUT_RIGH == HIGH) { produvka();} else {delay(1);}

switch (i)

{

case 1: menu_U() ; break;

case 2: menu_G() ; break;

case 3: menu_P() ; break;

case 4: {svode() ; delay(5000); i=1;} break;

}

tackt++;

//запись в массивы температуры и влажности

if (tackt>=115) // время между циклами записи в массивы порядка 4 минут

{tackt=0; secundy++; if (secundy>15)secundy=0;

matrix_h_U[secundy]=h_U; matrix_t_U[secundy]=t_U;

matrix_h_G[secundy]=h_G; matrix_t_G[secundy]=t_G;

matrix_h_P[secundy]=h_P; matrix_t_P[secundy]=t_P;

tone(12, 2000, 150); } // Попискивание при записи очередных элементов массива */

}

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

хотел применить твой код но вылазит ошибка

 

Arduino: 1.8.3 (Windows 7), Плата:"Arduino Nano, ATmega328"

D:\РґРґРґ\garag\sket4\Garag_v1.1.1\Garag_v1.1.1.ino: In function 'void opros_datchikov()':

Garag_v1.1.1:439: error: incompatible types in assignment of 'uint8_t {aka unsigned char}' to 'byte [12] {aka unsigned char [12]}'

exit status 1
incompatible types in assignment of 'uint8_t {aka unsigned char}' to 'byte [12] {aka unsigned char [12]}'

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 

 

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...