Arduino Polska Forum
DHT22 zawiesza program - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Czujniki (https://forum.arduinopolska.pl/dzial-czujniki)
+--- Wątek: DHT22 zawiesza program (/watek-dht22-zawiesza-program)

Strony: 1 2


DHT22 zawiesza program - Piter1401 - 18-12-2016

Witajcie, 
na początek uprzedzę, że jestem mocno początkującym w temacie arduino Wink 
Podczas pisania programu, obsługującego zegar czasu rzeczywistego DS1307 oraz pomiar temperatury i wilgotności realizowany za pomocą DHT22, napotkałem problem z którym nie mogę sobie poradzić i nie udało mi się znaleźć rozwiązania. 
Problem polega na tym, że program po chwili działania zupełnie się zawiesza. Nie reaguje nawet na przerwania. 

Arduino to model UNO.
Czujnik podpięty, przez rezystor podciągający (5,1k) do zasilania, do pinu 12.
Zegar DS1307 SDA - A4, SCL - A5.  

Kod:
#include <Wire.h>
#include <DHT.h>
#include <DS1307.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
#define DHTPIN 12
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int z = 0;
float te = 0 ;
float hu = 0;
DS1307 clock;
RTCDateTime dt;

void setup()
{
 dht.begin();
 attachInterrupt(0, przerwanie, RISING);
 lcd.begin(16, 2);
 lcd.clear();
 clock.begin();

 if (!clock.isReady())
 {
   clock.setDateTime(__DATE__, __TIME__);
 }

}

void przerwanie()
{
 z = z + 1;
 if ( z == 7 )
 {
   z = 0;
 }
}


void loop()
{
 if (z != 0 )
 {
   lcd.clear();
 }

 if ( z == 0 )
 {
   te = dht.readTemperature();
   hu = dht.readHumidity();
   dt = clock.getDateTime();

   if ( (dt.second) < 10 )
   {
     lcd.setCursor(6, 0);
     lcd.print("0");
     lcd.setCursor(7, 0);
     lcd.print(dt.second);
   }

   if ( (dt.minute) < 10 )
   {
     lcd.setCursor(3, 0);
     lcd.print("0");
     lcd.setCursor(4, 0);
     lcd.print(dt.minute);
   }

   if ((dt.hour) < 10 )
   {
     lcd.setCursor(0, 0);
     lcd.print("0");
     lcd.setCursor(1, 0);
     lcd.print(dt.hour);
   }



   if ((dt.hour) > 9 )
   {
     lcd.setCursor(0, 0);
     lcd.print(dt.hour);
   }

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

   if ( (dt.minute) > 9 )
   {
     lcd.setCursor(3, 0);
     lcd.print(dt.minute);
   }

   if ( (dt.second) > 9 )
   {
     lcd.setCursor(6, 0);
     lcd.print(dt.second);
   }

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

   lcd.setCursor(0, 1);
   lcd.print("H:");
   lcd.setCursor(2, 1);
   lcd.print(hu);
   lcd.setCursor(7, 1);
   lcd.print("%");
   lcd.setCursor(9, 1);
   lcd.print("T:");
   lcd.setCursor(11, 1);
   lcd.print(te);
 }


}


Bez czujnika DHT program działa bezproblemowo. 
Czy ktoś z Was mógłby mi pomóc lub naprowadzić gdzie jest błąd ? 
Z góry dziękuję za pomoc.


RE: DHT22 zawiesza program - namok - 18-12-2016

Wszystkie zmienne zmieniane w przerwaniu muszą mieć kwalifikator volatile, czyli ma być
Kod:
volatile int z = 0;



RE: DHT22 zawiesza program - Smaczek - 18-12-2016

Witam,
Jaki jest ważny powód, żeby Twój program był oparty o przerwania? Moim zdaniem jest to zupełnie zbyteczne.
Według kodu przerwanie masz wyzwalanie RISiNG-iem na pinie 2, który w ogóle nie jest podłączony!
Przyczyną wieszania programu, ale nie w Twoim przypadku, może być zbyt dlugi przewód pomiędzy czujnikiem a Arduino.
Pozdrawiam


RE: DHT22 zawiesza program - Piter1401 - 18-12-2016

(18-12-2016, 16:11)Smaczek napisał(a): Witam,
Jaki jest ważny powód, żeby Twój program był oparty o przerwania? Moim zdaniem jest to zupełnie zbyteczne.
Według kodu przerwanie masz wyzwalanie RISiNG-iem na pinie 2, który w ogóle nie jest podłączony!
Przyczyną wieszania programu, ale nie w Twoim przypadku, może być  zbyt dlugi przewód pomiędzy czujnikiem a Arduino.
Pozdrawiam

W dalszej części programu będzie konieczne aby po naciśnięciu przycisku program wszedł w menu bez zwłoki spowodowanej np. odczytem z czujników.


RE: DHT22 zawiesza program - namok - 18-12-2016

Zmieniłeś to o czym pisałem? przerwania zaczęły działać?


RE: DHT22 zawiesza program - Piter1401 - 18-12-2016

(18-12-2016, 16:37)namok napisał(a): Zmieniłeś to o czym pisałem? przerwania zaczęły działać?

Tak.  Dziękuję za zwrócenie na to uwagi. Przerwania jednak wcześniej też działały do momentu zawieszenia się programu.

Program niestety nadal się zawiesza.


RE: DHT22 zawiesza program - namok - 18-12-2016

A jak się objawia to zawieszanie?


RE: DHT22 zawiesza program - Piter1401 - 18-12-2016

(18-12-2016, 17:32)namok napisał(a): A jak się objawia to zawieszanie?

Na wyświetlaczu wszystko zostaje zamrożone, brak reakcji na przerwanie, brak reakcji na naciskanie przycisków.


RE: DHT22 zawiesza program - namok - 18-12-2016

1. Jak sprawdzałeś poprawność działania przerwań?

2. Czy program działa prawidłowo jeśli usuniesz z niego przerwania i te if'y:

Kod:
if (z != 0 )
{
  lcd.clear();
}

if ( z == 0 )
{
a całą reszata wyświetlania i odczytów zoztanie niezmieniona(oczywiście przedostatnia klamra } też do usunięcia)?


RE: DHT22 zawiesza program - Piter1401 - 18-12-2016

Po usunięciu ww. elementów program dalej się zawiesza. 
Nie będzie to spowodowane np. jakimś konfliktem związanym z bibliotekami ?