Jump to content

AndreyASUNO

Members
  • Content Count

    18
  • Joined

  • Last visited

Everything posted by AndreyASUNO

  1. Наступило тепло! Все встало на свои места! И оказазалось что все работает!
  2. В гараже беда! Прикрепил к стене, подключил датчики! Влажность в гараже 92 при температуре +2, в подвале 95 при температуре +4С! Вроде все завертелось закрутилось! Спустя минут 10 от первого включения на LCD начали пропадать столбцы отрисовки! Через 2 часа работы потухло процентов 70, невозможно разобрать ни температуру ни влажность! Беда!
  3. #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); } // Попискивание при записи очередных элементов массива */ } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  4. Нужно нести в гараж! Там смотреть!
  5. По мере работ по разработки ПО и и самого железа столкнулся с тем что DHT-11 вовольно сильно врут относительно друг друга! Три датчика находять на полутора сантиметровом расстоянии друг от друга дают показания по температуре : 1ый- 32, 2ой- 24, 3тий- 23 градуса! Подскажите кто игрался с DHT-22, они по точности также врут! Для калибровки датчиков ввел в схему Dallas 18B20! Получилась вот такая железка! (Назовем ее блочёк!) Появились три окошка с показаниями датчиков и статистики за последний час работы с дискретой вывода данных в 4 минуты! Добавил расчет точки росы для гаража и подвала, при котором блокируется работа вентиляторов! , , , появился режим принудительной продувки! и менюшка сводных данных с показанием температур точек росы!Кому интересно могу выложить полную рабочую схему и текст прошивки!
  6. Пока дело дошло до: http://upload.akushe...image730557.jpg http://upload.akusherstvo.ru/image730559.jpg
  7. Ну а если под вытяжную трубу в подвале поставить не свечу а керамическую трубку обмотанную нихромом и управление завести на контроллер! Мне кажется это будет более безопасно чем горящая свеча среди стелажей и ящиков!
  8. Про градиент температур - не знаю куда примкнуть данные о температуре от датчиков, а с осушителем интересно! Что именно Вы имеете в виду за осушитель ?
  9. Схема - приблизительно такая! Алгоритм: Поочередный опрос трех датчиков влажности размещенных на улиже в гараже и подвале! И включение и выключение вентиляторов в зависимости от данных по плажности и температуры!
  10. Здрасте всем! Имеется гараж с подвалом! Есть желание избавиться от влаги из помещения как гаража так и подвала! Расклад такой: 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); } Пока жду комплектацию по почте, может подскажете что еще можно учесть и добавить!
  11. В какой это закладке в меню? Не могу найти! Я правильно ищу в MPLAB?
  12. Здравствуйте Фуромчане! Приобрёл у знакомых, можно сказать на халяву PICkit3! документов нет, дров нет, сам программатор + кабель USB к нему! Чистенький сильно не покоцанный, и дали в нагрузку универсальный хидер от Sure Electronics (DB-UD11111V150). Второй день с этим бьюсь пока не победить! При подключении к MPLAB Ide пишет: PICkit 3 detected Connecting to PICkit 3... Running self test... Self test passed Firmware type......................Midrange PICkit 3 Connected. PK3Err0045: You must connect to a target device to use PICkit3. На эту ошибку в умных сайтах написано что на подключаемом девайсе отсутствует питание! проверил! питание пляшет от +4.72 до +4.8 проверял 16F877 и 16F84a - одинаково! При попытке записать что нибудь через PICkit 3 Programmer Application не проходит проверка после записи! Но считать с контроллера hex позволяет! Подскажите плиз что с этим поделать и как из сложивщейся ситуации выйти?
  13. Добился уменшения пинов до 4 на контроллере! А еще меньше можно уменьшить?
  14. В мультисими тоже все собралось! Alexeyslav - СПАСИБО! за наставление! по 4 битам с разных портов - заработало! по 4 битам с 1одного порта - заработало! Если надо кому выложу !
  15. ПРоверил! Да действительно приходит хрень какая то! Отказался от псевда универсальной последовательности команд иннициализации LCD содранной откуда то неведомо от куда! Посмотрел в date.... на Winstar, переписал: #include <pic.h> #include "C:\4\delay.c" #define RS RA0 #define EN RA2 void lcd_com(unsigned char p) { RS = 0; // RS = 0 EN = 1; // EN = 1 PORTB = p; DelayMs(10); EN = 0; // EN = 0 DelayMs(10); } void lcd_dat(unsigned char p) { RS = 1; // RS = 1 EN = 1; // EN = 1 PORTB = p; DelayMs(10); EN = 0; // EN = 0 DelayMs(10); } void lcd_init(void) { lcd_com(0x08); lcd_com(0x38); DelayMs(40); lcd_com(0x38); DelayMs(40); lcd_com(0x38); lcd_com(0x38); lcd_com(0x01); DelayMs(40); lcd_com(0x06); lcd_com(0x0D); } int main (void) { unsigned char znak = 0, b; TRISA = 0; TRISB = 0; lcd_init(); while (1) { lcd_com(0x0C); lcd_com(0x02); lcd_dat(znak/100 + 0x30); lcd_dat((znak/10)%10 + 0x30); lcd_dat(znak%10 + 0x30); lcd_dat('='); lcd_dat(znak); for (b=0; b < 10; b++) DelayMs(10); lcd_com(0x02); for (b=0; b < 5; b++) lcd_dat(' '); znak++; } } Всё получилось!
  16. А всего-то лишь, R/W надо на землю посадить Извините но дело не R/W! Проверял и этот вариант - просто для рисунка почемкто решил использовать - именно эту схему! Пробывал и 4 битную и 8 битную передачу и с одного порта и на разные разносил! Что то не так! Где то ошибки, а из-за не богатого опыта увидеть сам не могу! чёто к кодом какая то фигня наверное?
  17. Здравствуйту ФУРОМЧАНЕ!Пишу просто от отчаяния! Который день сижу голову ломаю как на LCD 16X2 высветить хоть какой ни будь символ! Перерыл тучу дукоментации! Примеров внятных и понятных на си для PIC не нашел! C AVR все как то проще - навалом всего, и код есть и расписано все вроде понятно! Но как то так случилось что с AVR не подружился! Единственное что было в ларьке с электроникой 16f84A - так как то к PICам и пристрастился! Помогите пожалуйста! Подкиньте понятно расписанный код и инициализацией! Если не жалко то и от библиотек чужих не откажусь! Спасибо заранее!
×
×
  • Create New...