#1 2016-06-23 19:08:13

seruy137
Учасник
Зареєстрований: 2016-06-23
Повідомлень: 1

Зависает arduino uno.

Начал заниматься ардуино приблизительно недели четыре. Соединил в кучу два скетча. Для проветривания теплицы. Если температура подымается выше 21 градуса открываются окна и включается проветривание. Все работает, но при падении температуры до 21 градуса иногда 22 градуса все виснет. DHT11  не реагирует на принудительное повышение температуры, на lcd температура 21 градус. Но окна открыты и проветривание работает. При отключении и включении все начинает работать как надо. Прошу помощи у знающих, подскажите куда копать.


    Первый.


#include <dht.h>



#define dht_apin A1 // Analog Pin sensor is connected to

dht DHT;
int relepin = 4;
int releA = 3;
int releB = 5;
int releC = 6;
int releD = 7;
int releE = 8;
int releF = 9;
int releG = 10;
int releH = 11;

void setup(){
pinMode(relepin, OUTPUT);
pinMode(releA, OUTPUT);
pinMode(releB, OUTPUT);
pinMode(releC, OUTPUT);
pinMode(releD, OUTPUT);
pinMode(releE, OUTPUT);
pinMode(releF, OUTPUT);
pinMode(releG, OUTPUT);
pinMode(releH, OUTPUT);
Serial.begin(9600);
delay(500);//Delay to let system boot
Serial.println("DHT11 Humidity & temperature Sensor\n\n");
delay(1000);//Wait before accessing Sensor
}//end "setup()"

void loop(){
//Start of Program
DHT.read11(dht_apin);
Serial.print("Current humidity = ");
Serial.print(DHT.humidity);
Serial.print("%  ");
Serial.print("temperature = ");
Serial.print(DHT.temperature);
Serial.println("C  ");

if (DHT.temperature < 21){
digitalWrite(relepin, HIGH);
digitalWrite(releA, HIGH);
digitalWrite(releH, HIGH);
digitalWrite(releD, HIGH);
digitalWrite(releE, HIGH);
   digitalWrite(releB, LOW);
   digitalWrite(releC, LOW);
   digitalWrite(releF, LOW);
   digitalWrite(releG, LOW);

  }
  else { digitalWrite(relepin, LOW);
         digitalWrite(releA, LOW);
         digitalWrite(releH, LOW);
         digitalWrite(releD, LOW);
         digitalWrite(releE, LOW);
   digitalWrite(releB, HIGH);
   digitalWrite(releC, HIGH);
   digitalWrite(releF, HIGH);
   digitalWrite(releG, HIGH); 
 
  }
       
delay(5000);
}//end "setup()"

   
    Второй.


//Тестировалось на Arduino IDE 1.0.5
#include <Wire.h>        // Добавляем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include <dht11.h>
dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN A1     // Датчик DHT11 подключен к цифровому пину номер 4

byte degree[8] =         // Битовая маска символа градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};   

LiquidCrystal_I2C lcd(0x27,16,2);   // Задаем адрес и размерность дисплея

void setup()
{
  lcd.init();                       // Инициализация lcd             
  lcd.backlight();                  // Включаем подсветку
  lcd.createChar(1, degree);        // Создаем символ под номером 1
}

void loop()
{
  // Выводим показания влажности и температуры
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("Humidity =    % ");     // Выводим текст
  lcd.setCursor(11, 0);
  lcd.print(DHT.humidity, 1);
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("Temp     =   \1C ");    // Выводим текст, \1 - значок градуса
  lcd.setCursor(11, 1);             
  lcd.print(DHT.temperature,1); 

  int chk;   
  ; // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  switch (chk){
  case DHTLIB_OK: 
    break;
  case DHTLIB_ERROR_CHECKSUM: 
    lcd.clear();
    lcd.print("Checksum error"); 
    break;
  case DHTLIB_ERROR_TIMEOUT:
    lcd.clear();
    lcd.print("Time out error");
    break;
  default:
    lcd.clear();
    lcd.print("Unknown error");
    break;
  }
  delay(1000);                     
}

    То что вышло.


//Тестировалось на Arduino IDE 1.0.5
#include <Wire.h>        // Добавляем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include <dht11.h>
dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN A1     // Датчик DHT11 подключен к цифровому пину номер 4

byte degree[8] =         // Битовая маска символа градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};   

