Jak zbudować czujnik dymu z MQ-7 i mikrokontrolerem
Czujniki dymu to urządzenia, które każdego dnia zapobiegają tragediom, ostrzegając przed pożarem, zanim jeszcze zrobi się naprawdę niebezpiecznie. Mimo to wciąż nie każdy dom czy mieszkanie jest w nie wyposażone. A gdyby tak spróbować stworzyć własny czujnik dymu, wykorzystując sensor MQ-7? To niedrogie i popularne rozwiązanie, często stosowane do wykrywania tlenku węgla, ale z odpowiednią konfiguracją może również reagować na inne zanieczyszczenia powietrza.
Taki projekt to świetna okazja do nauki – nie tylko o samym działaniu czujników gazu, ale także o sposobach ich kalibracji, przetwarzaniu danych i integracji z systemami powiadomień. Warto jednak pamiętać, że czujnik DIY nie zastąpi certyfikowanego, profesjonalnego urządzenia przeciwpożarowego. Może być świetnym dodatkiem do monitorowania jakości powietrza w domu czy warsztacie, ale w kwestii bezpieczeństwa nie ma miejsca na kompromisy!
Czego będziesz potrzebował?
Arduino Uno R4 WiFi
To mózg całego projektu. Mikrokontroler, który będzie zbierał dane z czujnika MQ-7, analizował je i podejmował odpowiednie działania – uruchamiał alarm, jeśli wykryje niebezpieczne stężenie gazu.

Czujnik MQ-7
Główny element naszego układu – czujnik gazu, który wykrywa tlenek węgla (CO).
Buzzer 12V
Nasz sygnał alarmowy. Gdy czujnik wykryje zagrożenie, buzzer zacznie głośno piszczeć, ostrzegając przed niebezpieczeństwem. Uwaga – jest naprawdę głośny! Lepiej nie testować go w nocy, jeśli nie chcesz obudzić sąsiadów (i domowników).
Moduł przekaźnikowy HW-482
Arduino samo w sobie nie jest w stanie bezpośrednio zasilać buzzera 12V, dlatego potrzebujemy przekaźnika. To on pozwala bezpiecznie sterować wyższym napięciem, odcinając je lub podając w odpowiednim momencie.

