Arduino Polska Forum

Pełna wersja: DHT22 zawiesza program
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
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.
Wszystkie zmienne zmieniane w przerwaniu muszą mieć kwalifikator volatile, czyli ma być
Kod:
volatile int z = 0;
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
(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.
Zmieniłeś to o czym pisałem? przerwania zaczęły działać?
(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.
A jak się objawia to zawieszanie?
(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.
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)?
Po usunięciu ww. elementów program dalej się zawiesza. 
Nie będzie to spowodowane np. jakimś konfliktem związanym z bibliotekami ?
Stron: 1 2