Czujka ruchu

Serwis internetowy thingspeak.com umożliwia publikację danych w postaci wykresów.
Dane te są przesyłane przez avr poprzez sieć internet do tego serwisu, a ten z kolei umożliwia publikowanie ich na stronach www takich jak ta.

Projekt powstał w odpowiedzi na potrzebę analizy ilości i częstości zdarzeń, a także czasu wystąpienia ruchu w określonym miejscu (tutaj w przedpokoju mieszkania).

Do projektu wykorzystano:

  1. Wemos D1
  2. czujka ruchu

Działanie układu jest proste.


Urządzenie musi być podłączone do zasilania (tutaj zasilacz stabilizowany 12V).
Urządzenie musi być w zasięgu sieci WiFi oraz mieć do niej dostęp.
Umieszczenie czujki ruchu musi być tak usytuowane, aby reagowało na oczekiwane zdarzenie i dzięki temu mogło wysłać odpowiednie dane do serwisu thingspeak.com lub bazy danych (o czym w przyszłości).

Poniższy wykres pokazuje zdarzenia z czujki ruchu.

W planie mam także wykonanie takiego projektu z użyciem przekładnika umożliwiającego odczyt danych w postaci przepływu prądu przez WLZ w moim mieszkaniu.

Poniżej kod:

Pozostaje jeszcze kwestia ustawienia konta w serwisie thingspeak.com, ale to już w następnym poście.

#include "ThingSpeak.h"
#include <ESP8266WiFi.h>
  
char ssid[] = "xxxxxxxxxxxxxxx";                        // nazwa sieci wifi
char pass[] = "xxxxxxxxxxxxxxx";                        // hasło do wifi
unsigned long myChannelNumber = 000000;                 // numer kanału w thingspeak
const char * myWriteAPIKey = "xxxxxxxxxxxxxxxx";        // API w thingspeak-Write API Key

int ledPin = D5;                                        // LED sygnalizujący zdarzenie (Pin D5, GPIO 14) 
int inputPin = D6;                                      // pin czujki ruchu (Pin D6, GPIO 12)
int motionState = 0;                                    // rozpoczęcie z założeniem, że ruchu nie ma
int val = 0;                                            // Zmienna do odczytu zera

unsigned long currentMillis = millis();
unsigned long previousMillis = 0;
unsigned long resetMillis = 0;
const long interval = 90000;                            // interwał czasowy (90 sek.) to prevent false triggers when setting up device 
                                                        
int status = WL_IDLE_STATUS;
WiFiClient  client;

void setup() 
{   
  WiFi.begin(ssid, pass);                               // Start połączenia WiFi connection
  ThingSpeak.begin(client);                             // Start połączenia z ThingSpeak
  Serial.begin(115200);                                 // prędkość portu
  pinMode(ledPin, OUTPUT);                              // ustawienie wyjścia diody
  pinMode(inputPin, INPUT);                             // ustawienie ruchu czujki

  Serial.println();
  Serial.print("Połączenie z ");
  Serial.print(ssid); 
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi uruchomione");  
  Serial.print("adres IP: ");
  Serial.println(WiFi.localIP());  
  Serial.println("Alarm czujki ruchu");

  ThingSpeak.writeField(myChannelNumber, 1, val, myWriteAPIKey);           // aktualizacja kanału czujki w ThingSpeak - wartość '0'
 
}

void loop() 
{
//*** Detekcja ruchu z czujki PIR i przesłanie do ThingSpeak *** 
  
currentMillis = millis();                                                 // ustawienie wartości milisekund do funkcji "millis"

val = digitalRead(inputPin);                                              // odczytanie wartości
  
if (val == HIGH)                                                          // sprawdzenie wystąpienia stanu wysokiego
  {                                                                                                  
  if ((motionState == 0) && (currentMillis >= interval))
    {                                                        
      digitalWrite(ledPin, HIGH);                                         // Załączenie diody
      Serial.println("*******WYKRYTO RUCH!******");                       // Wykrycie ruchu                                                      
      motionState = 1;                                                    // uaktualnienie zmiany, bez stanu
      ThingSpeak.writeField(myChannelNumber, 1, val, myWriteAPIKey);      // aktualizacja stanu czujki na wartość '0'  
      Serial.println("Wysłanie danych do ThingSpeak!");  
      delay(500);                  
    }
  } else {
    digitalWrite(ledPin, LOW);                                            // wyłączenie świecenia diody
    if (motionState == 1)
    {                                                                     // zatrzymanie ruchu
      Serial.println("Brak ruchu!");                                                                          
      motionState = 0;                                                    // uaktualnienie zmiany bez stanu
      ThingSpeak.writeField(myChannelNumber, 1, val, myWriteAPIKey);      // aktualizacja ThingSpeak: sensor ruchu - '0' 
      Serial.println("Wysłanie danych do ThingSpeak!");  
      delay(500);  
                   
    }
  }    
 
 if (currentMillis - previousMillis >= 10000)                             // aktualizacja monitora co 10 sekund (10000 milliseonds)
 {                                                                        // info o czasie pracy programu
 Serial.print("Program działa już przez ");
 Serial.print((currentMillis/1000)/60);
 Serial.println(" minut"); 
 previousMillis = currentMillis;
 yield();                                                                 // zabezpieczenie przed awarią poprzez wydajność
}}

Leave a Reply