Zasilacz 12V
Buzzer wymaga wyższego napięcia, którego Arduino nie jest w stanie dostarczyć. Dlatego potrzebujemy zewnętrznego zasilacza 12V
Jak to działa?
Jak działa czujnik MQ-7
Czujnik MQ-7 wykorzystuje półprzewodnikowy element wykonany z dwutlenku cyny (SnO₂), którego właściwości zmieniają się pod wpływem tlenku węgla (CO). To materiał typowo typu n, co oznacza, że jego przewodnictwo zależy od obecności wolnych elektronów.
W normalnych warunkach, gdy czujnik znajduje się w czystym powietrzu, cząsteczki tlenu (O₂) adsorbują się na powierzchni SnO₂, pobierając elektrony z materiału półprzewodnikowego. Powoduje to powstanie warstwy o wysokiej rezystancji, co ogranicza przepływ prądu.
Gdy w powietrzu pojawia się tlenek węgla (CO), zachodzi reakcja chemiczna: 2CO+O2→2CO2
CO „odbiera” tlen, uwalniając elektrony z powrotem do struktury SnO₂. Większa liczba swobodnych elektronów oznacza mniejszą rezystancję, co prowadzi do wzrostu napięcia na wyjściu czujnika.
Czujnik MQ-7 wymaga cyklicznego nagrzewania, ponieważ zmienia swoją czułość w zależności od temperatury. Proces ten opiera się na obecności grzałki rezystancyjnej wewnątrz czujnika, która podnosi temperaturę elementu półprzewodnikowego (SnO₂).
Tyle jeśli chodzi o teorię, w rzeczywistości SnO₂ reaguje z wieloma gazami, nie tylko z tlenkiem węgla. Z tego powodu czujnik MQ-7 wymaga cyklicznego nagrzewania. Aby zapewnić największą selektywność, czujnik przechodzi przez dwa stany temperaturowe:
- Wysoka temperatura – spala nagromadzone zanieczyszczenia i gazy zakłócające, resetując powierzchnię czujnika.
- Niska temperatura – w tej fazie czujnik jest najbardziej czuły na CO, ponieważ reakcja chemiczna CO z tlenem jest najintensywniejsza w niższej temperaturze.
Dzięki temu czujnik odfiltrowuje inne gazy i dokładniej wykrywa tlenek węgla.
Jak działa buzzer aktywny
Buzzer aktywny to układ, który generuje dźwięk samodzielnie, bez potrzeby dostarczania zewnętrznego sygnału sterującego. W jego wnętrzu znajduje się oscylator, który po podaniu napięcia zaczyna wytwarzać falę o stałej częstotliwości. Dzięki temu można go podłączyć bezpośrednio do przekaźnika lub mikrokontrolera – wystarczy załączyć napięcie, a buzzer zacznie wydawać sygnał dźwiękowy. W przeciwieństwie do buzzera pasywnego, który wymaga generowania sygnału PWM, aktywny działa od razu po podłączeniu zasilania.
Głośność buzzera zależy od napięcia, jakie na niego podamy. Wyższe napięcie powoduje, że membrana drga z większą amplitudą, co zwiększa ciśnienie akustyczne i sprawia, że dźwięk jest głośniejszy. W przypadku buzzerów piezoelektrycznych dzieje się tak, ponieważ element piezoelektryczny odkształca się silniej przy wyższym napięciu. Natomiast w buzzerach elektromagnetycznych mocniejsze pole magnetyczne mocniej wprawia membranę w ruch. Nasz buzzer może osiągać nawet 110 dB – dla porównania, to poziom hałasu porównywalny z motocyklem bez tłumika. Jeśli buzzer okaże się zbyt głośny, można ograniczyć jego napięcie zasilania, co zmniejszy amplitudę drgań membrany i tym samym obniży poziom hałasu.
Jak podłączyć czujnik
Podłączenie czujnika do mikrokontrolera jest proste, ponieważ wykorzystuje on magistralę I2C. Oznacza to, że do komunikacji potrzebujemy tylko dwóch linii – SDA i SCL – oraz dwóch dodatkowych przewodów do zasilania.
Arduino | Moduł przekaźnikowy |
5V | + |
GND | – |
Pin 6 | S |
Dodatkowo czujnik wymaga zewnętrznego zasilania, którego nie można podać bezpośrednio z mikrokontrolera. Do tego celu używamy modułu przekaźnikowego, który umożliwia bezpieczne sterowanie wyższym napięciem, izolując jednocześnie układ mikrokontrolera od obciążenia.
Złącze A | Złącze B |
Przekaźnik (COM) | Buzzer (-) |
Przekaźnik (NO) | Zasilanie (-) |
Zasilanie (+) | Buzzer (+) |

