Skocz do zawartości
Komentator

Kurs Arduino II - #8 - cyfrowy czujnik wilgotności (DHT11)

Pomocna odpowiedź

html_mig_img
Termometry (analogowe i cyfrowe), które zostały opisane podczas poprzedniego odcinka kursu, to zdecydowanie najczęściej używane sensory do pomiaru warunków atmosferycznych.Drugim równie popularnym tematem jest pomiar wilgotności, który będzie możliwy dzięki DHT-11!

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Udostępnij ten post


Link to post
Share on other sites

No to ja zacznę:

Lampa i pasek LED sterowany pilotem z odczytem temp i wilgotności.

Kierując się tylko informacjami z kursów (tak jak już to wcześniej wspominałem) poskładałem coś takiego. Podpatrzyłem jedynie jak podłączyć moduł przekaźnika RM0. A więc mamy tu odbiornik podczerwieni z kursu elektroniki II #7, stabilizator napięcia z kursu elektroniki #8, wyświetlacz z kursu arduino #7, tranzystor BC547 (sterowanie paskiem LED) zastosowany w lekcjach elektroniki i arduino, tak samo jak LED i przyciski, czujnik DS18B20 oraz czujnik DHT11 z ostatnich lekcji arduinoII. Część z czujnikiem DS18B20 robiłem chwilę przed lekcją w ramach przygotowania i jest trochę inaczej niż w kursie (to będę dziś poprawiał). Kod w wersji wczesnej alfa 🙂 cały czas modyfikowany - wczoraj przypisałem do przycisków włączanie i wyłączanie led i lampy tzn. włączanie i wyłączanie na jednym przycisku. Potem chcę coś zrobić z czasowym podświetleniem wyświetlacza (void ekranLed() ). Ten delay strasznie mrozi kod 🙂 Zabawa jest super. Chciałem wykorzystać pilot z kursu budowy robotów, ale tam do jednego przycisku przypisane są dwa kody, a to trochę mi skomplikowało myśl - więc poczekam jeszcze na stosowną lekcję.

No i kod - proszę nie krzyczeć - w wolnych chwilach poprawiam go 😉

                        //ODCZYT KODOW Z PILOTA
//#include <IRremote.h>
//#define irPin 11
//IRrecv irrecv(irPin);
//decode_results results;
// 
//void setup() {
//   Serial.begin(9600);
//   irrecv.enableIRIn();
//}
// 
//void loop() {
//   if (irrecv.decode(&results)) {
//      Serial.print("0x");
//      Serial.println(results.value, HEX);
//      delay(250);
//      irrecv.resume();
//      }
//}

                  // Czytnik numerów seryjnych czujników DS18B20
//
//#include <OneWire.h>
//
//// Numer pinu cyfrowego do którego podłaczyłęś czujniki
//const byte ONEWIRE_PIN = 2;
//
//OneWire onewire(ONEWIRE_PIN);
//
//void setup()
//{
//  while(!Serial);
//  Serial.begin(9600);
//}
//
//void loop()
//{
//  byte address[8];
//
//  onewire.reset_search();
//  while(onewire.search(address))
//  {
//    if (address[0] != 0x28)
//      continue;
//
//    if (OneWire::crc8(address, 7) != address[7])
//    {
//      Serial.println(F("Błędny adres, sprawdz polaczenia"));
//      break;
//    }
//
//    for (byte i=0; i<8; i++)
//    {
//      Serial.print(F("0x"));
//      Serial.print(address[i], HEX);
//
//      if (i < 7)
//        Serial.print(F(", "));
//    }
//    Serial.println();
//  }
//
//  while(1);
//}



#include <IRremote.h> //Dolaczenie bibloteki dla scalonego odbiornika IR 
                    //https://github.com/shirriff/Arduino-IRremote/zipball/master

#include <LiquidCrystal.h> //Dołączenie bilbioteki wyswietlacza
#include <OneWire.h> //Bibloteki dla termometru
#include <DS18B20.h>
#include "DHT.h"//Biblioteka dla czujnika wilg / temp

#define irPin 2 //pin odbiornika IR
#define diodaPin 9 //pin listwy LED
#define diodaPin1 8 //pin kontrolki odbioru z pilota
#define lampa 7 //pin sterowania lampa (przekaźnik RM0)
#define PodLed 12 //podswietlenie wyswietlacza
#define ONEWIRE_PIN 13 //pin termometru
#define przON A0
#define przOFF A1
#define DHT11_PIN A3 //Pin czujnika wilg / temp

IRrecv irrecv(irPin);
decode_results results;
DHT dht;
byte address[8] = {0x28, 0x5, 0xD2, 0x4B, 0x8, 0x0, 0x0, 0x79}; //adres termometru

OneWire onewire(ONEWIRE_PIN); //nie mam pojecia co - dla termometru
DS18B20 sensors(&onewire);
LiquidCrystal lcd(3, 4, 5, 6, 10, 11); //Informacja o podłączeniu nowego wyświetlacza

int jasnosc = 0; // zmienna dla jasnosi listwy LED
int lampaStatus = LOW;
int diodaStatus = LOW;
int lampaStatus1 = LOW;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();

   pinMode(diodaPin, OUTPUT); //deklaracja pinow wyjsciowych
   pinMode(diodaPin1, OUTPUT);
   pinMode(lampa, OUTPUT);
   pinMode (PodLed, OUTPUT);
   pinMode (przON, INPUT_PULLUP);
   pinMode (przOFF, INPUT_PULLUP);

   sensors.begin(); //znow cos dla termometru
   sensors.request(address);

   dht.setup(DHT11_PIN);//Czujnik wilgotnosci
}

void loop() {

 if (digitalRead(przON) == LOW) { //Jeśli przycisk wciśnięty
   lampaStatus = ~lampaStatus;
   digitalWrite(lampa, lampaStatus); //Włącz /wyłącz lampe
   delay(250);
 } 

if (digitalRead(przOFF) == LOW) { //Jeśli przycisk wciśnięty
   diodaStatus = ~diodaStatus;
   digitalWrite(diodaPin, diodaStatus); //Wyłącz /wyłącz ledy
   delay(250);
}

if (sensors.available())
 {
   float temperature = sensors.readTemperature(address);

   Serial.print(temperature);
   Serial.println(F(" 'C"));

   sensors.request(address);
 }

  if (irrecv.decode(&results)) {

      switch (results.value) {

        case 0x6170807F: //instrukcja dla listwy LED zwiekszanie
           if(jasnosc < 255) {jasnosc = jasnosc+51;} 
           Serial.println(jasnosc); 
           analogWrite(diodaPin, jasnosc);
           zamigajLED(); //funkcja kontrolki odbioru 
           ekranDane();
           ekranLed();
           break;

        case 0x617040BF: //instrukcja dla listwy LED zmniejszanie
           if(jasnosc > 0) {jasnosc = jasnosc-51;}
           Serial.println(jasnosc);
           analogWrite(diodaPin, jasnosc);
           zamigajLED();
           ekranDane();
           ekranLed();
           break;

        case 0x617020DF: //instrukcja dla listwy LED pelny
           analogWrite(diodaPin, 255);
           zamigajLED();
           break;

        case 0x6170A05F: //instrukcja dla listwy LED wylaczony
           analogWrite(diodaPin, 0);
           zamigajLED();
           break;

        case 0x617048B7: //instrukcja dla lampy
           lampaStatus1 = ~lampaStatus1;
           digitalWrite(lampa, lampaStatus1); //Włącz lampe
           zamigajLED();
           break;
        }
  irrecv.resume();
  }
}

void zamigajLED() { //kontrolka odbioru pilota
  digitalWrite(diodaPin1, HIGH); //Włączenie diody
  delay(200); //Odczekanie 0,2 sekundy
  digitalWrite(diodaPin1, LOW); //Wyłączenie diody
  delay(200); //Odczekanie 0,2 sekundy
}

void ekranDane(){//Wyswietlenie 'danych' na ekranie
   delay (50);
   lcd.display();
   lcd.begin(16, 2); //Deklaracja typu wyswietlacza
   lcd.clear(); //Wyczyszczenie wyswietlacza
   lcd.setCursor(0, 0); //Ustawienie kursora
   lcd.print("LED: "); //Wyświetlenie tekstu
   lcd.print(jasnosc); //Wyświetlenie tekstu

if (sensors.available() || (dht.getStatusString() == "OK"))
 {
 //Pobranie informacji o wilgotnosci
 int wilgotnosc = dht.getHumidity();
 //Pobranie informacji o temperaturze
 int temperatura = dht.getTemperature();

   float temperature = sensors.readTemperature(address);

   Serial.print(temperature);
   Serial.println(F(" 'C"));
   lcd.setCursor(0, 1); //Ustawienie kursora
   lcd.print("T1:"); //Wyświetlenie tekstu
   lcd.setCursor(3, 1); //Ustawienie kursora
   lcd.print(temperature); //Wyświetlenie tekstu

   lcd.setCursor(10, 0); //Ustawienie kursora
   lcd.print("W: ");
   lcd.setCursor(12, 0);
   lcd.print(wilgotnosc);
   lcd.setCursor(9, 1); //Ustawienie kursora
   lcd.print("T2:");
   lcd.setCursor(12, 1);
   lcd.print(temperatura);

   sensors.request(address);
 }

 //Odczekanie wymaganego czasugo
 delay(dht.getMinimumSamplingPeriod());
}

void ekranLed(){ //Podswietlenie ekranu (czasowe)
 digitalWrite (PodLed, HIGH);
 delay (3000);
 digitalWrite (PodLed, LOW);
}

Udostępnij ten post


Link to post
Share on other sites

Czy ten kurs będzie jeszcze kontynuowany? Z tego co widzę w sklepie botland na opisie zestawu to w planach jest jeszcze chyba jeden artykuł "Inteligentne oświetlenie domowe".

Ciekawe, czy jest jeszcze potencjał na "Kurs Arduino poziom III" 😉. Te dwa kursy chyba mocno wyczerpują temat 🙂.

Udostępnij ten post


Link to post
Share on other sites

dejmieno, oczywiście będzie kolejna część, ale niestety ostatnio nie mogłem zajmować się tym tematem (stąd nawet moja ogólnie mniejsza aktywność przy publikacji artykułów). Mam jednak nadzieję, że jeszcze kilka dni i wszystko wróci na właściwe tory, wtedy nadrabiam zaległości i działamy dalej!

Udostępnij ten post


Link to post
Share on other sites

Świetny kurs.

Mam nadzieję, że jak najszybciej ukaże się następny rozdział 🙂!

Udostępnij ten post


Link to post
Share on other sites

mam mały problem z tak funkcją define DHTTYPE DHT11

po napisaniu programu wyskakuje błąd przy wgrywaniu nie wiem jak to naprawić

2056448157_Nowyobrazmapybitowej.thumb.jpg.49798fe7908c7636748c40ad4fc7bc5c.jpg

Udostępnij ten post


Link to post
Share on other sites

marekmarecki, witam na forum 🙂 Pokaż proszę kod, który kompilujesz (wklej dokładnie, to co próbujesz wgrać u siebie).

Udostępnij ten post


Link to post
Share on other sites

taki wyświetla błąd po wgraniu programu z funkcją define DHTTYPE DHT11

a tak wygląda napisany program

Udostępnij ten post


Link to post
Share on other sites

marekmarecki, ciężko powiedzieć, ponieważ nic takiego w kursie nie występuje. Nie wiem jakiej biblioteki używasz i skąd ten program i błąd. Zwróć uwagę, że w kursie korzystamy z biblioteki przyjmującej tylko 1 argument, a Ty do swojej podajesz dwa. Jeśli masz pytania nie związane z kursem, czyli np. z inną biblioteką to załóż osobny temat, w którym opiszesz dokładnie swój problem i podlinkujesz używane biblioteki. Dzięki temu nie będziemy mieszać w głowach osobom, które korzystają z tego kursu - z góry dziękuję za pomoc w utrzymaniu porządku na forum 🙂

Drugie rozwiązanie: skorzystaj z bibliotek i programów opisanych w kursie, nie powinieneś mieć wtedy żadnych problemów 🙂

Udostępnij ten post


Link to post
Share on other sites

A czy można by uzupełnić ten kod o obsługę prostego LCD - tak, aby dane na temat temperatury i wilgotności wyświetlać bezpośrednio na wyświetlaczu?

Pozdrawiam, y.

Udostępnij ten post


Link to post
Share on other sites
program był zrobiony z normalnym LCD 16x2 i działał u mnie bez problemu teraz jest przerobiony pod konwerter lcd i też nie ma problemów

Udostępnij ten post


Link to post
Share on other sites

olmekowie, witam na forum 🙂 Niestety w przypadku tej części coś ewidentnie mi nie idzie i za każdym razem, pojawia się przeszkoda. Przez co artykuł jest odkładany w nieskończoność. Mam teraz plan, aby napisać go raz jeszcze, zupełnie inaczej niż planowałem - postaram się, aby pojawił się w tym miesiącu 🙂

Edit: Sporo się tego ostatnio nazbierało (kurs FPGA, kurs Raspberry Pi)... Nie miałem kiedy opublikować tego odcinka. Niedługo nadrobię jednak zaległość - obiecuję!

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...