LiquidCrystal_I2C lcd(0x27,16,2);   // Задаем адрес и размерность дисплея
int relepin = 4;
int releA = 3;
int releB = 5;
int releC = 6;
int releD = 7;
int releE = 8;
int releF = 9;
int releG = 10;
int releH = 11;

void setup()
{
  lcd.init();                       // Инициализация lcd             
  lcd.backlight();                  // Включаем подсветку
  lcd.createChar(1, degree); // Создаем символ под номером 1
pinMode(relepin, OUTPUT);
pinMode(releA, OUTPUT);
pinMode(releB, OUTPUT);
pinMode(releC, OUTPUT);
pinMode(releD, OUTPUT);
pinMode(releE, OUTPUT);
pinMode(releF, OUTPUT);
pinMode(releG, OUTPUT);
pinMode(releH, OUTPUT);
Serial.begin(9600);
delay(500);//Delay to let system boot
Serial.println("DHT11 Humidity & temperature Sensor\n\n");
delay(1000);//Wait before accessing Sensor 
 
}

void loop()
{
  // Выводим показания влажности и температуры
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("Humidity =    % ");     // Выводим текст
  lcd.setCursor(11, 0);
  lcd.print(DHT.humidity, 1);
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("Temp     =   \1C ");    // Выводим текст, \1 - значок градуса
  lcd.setCursor(11, 1);             
  lcd.print(DHT.temperature,1);

  if (DHT.temperature < 21){
digitalWrite(relepin, HIGH);
digitalWrite(releA, HIGH);
digitalWrite(releH, HIGH);
digitalWrite(releD, HIGH);
digitalWrite(releE, HIGH);
   digitalWrite(releB, LOW);
   digitalWrite(releC, LOW);
   digitalWrite(releF, LOW);
   digitalWrite(releG, LOW);

  }
  else { digitalWrite(relepin, LOW);
         digitalWrite(releA, LOW);
         digitalWrite(releH, LOW);
         digitalWrite(releD, LOW);
         digitalWrite(releE, LOW);
   digitalWrite(releB, HIGH);
   digitalWrite(releC, HIGH);
   digitalWrite(releF, HIGH);
   digitalWrite(releG, HIGH); 
  }
  int chk;   
  ; // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  switch (chk){
  case DHTLIB_OK: 
    break;
  case DHTLIB_ERROR_CHECKSUM: 
    lcd.clear();
    lcd.print("Checksum error"); 
    break;
  case DHTLIB_ERROR_TIMEOUT:
    lcd.clear();
    lcd.print("Time out error");
    break;
  default:
    lcd.clear();
    lcd.print("Unknown error");
    break;
  }delay(1000);
}

Остання редакція seruy137 (2016-06-23 19:11:00)

Неактивний

#2 2016-08-09 10:01:46

prv_projects
Учасник
З Украина
Зареєстрований: 2015-12-22
Повідомлень: 3
Сайт

Re: Зависает arduino uno.

Скорее всего датчик не успевает выполнить преобразование температуры до момента выполнения условия, поэтому и зависает. Рекомендую в цикле loop перед условием
if (DHT.temperature < 21) поставить задержку delay(2000), чтобы датчик успевал выполнить нужные операции.

Неактивний

#3 2016-08-09 18:30:42

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Зависает arduino uno.

Если надо найти ошибку, а идей нет. Начни с постепеного выбрасывания неважных или маловажных команд. Скорее в программе стоит "замок". Вот при 21 он защелкивается.

Неактивний

#4 2016-08-10 23:54:13

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Зависает arduino uno.

1. Не нравится мне монитор ошибок  big_smile . Но это так между прочим (лирическое отступление). Целочисленное chk сравнивается символьной меткой в case http://arduino.ua/ru/prog/SwitchCase. Но это скетч не "повесит" roll .
2. На каком расстоянии (какая длина линии датчика, и каким проводом выполнена есть ли подтяжка) от блока находится датчик. Надо иметь ввиду что DHT11 это не совсем 1-Wire, и то что позволительно DS18B20 здесь не всегда прокатит.
Именно в электронике я бы искал причину big_smile . Почему? Да потому что в скетче нечему "вешать". Скорее всего из за плохой связи с датчиком вешает библиотека dht11.h. Я бы рекомендовал заменить ее на универсальную ( для DHT11 и DHT22) - dht.h .

Остання редакція Nefreemen (2016-08-11 00:02:05)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму