• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
DHT22 zawiesza program
#1
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.
 
Odpowiedź
#2
Wszystkie zmienne zmieniane w przerwaniu muszą mieć kwalifikator volatile, czyli ma być
Kod:
volatile int z = 0;
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
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
 
Odpowiedź
#4
(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.
 
Odpowiedź
#5
Zmieniłeś to o czym pisałem? przerwania zaczęły działać?
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#6
(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.
 
Odpowiedź
#7
A jak się objawia to zawieszanie?
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#8
(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.
 
Odpowiedź
#9
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)?
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#10
Po usunięciu ww. elementów program dalej się zawiesza. 
Nie będzie to spowodowane np. jakimś konfliktem związanym z bibliotekami ?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości