NodeMCU ESP8266 Hava İstasyonu Uygulaması

ESP8266 hava istasyonu, IoT projesi yapmak isteyen tüm maker ve meraklıların ilgisini çeken bir projedir.

Bu içerik NodemCU ESP8266 kullanarak IoT tabanlı Canlı Hava İstasyonu İzleme hakkındadır. DHT11 Nem ve Sıcaklık Sensörü, BMP180 Barometrik Basınç Sensörü ve FC37 Yağmur Sensörünü NodeMCU ESP8266-12E Wifi Modülü ile arayüzleyeceğiz. Nem, sıcaklık, barometrik basınç ve yağışı ölçeceğiz ve verileri bir web sunucusuna yükleyeceğiz.

Kod yüklendikten sonra seri monitörde NodeMCU’nun IP adresini bulabilirsiniz. Aynı IP ile herhangi bir web tarayıcısına gidebilir ve verileri güzel bir widget formatında görüntüleyebilirsiniz. Proje çok ilginç ve uzak bölgelerde örneğin verilerin izleneceği bir dondurucuda kullanılabilir.

Hava Durumu İstasyonu Nedir?

Hava durumu istasyonu, farklı sensörler kullanarak hava durumu ve çevre ile ilgili verileri toplayan bir cihazdır. İki tip hava istasyonu vardır, biri kendi sensörlerine sahip olan ve ikinci tip hava istasyonu, hava istasyonu sunucularından veri çektiğimiz yerdir. Bu içerikte ilkine gideceğiz, yani kendi hava istasyonumuzu tasarlayacağız.

Hava istasyonu sensörleri, sıcaklık okumaları almak için bir termometre, atmosfer basıncını ölçmek için bir barometre, nemi ölçmek için higrometre, yağışı ölçmek için yağmur sensörü, rüzgar hızını ölçmek için bir anemometre ve daha fazlasını içerebilir. Hava istasyonlarına hava durumu merkezleri, kişisel hava istasyonları, profesyonel hava istasyonları, ev hava istasyonları, hava tahmincisi ve tahminciler de denir.

Gerekli Malzemeler

  • NodeMCU ESP8266
  • BMP180 Barometrik Sensör
  • DHT11 Sıcaklık/Nem Sensörü
  • FC-37 Yağmur Sensörü
  • Dirençler: 4.7kΩ x 2

Sensörlere genel bir bakış için okumaya devam edebilirsiniz, farklı sensörler için buradaki içeriğimize göz atmanızı öneririz.

DHT11 Sensörü

DHT11, temel, düşük maliyetli bir dijital sıcaklık ve nem sensörüdür. Çevreleyen havayı ölçmek için kapasitif bir nem sensörü ve bir termistör kullanır ve veri pinine dijital bir sinyal gönderir. Kullanımı oldukça basittir, ancak verileri almak için dikkatli bir zamanlama gerektirir. Dijital sinyalin herhangi bir mikrodenetleyici kullanılarak okunması oldukça kolaydır. DHT11 ve mBlock ile yaptığımız örnek program.

NodeMCU ESP8266 Hava İstasyonu Uygulaması esp8266 hava istasyonu,nodemcu hava istasyonu,esp8266 hava durumu,nodemcu esp8266 hava durumu,nodemcu termomtere
DHT11 Sensör

BMP180 Sensörü

BMP180, Bosch Sensortec’in akıllı telefonlar, tablet PC’ler ve spor cihazları gibi gelişmiş cihazlarda uygulamaları mümkün kılan çok yüksek performansa sahip yeni dijital barometrik basınç sensörüdür.

NodeMCU ESP8266 Hava İstasyonu Uygulaması esp8266 hava istasyonu,nodemcu hava istasyonu,esp8266 hava durumu,nodemcu esp8266 hava durumu,nodemcu termomtere
BMP180 Barometrik Sensör

3 μA’ya kadar düşen düşük güç tüketimi, BMP180’i cihazlarınız için güç tasarrufunda lider yapar. BMP180, besleme voltajının bağımsızlığına ilişkin çok kararlı davranışı (performansı) ile de ayırt edilir.

FC-37 Sensörü

Yağmur sensörü, sensör kartlarının basılı uçlarındaki devreleri tamamlayan suyu algılar. Sensör kartı, ıslakken 100k ohm’dan kuruyken 2M ohm’a değişen değişken bir direnç görevi görür. Kısacası, tahta ne kadar ıslaksa, o kadar fazla akım akışı olur.

NodeMCU ESP8266 Hava İstasyonu Uygulaması esp8266 hava istasyonu,nodemcu hava istasyonu,esp8266 hava durumu,nodemcu esp8266 hava durumu,nodemcu termomtere
FC37 Yağmur Sensörü

Devre Şeması

NodeMCU ESP8266 Hava İstasyonu Uygulaması esp8266 hava istasyonu,nodemcu hava istasyonu,esp8266 hava durumu,nodemcu esp8266 hava durumu,nodemcu termomtere

Proje Kodu

Arayüz ve ana program kısmını ayrı olarak ele alıyoruz, bu sayede farklı bölümlerde değişiklik yapmak isterseniz daha kolay bir kullanıma erişebileceksiniz. Ayrıca gerekli kütüphaneleri indirip kurmanız gerekiyor: BMP180 Kütüphanesi ve DHT11 Kütüphanesi , doğrudan GitHub üzerinden indirebileceğiniz gibi, Arduino IDE’üzerinden de indirebilirsiniz.

Web Arayüz Tasarım Kodu (index.h)

Bu kodu kopyalayın ve bir metin belgesine yapıştırın. Ardından bu dosyayı index.h adıyla kaydedin, böylece kod olarak .h biçiminde bir dosya elde edersiniz.

NodeMCU ESP8266 Hava İstasyonu Uygulaması esp8266 hava istasyonu,nodemcu hava istasyonu,esp8266 hava durumu,nodemcu esp8266 hava durumu,nodemcu termomtere
Web Arayüzü

Şimdi bu dosyayı ana .ino kodunun bulunduğu klasöre taşıyın.

const char MAIN_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html>
<head>
<title>devreyakan.com</title>
</head>
<style>
@import url(https://fonts.googleapis.com/css?family=Montserrat);
@import url(https://fonts.googleapis.com/css?family=Advent+Pro:400,200);
*{margin: 0;padding: 0;}
 
body{
  background:#544947;
  font-family:Montserrat,Arial,sans-serif;
}
h2{
  font-size:14px;
}
.widget{
  box-shadow:0 40px 10px 5px rgba(0,0,0,0.4);
  margin:100px auto;
  height: 330px;
  position: relative;
  width: 500px;
}
 
.upper{
  border-radius:5px 5px 0 0;
  background:#f5f5f5;
  height:200px;
  padding:20px;
}
 
.date{
  font-size:40px;
}
.year{
  font-size:30px;
  color:#c1c1c1;
}
.place{
  color:#222;
  font-size:40px;
}
.lower{
  background:#00A8A9;
  border-radius:0 0 5px 5px;
  font-family:'Advent Pro';
  font-weight:200;
  height:130px;
  width:100%;
}
.clock{
  background:#00A8A9;
  border-radius:100%;
  box-shadow:0 0 0 15px #f5f5f5,0 10px 10px 5px rgba(0,0,0,0.3);
  height:150px;
  position:absolute;
  right:25px;
  top:-35px;
  width:150px;
}
 
.hour{
  background:#f5f5f5;
  height:50px;
  left:50%;  
  position: absolute;
  top:25px;
  width:4px;
}
 
.min{
  background:#f5f5f5;
  height:65px;
  left:50%;  
  position: absolute;
  top:10px;
  transform:rotate(100deg);
  width:4px;
}
 
.min,.hour{
  border-radius:5px;
  transform-origin:bottom center;
  transition:all .5s linear;
}
 
.infos{
  list-style:none;
}
.info{
  color:#fff;
  float:left;
  height:100%;
  padding-top:10px;
  text-align:center;
  width:25%;
}
.info span{
  display: inline-block;
  font-size:40px;
  margin-top:20px;
}
.weather p {
  font-size:20px;padding:10px 0;
}
.anim{animation:fade .8s linear;}
 
@keyframes fade{
  0%{opacity:0;}
  100%{opacity:1;}
}
 
a{
 text-align: center;
 text-decoration: none;
 color: white;
 font-size: 15px;
 font-weight: 500;
}
</style>
<body>
 
 
<div class="widget"> 
  <div class="clock">
    <div class="min" id="min"></div>
    <div class="hour" id="hour"></div>
  </div>
  <div class="upper">
    <div class="date" id="date">21 March</div>
    <div class="year">Temperature</div>
    <div class="place update" id="temperature">23 &deg;C</div>
  </div>
  <div style="text-align: center;"><a href="https://devreyakan.com" style="align:center">devreyakan</a></div>
  <div class="lower">    
    <ul class="infos">
      <li class="info temp">
        <h2 class="title">Sıcaklık</h2>
        <span class='update' id="temp">21 &deg;C</span>
      </li>
      <li class="info weather">
        <h2 class="title">Basınç</h2>
        <span class="update" id="pressure">0 mb</span>
      </li>
      <li class="info wind">
        <h2 class="title">Yağmur</h2>
        <span class='update' id="rain">0%</span>
      </li>
      <li class="info humidity">
        <h2 class="title">Nem</h2>
        <span class='update' id="humidity">23%</span>
      </li>
    </ul>
  </div>
</div>
 
<script>
setInterval(drawClock, 2000);
    
function drawClock(){
    var now = new Date();
    var hour = now.getHours();
    var minute = now.getMinutes();
    var second = now.getSeconds();
    
    //Date
    var options = {year: 'numeric', month: 'long', day: 'numeric' };
    var today  = new Date();
    document.getElementById("date").innerHTML = today.toLocaleDateString("en-US", options);
    
    //hour
    var hourAngle = (360*(hour/12))+((360/12)*(minute/60));
    var minAngle = 360*(minute/60);
    document.getElementById("hour").style.transform = "rotate("+(hourAngle)+"deg)";
    //minute
    document.getElementById("min").style.transform = "rotate("+(minAngle)+"deg)";
 
    //Get Humidity Temperature and Rain Data
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
      var txt = this.responseText;
      var obj = JSON.parse(txt); //Ref: https://www.w3schools.com/js/js_json_parse.asp
        document.getElementById("rain").innerHTML = obj.Rain + "%";
        document.getElementById("temperature").innerHTML = Math.round(obj.Temperature) + "&deg;C";
        document.getElementById("temp").innerHTML = Math.round(obj.Temperature) + "&deg;C";
        document.getElementById("humidity").innerHTML = Math.round(obj.Humidity) + "%";
        document.getElementById("pressure").innerHTML = Math.round(obj.Pressuremb) + " mb";
      }  
    };
   xhttp.open("GET", "readADC", true); //Handle readADC server on ESP8266
   xhttp.send();
}
</script>
</body>
</html>
)=====";

