Jestem pewien, że w głowie każdego, kto pracował z płytkami Arduino, pojawił się w pewnym momencie pomysł, aby zbudować własną stację meteorologiczną. Tego typu projekty najczęściej opierają się na najprostszych czujnikach temperatury, wilgotności ewentualnie ciśnienia. Czasami dodawany jest również moduł umożliwiający pomiar prędkości wiatru. Jednak praktyczni żaden projekt nie jest wyposażony w czujnik mogący wykrywać wyładowania atmosferyczne. Jest to dość dziwny stan rzeczy, biorąc pod uwagę, że uruchomienie tego typu modułu w środowisku Arduino jest bardzo proste.
Miniaturowy czujnik wyładowań atmosferycznych
Moduł DFRobot Gravity – Lightning Sensor jest niewielkich rozmiarów czujnikiem wyładowań atmosferycznych. Mówiąc prościej, możemy za jego pomocą wykryć zbliżającą się burzę.
Urządzenie wyposażone zostało w układ Frankin AMS AS3935, który jest jego mózgiem. Jest to w pełni programowalny, specjalizowany układ scalony, do którego wyprowadzeń podłączona została dedykowana antena Coilcraft MA5532-AE. Układ na podstawie danych z anteny potrafi wykryć wyładowania atmosferyczne oraz określić ich intensywność i odległość od modułu. Wbudowany algorytm pozwala również oddzielić potencjalne wyładowania atmosferyczne od niechcianych zakłóceń elektromagnetycznych.
Sam układ może komunikować się z mikrokontrolerem za pomocą interfejsu SPI lub I2C, jednak moduł wyposażony został w wyjście tylko dla drugiego interfejsu.
Gdy jesteśmy już przy temacie wyprowadzeń – modułu posiada ich, aż sześć. Pierwsze cztery, czyli kolejno Vcc, GND, SCL, SDA wyprowadzone zostały na dedykowane czteropinowe złącze. Pierwsze dwa wyprowadzenia służą do zasilania modułu napięciem 3,3V lub 5V, pozostałe to piny komunikacyjne interfejsu I2C. Dodatkowe dwa wyprowadzenia umieszczono przy krawędzi płytki i oznaczono je jako GND i IRQ. Jest to dodatkowa masa oraz pin przerwań, aktywny po wykryciu wyładowania atmosferycznego. Poza tym na laminacie znajdziemy też niewielki przełącznik, dzięki któremu możemy wybrać adres, pod jakim moduł będzie widoczny dla innych układów.
Możliwości czujnika
Jak już wspomniałem moduł może poinformować nas o kilku rzeczach, pierwszą z nich jest odległość ewentualnego pioruna od czujnika. Potrafi on wykrywać wyładowania, aż do 40 km dzieląc tą odległość na 15 kroków. Dokładniej możemy otrzymać informację, że burza jest 40, 37, 34, 31, 27, 24, 20, 17, 14, 12, 10, 8, 6, 5 lub 0 km od czujnika.
Sama intensywność wyładowania opisywana jest za pomocą 21-bitowej zmiennej z zakresu od 0 do 16777201. Jest to po prostu czysta liczba, bez żadnego fizycznego znaczenia dlatego możemy ją dowolnie interpretować.
Dodatkowo czujnik wysyła informację w przypadku wystąpienia zakłóceń elektromagnetycznych. W pierwszym momencie otrzymamy informację “Disturber discovered!” – wykryto zakłócenia, jednak jeśli będą one na tyle duże, aby uniemożliwić działanie modułu otrzymamy alert “Noise level too high!” – poziom zakłóceń zbyt wysoki.
Jest jeszcze jeden komunikat o którym należy wspomnieć – „Lightning occurs!” – wykryto wyładowanie. Pojawi się on w momencie wykrycia pioruna dodatkowo otrzymamy informacja o jego intensywności i odległości od czujnika.
Podłączenie do Arduino
Podłączenie czujnika do płytki Arduino Uno jest dość proste. Moduł zasilamy napięciem 5V, piny komunikacyjne łączymy z A4 (D-A4) i A5 (C-A5), natomiast pin IRQ, na którym pojawiać się będzie sygnał przerwania w momencie wykrycia wyładowania, podłączamy do wejścia oznaczonego numerem 2.
Czas na program
Środowisko programistyczne Arduino IDE do poprawnej obsługi czujnika potrzebować będzie dodatkowej biblioteki. Dostępna jest ona na profilu GitHub – DFRobot.
/*
AS3935_ADD1 0x01 A0 = 1 A1 = 0
AS3935_ADD2 0x02 A0 = 0 A1 = 1
AS3935_ADD3 0x03 A0 = 1 A1 = 1
*/
#include "Lib_I2C.h"
#include "DFRobot_AS3935_I2C.h"
volatile int8_t AS3935IsrTrig = 0;
#define IRQ_PIN 2
// Antenna capacitance (must be in the range of 8.8 - 120 pf)
#define AS3935_CAPACITANCE 96
// External/internal mode selection
#define AS3935_INDOORS 0
#define AS3935_OUTDOORS 1
#define AS3935_MODE AS3935_INDOORS
// enable/disable interference detection
#define AS3935_DIST_DIS 0
#define AS3935_DIST_EN 1
#define AS3935_DIST AS3935_DIST_EN
// I2C adress
#define AS3935_I2C_ADDR AS3935_ADD3
void AS3935_ISR();
DFRobot_AS3935_I2C lightning0((uint8_t)IRQ_PIN, (uint8_t)AS3935_I2C_ADDR);
void setup()
{
Serial.begin(115200);
Serial.println("DFRobot AS3935 lightning sensor begin!");
// I2C init
I2c.begin();
I2c.pullup(true);
I2c.setSpeed(1);
delay(2);
// Set registers to default value
if (lightning0.defInit() != 0) {
Serial.println("I2C init fail");
while (1) {}
}
// modul init
lightning0.manualCal(AS3935_CAPACITANCE, AS3935_MODE, AS3935_DIST);
attachInterrupt(0, AS3935_ISR, RISING);
}
void loop()
{
// Do nothing until an interrupt is detected
while (AS3935IsrTrig == 0) {}
delay(5);
// Reset flagi przerwan
AS3935IsrTrig = 0;
// Get the source of the interruption
uint8_t intSrc = lightning0.getInterruptSrc();
if (intSrc == 1)
{
// Send information about landing detection and distance
uint8_t lightningDistKm = lightning0.getLightningDistKm();
Serial.println("Lightning occurs!");
Serial.print("Distance: ");
Serial.print(lightningDistKm);
Serial.println(" km");
// Send information about the intensity of the discharge
uint32_t lightningEnergyVal = lightning0.getStrikeEnergyRaw();
Serial.print("Intensity: ");
Serial.print(lightningEnergyVal);
Serial.println("");
}
// If intSrc = 2 - interference detected
else if (intSrc == 2)
{
Serial.println("Disturber discovered!");
}
// If intSrc = 3 - interference too great
else if (intSrc == 3)
{
Serial.println("Noise level too high!");
}
}
// Interrupt handling
void AS3935_ISR()
{
AS3935IsrTrig = 1;
}
Kod, mimo że na pierwszy rzut oka może wyglądać na skomplikowany, jest w rzeczywistości dość prosty. W pierwszej części kodu, do momentu wywołania funkcji setup, zdefiniowane zostały wszystkie zmienne potrzebne do uruchomienia modułu. Dla nas najważniejszą kwestią jest określenie poprawnego adresu czujnika. Na samym początku umieszczona została informacja o możliwych adresach i odpowiadających im położeniom przełączników na module. Trzeba pamiętać, że w momencie zmiany adresu należy również zmodyfikować linijkę #define AS3935_I2C_ADDR AS3935_ADD3, gdzie ostatnia cyfra oznacza adres czujnika.
W pętli setup inicjalizowane są interfejsy UART oraz I2C, oraz uruchamiany jest sam czujnik.
Główna pętla programu zaczyna się od pętli while, która oczekuje na sygnał przerwania, gdy takowy wystąpi, pobierane są informacje o dystansie i intensywności wyładowania, następnie dane te wysyłane są poprzez UART na ekran naszego komputera. Co więcej, jeśli zmienna intSrc przyjmie wartość 2 lub 3 wysyłane są informacje o zakłóceniach.
Na samym końcu umieszczona została funkcja obsługi przerwania.
Jak oszukać czujnik burzy?
W momencie, gdy piszę ten artykuł, jest maj, także o naturalnie występujące wyładowania atmosferyczne w trakcie burzy dość trudno. Owszem mogą one wystąpić również w tym miesiącu, ale jest to zjawisko dość rzadkie, a przecież nie będziemy czekać do lata, aby sprawdzić, czy czujnik działa prawidłowo. Czy w takim razie istnieje jakiś sposób, aby oszukać nasz czujnik.
Odpowiedź brzmi: Tak, a dokładniej jest to możliwe dzięki zwykłej zapalniczce. W momencie odpalenia zapalniczki generowana jest iskra, która może być zinterpretowana przez czujnik jako wyładowanie atmosferyczne.
Po uruchomieniu programu i wciśnięciu przycisku na zapalniczce w większości przypadków czujnik zinterpretuje powstałą iskrę jako zakłócenie. Jednak zdarza się również, że pojawi się informacja o wykrytym wyładowaniu. Owszem będzie miało ono intensywność rzędu 1-2 a odległość wyniesie kilkanaście kilometrów, ale w ten sposób jesteśmy w stanie oszukać moduł i sprawdzić jego działanie.
Po uruchomieniu programu i wciśnięciu przycisku na zapalniczce w większości przypadków czujnik zinterpretuje powstałą iskrę jako zakłócenie. Jednak zdarza się również, że pojawi się informacja o wykrytym wyładowaniu. Owszem będzie miało ono intensywność rzędu 1-2 a odległość wyniesie kilkanaście kilometrów, ale w ten sposób jesteśmy w stanie oszukać moduł i sprawdzić jego działanie.
Myślę, że czujnik DFRobot Gravity – Lightning Sensor jest bardzo ciekawą konstrukcją, którą bez problemu można umieścić w projekcie nawet najprostszej stacji pogodowej. Zaletami tego modułu są przede wszystkim niewielkie wymiary oraz łatwość obsługi.
Zobacz też:
Istnieje całkiem sporo różnego rodzaju systemów inteligentnego domu, zwanych również smart home. Każdy ma swoje wady i zalety, a wybór odpowiedniego systemu zależy tak naprawdę od indywidualnych preferencji użytkownika. Jednym z takich systemów jest HomeKit od firmy Apple. W tym oraz kolejnych materiałach z tej serii chciałbym opowiedzieć wam nieco o sposobie integracji HomeKita i dobrze wszystkim znanych modułów ESP8266. Pokaże wam jak skonfigurować taki moduł, tak aby jego działaniem można było sterować z poziomu iPhona, MacBooka lub Apple Watcha. Poza tym do wyjść naszego mikrokontrolera podłączymy różnego rodzaju moduły peryferyjne, których działaniem będzie sterować ESP.
Praktycznie codziennie spotykamy się z różnego rodzaju kodami kreskowymi. Mimo że zazwyczaj nie zwracamy na nie uwagi, to pełnią one bardzo ważną rolę w dzisiejszym świecie – identyfikacja produktów w sklepie, przepływ paczek w centrach logistycznych czy też odpowiednie rozprowadzenie komponentów na procesach produkcji. W każdym z tych obszarów wykorzystywane są kody kreskowe, między innymi dzięki ich prostocie. Niewielkich rozmiarów kod może być łatwo zeskanowany przez automatyczny skaner lub operatora wyposażonego w odpowiedni sprzęt.
Źródła:
- https://github.com/DFRobot/DFRobot_AS3935