Selamlar, elindeki sensör seti (AHT10, BMP180, MQ135) ile gayet kapsamlı bir hava istasyonu kurabilirsin.
ESP8266 (NodeMCU/Wemos) üzerinde I2C hattını AHT10 ve BMP180 ortak kullanabilir, adres çakışması yaşamazlar. MQ135 analog olduğu için onu da A0'dan okuyacağız.
Senin için WiFi'a bağlanan, verileri Serial'dan JSON olarak basan ve aynı zamanda tarayıcıdan girdiğinde anlık değerleri gösteren bir kod hazırladık.
Bağlantı Şeması
- AHT10 ve BMP180:
- VCC -> 3.3V
- GND -> GND
- SCL -> D1 (GPIO 5)
- SDA -> D2 (GPIO 4)
- MQ135:
- VCC -> VU / Vin (5V) (Dikkat: MQ135 ısıtıcısı 3.3V ile verimli çalışmaz, mutlaka 5V hattından besle.)
- GND -> GND
- A0 -> A0
Gerekli Kütüphaneler
Arduino IDE kütüphane yöneticisinden şunları kurman gerekiyor:
Adafruit AHTX0
Adafruit BMP085 Library
MQ135 (Phoenix1747 veya GeorgK versiyonu)
Kod
Koddaki WIFI_ADINIZ ve WIFI_SIFRENIZ kısımlarını güncellemeyi unutma.
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Wire.h>
#include <Adafruit_AHTX0.h>
#include <Adafruit_BMP085.h>
#include "MQ135.h"
// --- Ayarlar ---
const char* ssid = "WIFI_ADINIZ";
const char* password = "WIFI_SIFRENIZ";
// --- Sensör Tanımları ---
Adafruit_AHTX0 aht;
Adafruit_BMP085 bmp;
MQ135 mq135_sensor(A0);
ESP8266WebServer server(80);
// Değişkenler
float temp_aht = 0.0, hum_aht = 0.0;
float pressure_bmp = 0.0;
float ppm_mq135 = 0.0;
unsigned long lastTime = 0;
void setup() {
Serial.begin(115200);
Wire.begin(); // D1=SCL, D2=SDA
// Sensör Başlatma
if (!aht.begin()) Serial.println("Hata: AHT10 bulunamadı!");
if (!bmp.begin()) Serial.println("Hata: BMP180 bulunamadı!");
// WiFi Bağlantısı
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("WiFi Bağlanıyor");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nIP Adresi: " + WiFi.localIP().toString());
// Web Server
server.on("/", handleRoot);
server.on("/json", handleJSON);
server.begin();
}
void loop() {
server.handleClient();
// 5 Saniyede bir okuma (Non-blocking)
if (millis() - lastTime > 5000) {
readSensors();
lastTime = millis();
}
}
void readSensors() {
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
temp_aht = temp.temperature;
hum_aht = humidity.relative_humidity;
pressure_bmp = bmp.readPressure() / 100.0F; // hPa
ppm_mq135 = mq135_sensor.getPPM(); // Kalibrasyon gerektirir
// Serial Log
Serial.printf("Sicaklik: %.2f C | Nem: %.2f %% | Basinc: %.2f hPa | Hava: %.2f PPM\n",
temp_aht, hum_aht, pressure_bmp, ppm_mq135);
}
void handleRoot() {
String html = "<meta charset='utf-8'><meta name='viewport' content='width=device-width, initial-scale=1'>";
html += "<style>body{font-family:sans-serif;text-align:center;padding:20px}.box{background:#eee;padding:15px;margin:10px;border-radius:5px}</style>";
html += "<meta http-equiv='refresh' content='5'>";
html += "<h1>Hava İstasyonu</h1>";
html += "<div class='box'>Sıcaklık: <b>" + String(temp_aht) + " C</b></div>";
html += "<div class='box'>Nem: <b>%" + String(hum_aht) + "</b></div>";
html += "<div class='box'>Basınç: <b>" + String(pressure_bmp) + " hPa</b></div>";
html += "<div class='box'>Hava Kalitesi: <b>" + String(ppm_mq135) + " PPM</b></div>";
server.send(200, "text/html", html);
}
void handleJSON() {
String json = "{\"temp\":" + String(temp_aht) + ",\"hum\":" + String(hum_aht) +
",\"pressure\":" + String(pressure_bmp) + ",\"ppm\":" + String(ppm_mq135) + "}";
server.send(200, "application/json", json);
}