Ana Program Kodu

Bu kod kısmında WiFi Ağ İsminizi ve Parolanızı girmeniz gerekmektedir.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <SFE_BMP180.h>
#include <Wire.h>
 
#include "index.h" 
#include "DHTesp.h" 
 
#define LED 2 
#define DHTpin 14 
 
SFE_BMP180 pressure;
 
#define ALTITUDE 10.0 // bulunduğunuz yükseklik metre cinsinden
 
DHTesp dht;
 
const char* ssid = "wifi ağ adınız";
const char* password = "wifi ağ şifreniz";
 
ESP8266WebServer server(80); 
 
void handleRoot() {
String s = MAIN_page; 
server.send(200, "text/html", s); 
}
 
float humidity, temperature;
 
void handleADC() {
char status;
double T,P,p0,a;
double Tdeg, Tfar, phg, pmb;
 
status = pressure.startTemperature();
if (status != 0)
{
delay(status);
status = pressure.getTemperature(T);
if (status != 0)
{
Serial.print("sıcaklık: ");
Serial.print(T,2);
Tdeg = T;
Serial.print(" derece C, ");
Tfar = (9.0/5.0)*T+32.0;
Serial.print((9.0/5.0)*T+32.0,2);
Serial.println(" derece F");
 
status = pressure.startPressure(3);
if (status != 0)
{
delay(status);
status = pressure.getPressure(P,T);
if (status != 0)
{

Serial.print("tahmini basinc: ");
Serial.print(P,2);
pmb = P;
Serial.print(" mb, ");
phg = P*0.0295333727;
Serial.print(P*0.0295333727,2);
Serial.println(" inHg");
 
p0 = pressure.sealevel(P,ALTITUDE); 
Serial.print("bagil (deniz seviyesi) basinc: ");
Serial.print(p0,2);
Serial.print(" mb, ");
Serial.print(p0*0.0295333727,2);
Serial.println(" inHg");
 
a = pressure.altitude(P,p0);
Serial.print("hesaplanan yukseklik: ");
Serial.print(a,0);
Serial.print(" metre, ");
Serial.print(a*3.28084,0);
Serial.println(" feet");
}
else Serial.println("basinc olcum hatasi\n");
}
else Serial.println("basinc olcumu baslatma hatasi\n");
}
else Serial.println("sicaklik olcum hatasi\n");
}
else Serial.println("sicaklik olcumu baslatma hatasi\n");
 
 
int rain = analogRead(A0);
 
String data = "{\"Yagmur\":\""+String(rain)+"\",\"Basincmb\":\""+String(pmb)+"\",\"Basinchg\":\""+String(phg)+"\", \"Sicaklik\":\""+ String(temperature) +"\", \"Nem\":\""+ String(humidity) +"\"}";
 
digitalWrite(LED,!digitalRead(LED)); 
server.send(200, "text/plane", data); 
 
delay(dht.getMinimumSamplingPeriod());
 
humidity = dht.getHumidity();
temperature = dht.getTemperature();
 
Serial.print("H:");
Serial.println(humidity);
Serial.print("T:");
Serial.println(temperature); 
Serial.print("R:");
Serial.println(rain);
}
 
void setup()
{
Serial.begin(115200);
Serial.println();
 

 
dht.setup(DHTpin, DHTesp::DHT11); 
pinMode(LED,OUTPUT);
 
if (pressure.begin())
Serial.println("BMP180 calisiyor");
else
{
Serial.println("BMP180 calismiyor\n\n");
while(1); 
}
 
WiFi.begin(ssid, password); 
Serial.println("");
 
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
 
Serial.println("");
Serial.print("Baglandi ");
Serial.println(ssid);
Serial.print("IP adresi: ");
Serial.println(WiFi.localIP()); 
 
server.on("/", handleRoot); 
server.on("/readADC", handleADC); 
 
server.begin(); 
Serial.println("HTTP sunucusu basladi");
}
 
void loop()
{
server.handleClient(); 
}

Bağlantı Görüntüsü

NodeMCU ESP8266 Hava İstasyonu Uygulaması esp8266 hava istasyonu,nodemcu hava istasyonu,esp8266 hava durumu,nodemcu esp8266 hava durumu,nodemcu termomtere

Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.