Skocz do zawartości
noank

System monitorowania środwiska

Pomocna odpowiedź

Witam! Chciałbym się pochwalić moim pierwszym stworzonym projektem, a mianowicie systemem monitorowania środowiska. Interesuję się IoT i jego obszarami działania. Stworzyłem system, który składa się z urządzenia pomiarowego, chmury internetowej oraz aplikacji mobilnej. Struktura systemu została podzielona na 3 etapy, odpowiednia: warstwa sprzętowa, chmury i aplikacji.

Schemat funkcjonowania systemu

Warstwa sprzętowa

Urządzenie ma za zadanie pobieranie danych z otoczenia oraz pobieranie ich do zewnętrznego serwera. Badane czynniki to: temperatura, wilgotność, opady atmosferyczne i ruch. Do wykonania urządzenia wykorzystano poniższe podzespoły:

Projekt urządzenia wygląda następująco:

Projekt urządzenia pomiarowego

Oraz urządzenie wykonane zgodnie z projektem:

Gotowe urządzenie pomiarowe

Następnie funkcje sensorowe urządzenia zostały przetestowane. Na płytkę został wgrany poniższy kod:

#include <dht11.h>

#define CzujnikTempWilgPin 2    //definicja numerów pinów
#define CzujnikOpadAnalogPin A0
#define CzujnikOpadDigitalPin 4
#define CzujnikRuchPin 8

int wartosc_A0;        
int wartosc_D0;   
int wilgotnosc;
int temperatura;
int ruch; 
dht11 DHT11; 
int interwal = 30000;            
    
void setup() {
  Serial.begin(9600); //inicjalizacja monitora szeregowego
  
  pinMode(CzujnikOpadDigitalPin, INPUT);//konfiguracja zachowania pinów
  pinMode(CzujnikRuchPin, INPUT);  
}

void loop() {
  DHT11.read(CzujnikTempWilgPin);  //odczyt danych z czujnika DHT11  

  wilgotnosc = DHT11.humidity; 
  Serial.print("Wilgotnosc (%): ");             
  Serial.print((float)wilgotnosc, 0);
  temperatura = DHT11.temperature;
  Serial.print("     Temperatura (C): ");           
  Serial.println((float)temperatura, 0);
  
  ruch = digitalRead(CzujnikRuchPin); //odczyt danych z czujnika ruchu
  if(ruch == HIGH){                                    
    Serial.println("Wykryto ruch");
  } else {
    Serial.println("Nie wykryto ruchu");
  }
  
  wartosc_A0 = analogRead(CzujnikOpadAnalogPin);
  wartosc_D0 = digitalRead(CzujnikOpadDigitalPin);
 
  if (wartosc_D0 == LOW) {
    Serial.print("DESZCZ PADA Z INTENSYWNOŚCIĄ ");
    Serial.println(wartosc_A0);
  } else {
    Serial.println("DESZCZ NIE PADA");
  }
 
 delay(interwal);                                
}

Test monitorowania parametrów:

Test czujników

Konieczna była regulacja czujników, aby mierzone wartości były jak najbardziej dokładne.

Warstwa chmury

Jako chmurę przechowującą i analizującą dane wybrano serwis Thingspeak.com. Jako sposób komunikacji wybrano interfejs REST API. W pierwszej kolejności założono konto oraz publiczny kanał wyposażony w 5 pól: temperatura, wilgotność, ruch, opady atmosferyczne i intensywność opadów. Sprawdzono również klucze danych odpowiedzialne za zapis i odczyt danych.

Poniższa grafika przedstawia przesłane dane z urządzenia pomiarowego.

Wykresy na thingspeak.com

Warstwa aplikacji

Końcowym elementem systemu jest urządzenie z systemem Android. Stworzono aplikację, dzięki której możliwe jest połączenie z kanałem na thingspeak.com oraz pobranie danych. Aplikacja została zaopatrzona we wszystkie wyżej wymienione wykresy oprócz wykresu intensywności opadów. 

1809171047_schemataplikacjimobilnej.thumb.jpg.f14b396c7b687c7612957486053bbf5a.jpg

Projekt aplikacji został przedstawiony powyżej. Wszystkie wykresy zostały umieszczone w panelu przesuwnym. Do stworzenia wykresów wykorzystano biblioteki graficzne na system android: biblioteka do tworzenia kanału thingspeak.com oraz bibliotekę do tworzenia wykresów.

Cały kod stworzonej aplikacji na system android.

Agregacja całego systemu

Następnie przyłączono urządzenie do sieci oraz został wgrany poniższy kod:

#include <dht11.h>
#include <UIPEthernet.h> 
                                                  
#define CzujnikTempWilgPin 2    
#define CzujnikOpadAnalogPin A0
#define CzujnikOpadDigitalPin 4
#define CzujnikRuchPin 8

byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };//adres MAC urządzenia
EthernetClient client;
char server[] = "api.thingspeak.com";//adres api thingspeak
    
int wartosc_A0;        
int wartosc_D0;   
int wilgotnosc;
int temperatura;
int ruch; 
int interwal = 30000;                             
dht11 DHT11; 

void setup() { 
  Ethernet.begin(mac); //rozpoczęcie połączenia
  pinMode(CzujnikOpadDigitalPin, INPUT);          
  pinMode(CzujnikRuchPin, INPUT);  
}

void loop() {
  DHT11.read(CzujnikTempWilgPin);          
  wilgotnosc = DHT11.humidity; 
  temperatura = DHT11.temperature;
  ruch = digitalRead(CzujnikRuchPin);
  wartosc_A0 = analogRead(CzujnikOpadAnalogPin);  
  wartosc_D0 = digitalRead(CzujnikOpadDigitalPin);
  
  if (client.connect(server, 80)) {//składanie komendy get
    client.print("GET /update?");
    client.print("key=POZ0YSHN2VGMKS05");
    
    client.print("&field1=");
    client.print(temperatura);
    
    client.print("&field2=");
    client.print(wilgotnosc);
    
    client.print("&field3=");
    client.print(wartosc_D0);
    
    if(wartosc_D0==LOW) {
      client.print("&field4=");
      client.print(wartosc_A0); 
    }
        
    client.print("&field5=");
    client.print(ruch);
    
    client.println( " HTTP/1.1");
    client.print( "Host: " );
    client.println(server);
    client.println( "Connection: close" );
    client.println();
    client.println();
    client.stop();//
  }
  delay(interwal);
}

System funkcjonował prawidłowo dane były przesyłane na serwer.

Test urządzeniaKanał systemu

Następnie uruchomiono aplikację mobilną. Oto kilka screenów:

Screenshot_20190128-131736.thumb.png.fb1bb79f959ffaac1743ed8c8091636f.pngScreenshot_20190128-131758.thumb.png.48c6c5ab0de89d3ec8aef7b8b9ccf256.pngScreenshot_20190128-135847.thumb.png.07cde4dcc934049a47e27ae270702e4a.png

Dodatkowymi funkcjami apikacji jest przesuwanie oraz przybliżanie wykresów oraz odczytywanie dokładnych wartości po kliknięciu w punkt wykresu.

Mam nadzieję, że przedstawiłem to w ciekawy i przejrzysty sposób. :) Pozdrawiam

 

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Właśnie zaakceptowałem Twój opis, możesz go teraz zgłosić do akcji rabatowej umieszczając link w temacie zbiorczym. Dziękuję za przedstawienie ciekawego projektu, zachęcam do prezentowania kolejnych DIY oraz aktywności na naszym forum 🙂

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×