Programujemy czujnik dymu z MQ-7 – odczyt danych i uruchamianie buzzera
Przejdźmy do stworzenia naszego kodu, który sprawi, że mikrokontroler będzie odczytywał dane z czujnika i aktywował buzzer w razie wykrycia niebezpiecznego poziomu tlenku węgla. Zacznijmy od zdefiniowania odpowiednich pinów oraz ustalenia progu alarmowego.
#define MQ7_PIN A0
#define BUZZER_PIN 6
const int CO_THRESHOLD = 300;
Tutaj określamy, do którego pinu analogowego podpięty jest czujnik MQ-7 (A0), oraz na którym pinie cyfrowym znajduje się buzzer (D6). CO_THRESHOLD
to próg w PPM, po przekroczeniu którego uruchomimy alarm. Ta wartość nie jest przypadkowa – można ją dostosować na podstawie obserwowanych wyników lub dokumentacji czujnika.
Funkcja setup()
Następnie przechodzimy do funkcji setup()
:
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
}
Na początek uruchamiamy port szeregowy (Serial.begin(115200)
), dzięki czemu możemy obserwować na monitorze odczyty z czujnika. To szczególnie przydatne, gdy chcemy sprawdzić, jak zmieniają się wartości w zależności od warunków – np. czy w ogóle pojawia się CO i w jakim stężeniu.
Następnie ustawiamy pin buzzera jako wyjściowy i go wyłączamy (digitalWrite(LOW)
), żeby nie piszczał od razu po uruchomieniu mikrokontrolera.
Funkcja loop()
Przejdźmy do loop()
, gdzie dzieje się cała magia:
void loop() {
int sensorValue = analogRead(MQ7_PIN);
int coPPM = map(sensorValue, 0, 1023, 0, 1000);
...
Najpierw odczytujemy surową wartość z pinu analogowego. Jest to liczba z zakresu 0–1023, odpowiadająca napięciu na wyjściu czujnika. Następnie stosujemy funkcję map()
, która orientacyjnie przekształca surowy odczyt na wartość w PPM (przekształca wartość od 0 do 1023 na wartość od 0 do 1000). To uproszczenie – prawdziwa konwersja wymagałaby dokładnej kalibracji, ale taka forma w zupełności wystarcza do stworzenia działającego alarmu.
Poniżej wypisujemy dane do portu szeregowego:
...
Serial.print(coPPM);
Serial.println(" PPM");
...
Dzięki temu na monitorze szeregowym widać, jak czujnik reaguje na zmiany w otoczeniu. Można np. zbliżyć zgaszoną zapałkę (taka z której będzie ulatniał się dym!) i sprawdzić, czy wartości rosną. Pomoże nam to przy kalibracji – łatwiej wtedy dobrać odpowiedni próg alarmowy.
Jeśli wykryte stężenie CO przekracza bezpieczną wartość, uruchamiamy alarm:
...
if (coPPM > CO_THRESHOLD) {
digitalWrite(BUZZER_PIN, HIGH);
delay(5000);
digitalWrite(BUZZER_PIN, LOW);
}
delay(2000);
}
Włączamy buzzer na 5 sekund. Użytkownik od razu słyszy, że coś jest nie tak – to właśnie funkcja alarmowa układu. Po upływie czasu buzzer automatycznie się wyłącza. Pamiętaj, że buzzer jest bardzo głośny!
Na koniec dodajemy niewielki delay(1000);
– czyli czekamy 1 sekundę przed kolejnym pomiarem. Taki odstęp czasowy pozwala czujnikowi chwilę „odpocząć” i zapobiega niepotrzebnemu przeciążeniu mikrokontrolera.
#define MQ7_PIN A0
#define BUZZER_PIN 6
const int CO_THRESHOLD = 300;
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
}
void loop() {
int sensorValue = analogRead(MQ7_PIN);
int coPPM = map(sensorValue, 0, 1023, 0, 1000);
Serial.print(coPPM);
Serial.println(" PPM");
if (coPPM > CO_THRESHOLD) {
digitalWrite(BUZZER_PIN, HIGH);
delay(5000);
digitalWrite(BUZZER_PIN, LOW);
}
delay(1000);
}
Efekt końcowy czujnika dymu z MQ-7
To już wszystko w naszym projekcie – „Czujnik dymu z MQ-7”. Oczywiście to dopiero początek – ten projekt można łatwo rozbudować. Na przykład dodać wyświetlanie danych na stronie internetowej lub wysyłać powiadomienia, gdy poziom CO przekroczy bezpieczny próg. Jeśli nie wiesz jak komunikować stworzyć stronę internetową polecam artykuł Odczyt danych z czujnika podłączonego do ESP8266 na stronie WWW
A może masz swój pomysł, jak usprawnić taki system? Może dodać czujnik temperatury? Daj znać w komentarzu, co byś dorzucił do projektu! Jeśli pojawiły się jakieś problemy przy podłączaniu czujnika, uruchamianiu buzzera albo interpretacji wyników – śmiało pisz. Postaram się pomóc!
KOMENTARZE