AndreyASUNO

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

19 сообщений в этой теме

AndreyASUNO    0

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
AndreyASUNO    0

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

Алгоритм:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Rede RED    927

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
o_l_e_g    1 641

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
AndreyASUNO    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
_VN_    20

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
o_l_e_g    1 641

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гор    122

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

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

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

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

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

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

наружную

и внутреннюю

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

По простому:

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

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

Изменено пользователем Гор

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
AndreyASUNO    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гор    122

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
APB    122

Перед тем как вентилировать подвал нужно сделать гидро и тепло изоляцию стен и пола.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
AndreyASUNO    0

По мере работ по разработки ПО и и самого железа столкнулся с тем что 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
AndreyASUNO    0

#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); } // Попискивание при записи очередных элементов массива */

}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
AndreyASUNO    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 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]}'

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

 

 

Поделиться сообщением


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

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

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: Alexey104
      Всем привет!
      Возникла следующая проблема:
       
      Есть две ардуины 'Mega2560'. По несчастливому стечению обстоятельств данные платы попали в руки одному чуваку, который, вернув их, заявил, что они перестали работать после того, как он "чисто ради интереса" поковырял на обеих некоторые фьюзы. Есть у меня такой китайский usbasp v2 программатор:
      Подключив данный девайс к ICSP-пинам первой платы, удалось без проблем восстановить на ней загрузчик через стандартную Arduino-IDE, после чего работоспособность платы полностью восстановилась. Но вот при попытке сделать то же самое со второй платой, получаю это:
      Такое же сообщение получаю при попытке зашить загрузчик в неподключенную к программатору ардуину, то есть программатор вообще не видит МК. Плата прекрасно работала до того, как вышеупомянутый товарищ покрутил настройки фьюзов.
       
      Что я пытался предпринять:
      Замыкал пины JP3 программатора, отвечающие за понижение скорости, подключал к ардуине 5V от внешнего источника при прошивке загрузчика, - не помогло.
       
      Поиском пользоваться умею, аналогичную тему тут находил, но там проблема была в том, что парень неверно подключал программатор к контроллеру. В моём же случае всё подключено верно, повторюсь, что загрузчик первой платы этим же программатором был восстановлен успешно.
      Буду рад любым советам касательно того, как восстановить работоспособность платы.
       
       
       
    • Автор: Andrew_C
      Продам аналог Gameduino. Работает со скетчами Gameduino 2/3. Цена 1990 р.



    • Автор: alfavirtual
      Всем привет ,
        есть дисплей на tm1637 и стандартная библиотека 
       с помощью какой команды его можно отключать (нужно для экономии заряда)
        в примерах ничего не могу найти .
    • Автор: Kiraspbkiev Kira
      День Добрый. Есть два вопроса от новичка: 1) Правильная ли схема сделанная мною? 2) если схема верна то как правильно подключить к atmega328p-mu usb на чипе cp2102-grm?
      На схеме колодка JP1 это AVR ISP а JP2 это UART
      С проектированием столкнулся в первый раз, цель узнать что то новое и сделать своими руками:)

  • Сообщения

    • Зачем? Он и так скоммутирует то, что надо. Ты нам про костыли объясни, а то спросили, а ответа нету. И ещё, про "прокачать"?  Это насосы качают-прокачивают, а усилитель усиливает. Хотя, там где выхлопы, транзюки-кондюки, ослики с генами... там, да, прокачать самое то. Схема твоего "прокачивателя" хороша, но... чуть не то что надо. Я бы рекомендовал для включения от генератора светодиодов, оптронов и пр. такую схему
    • У вас удивительная способность говорить о фильме которого не видели...Ну да ладно. Как я понял двигатель Wright R-3350 Duplex-... не использует аварийный запуск с использованием пиротехнических средств. То какой использует ,наведите пример. Спрашиваю как специалиста... 
    • Нау слушал 1984-86, когда тексты писал Кормильцев. Потом смысл ушёл и тексты стали несуразным набором слов, бессмыслицей как к группы Смысловые галлюцинации. Галлюцинации в их творчестве есть а смысла нет. По такому же пути пошёл и Бутусов. Лабрадор-Гибралтар и тп... Вот раньше был Князь тишины, Шар цвета хаки, Гороховые зёрна... там был Эзопов язык, был смысл а не набор слов. А вот Воскресение Сапунова это дааа. Особо нравиться вот это   Когда слушаю эту Вещь, реву белугой... эмоции зашкаливают... на сколько сильная и глубокая вещь, достаёт до самых самых....  Такие же эмоции вызывает  Трофимовская вещь Боги мои боги... и Родина      
    • Вот собственно и поделка в сборе, зелёная плата это оригинал, жёлтая в миниатюре модуль. Осталось внедрить в автомагнитолу https://youtu.be/hF3WapGAEm0
    • В личной переписке молчание. Здесь - возмущение. Прошу извинить, но я смотрю личную переписку... Думаю у Лучезара дешевле будет за пересылку, у него все будет "компактнее"...
    • "Самопалу", Валерий Сергеевич, закон, вообще, не писан. Эт нам Василичь годами ежедневно доказывает. Вы видели на заводе методику установки тока покоя, на глаз, по покраснению анода? А у Василича есть. Официальному производству, тем более, на "военку", закон, ох как не пофиг.... В общем, я понял. Очередное сотрясение воздуха. "Куча конструкций" оказалась пшиком. Ладно, не впервой. Неужели?. У меня,, Валерий Сергеевич, в отличие от Вас, кроме слов, найдётся немого фоток. Как минимум, 703-й Электрон и 704-я Радуга.   А Вы говорите - никогда. Я, ведь, тоже чинил телевизоры. И ДМВ конвертеры на 6Н3П собирал. Правда, в свободное от работы время. Но, помню - было. Всяко стояли. Внезапно. А кто? В чёрно-белых был небольшой разнобой. С явным лидерством 6П36С. А, вот в цветных, с 59-й / 61-й трубками, кроме как 45-й ничего не встречал. Валерий Сергеевич! Может поделитесь информацией. В смысле, фактами, а не зыбкими воспоминаниями. Ельяшкевича откройте. Может там чего написано.
    • @kotenok Эт местные муниципалитеты жмотят бабки на благоустройство. В разных районах по разному. У нас в цннтре мусорок как собак нерезанных а вот на переферии они таки да, возле сетевых магазов и приличных торговых точках. Но на переферии народ не такой грязнуля плюс "субботничает" по собственной инициативе. А в центре "служба чистоты" порядок наводит и народ более обнаглевший, свиничает... типа один хрен служба "Чистый город" всё уберёт, это её работа, они за это бабки получают. Иногда хочеься сказать :- А ты вот пойди и повкалывай с раннего утра и до темна за те "бабки" и тогда посмотрим на тебя, будешь бросать окурки и харкать ... Кто нибуть слышал о чем говорят уборщики? Как они нас всех клянут... мы 100500 раз уже должны провалиться в царство Аида и гореть в гиене огненной... а вот зимой они на нас отрываются за лето... вышел из подъезда, сделал два шага и тут же сосчитал сту-пень-пень-пень-ки.