ESP8266 NodeMCU Web Sunucusunda Çoklu DS18B20 den veri okuma
Evinizin ve bahçenizin her yerine dağılmış sensörlerin sıcaklıklarını düzenli olarak merkezi bir sunucuya bildirmesini istediniz mi? O halde, bu IoT projesi sizin için sağlam bir başlangıç noktası olabilir!
Bu proje, mevcut WiFi ağına kolayca bağlanan ve bir Web Sunucusu oluşturan kontrol cihazı olarak ESP8266 NodeMCU'yu kullanır. Bağlı herhangi bir cihaz bu web sunucusuna eriştiğinde, ESP8266 birden fazla DS18B20 Sıcaklık sensöründen sıcaklığı okur ve güzel bir arayüzle bu cihazın web tarayıcısına gönderir.
Tek Veriyolunda Çoklu DS18B20'ler
DS18B20'nin en büyük özelliklerinden biri, birden fazla DS18B20'nin aynı 1-Wire veri yolunda bir arada bulunabilmesidir. Her bir DS18B20, fabrikada yazılmış benzersiz bir 64 bit seri koduna sahip olduğundan , bunları birbirinden ayırt etmek daha kolaydır.Bu özellik, geniş bir alana dağılmış birçok DS18B20'yi kontrol etmek istediğinizde büyük bir avantaj olabilir. Bu eğitimde biz de aynısını yapacağız.
DS18B20 sensörlerini ESP8266 NodeMCU'ya bağlamak oldukça basittir.
Tüm DS18B20'leri paralel bağlayarak başlayın, yani tüm VDD pinlerini, GND pinlerini ve sinyal pinlerini ortak kullanın. Ardından VDD'yi 3.3V çıkışa, GND'yi toprağa bağlayın ve sinyal pinini ESP8266 NodeMCU üzerindeki dijital pin D2'ye bağlayın.
Ardından, veri aktarımını sabit tutmak için sinyal ve güç pimi arasına tüm veri yolu için bir adet 4.7k çekme direnci eklemeniz gerekir .
Dallas 1-Wire protokolü biraz karmaşıktır ve iletişimi ayrıştırmak için bir sürü kod gerektirir. Bu gereksiz karmaşıklığı gizlemek için DallasTemperature.h kitaplığını yükleyeceğiz, böylece sensörden sıcaklık okumaları almak için basit komutlar verebiliriz.
Kitaplığı kurmak için Arduino IDE> Taslak> Kitaplığı Dahil Et> Kitaplıkları Yönet'e gidin… Kitaplık Yöneticisinin kitaplıklar dizinini indirmesini ve kurulu kitaplıkların listesini güncellemesini bekleyin.
Aramanızı ' ds18b20 ' yazarak filtreleyin . Birkaç giriş olmalı. Miles Burton tarafından yazılan DallasTemperature'ı arayın . Bu girişe tıklayın ve ardından Yükle'yi seçin.
Bu Dallas Temperature kitaplığı, daha düşük seviyeli işlevleri işleyen donanıma özgü bir kitaplıktır. Yalnızca DS18B20 ile değil, herhangi bir tek kablolu cihazla iletişim kurmak için Tek Telli Kitaplık ile eşleştirilmesi gerekir. Bu kitaplığı da kurun.
Otobüste DS18B20'lerin Adreslerini Bulma
Her bir DS18B20'nin, onları birbirinden ayırmak için kendisine atanmış benzersiz bir 64 bit adrese sahip olduğunu biliyoruz. İlk olarak, her bir sensörü uygun şekilde etiketlemek için bu adresi bulacağız . Adres daha sonra her bir sensörü ayrı ayrı okumak için kullanılabilir .
Aşağıdaki çizim, veri yolunda bulunan tüm DS18B20'leri algılar ve tek kablolu adreslerini seri monitöre yazdırır.Adresini bulmak için her seferinde yalnızca bir sensör bağlayabilirsiniz (veya art arda yeni bir sensör ekleyebilirsiniz), böylece her birini adresiyle tanımlayabilirsiniz. Ardından her bir sensörü etiketleyebilirsiniz.
#include <OneWire.h>
#include <DallasTemperature.h>// Data wire is plugged into port D2 on the ESP8266
#define ONE_WIRE_BUS D2
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// variable to hold device addresses
DeviceAddress Thermometer;
int deviceCount = 0;
voidsetup(void)
{
// start serial port
Serial.begin(115200);
// Start up the library
sensors.begin();
// locate devices on the bus
Serial.println("Locating devices...");
Serial.print("Found ");
deviceCount = sensors.getDeviceCount();
Serial.print(deviceCount, DEC);
Serial.println(" devices.");
Serial.println("");
Serial.println("Printing addresses...");
for (int i = 0; i < deviceCount; i++)
{
Serial.print("Sensor ");
Serial.print(i+1);
Serial.print(" : ");
sensors.getAddress(Thermometer, i);
printAddress(Thermometer);
}
}
voidloop(void)
{ }
voidprintAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
Serial.print("0x");
if (deviceAddress[i] < 0x10) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
if (i < 7) Serial.print(", ");
}
Serial.println("");
}
Şimdi, seri monitörü açın. Aşağıdaki gibi bir şey almalısınız.
İhtiyacımız olan tüm adresleri bir sonraki taslağa kopyalayın.
ESP8266 Web Sunucusu In Station (STA) modu oluşturun
Şimdi, ESP8266'mızı İstasyon (STA) moduna yapılandıracağız ve web sayfalarını mevcut ağ altındaki herhangi bir bağlı istemciye sunmak için bir web sunucusu oluşturacağız.
Krokiyi yüklemeye başlamadan önce, işinize yaraması için bazı değişiklikler yapmanız gerekir.
ESP8266'nın mevcut ağ ile bağlantı kurabilmesi için aşağıdaki iki değişkeni ağ kimlik bilgilerinizle değiştirmeniz gerekir.
constchar* ssid = "YourNetworkName"; // Enter SSID hereconstchar* password = "YourPassword"; //Enter Password here
Bir web sayfasını sunmadan önce ESP8266, her bir DS18B20'deki sıcaklığı adresine göre okur, bu nedenle DS18B20'lerin adreslerini önceki çizimde bulduğunuzla değiştirmeniz gerekir.
#include <ESP8266WebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>// Data wire is plugged into port D2 on the ESP8266
#define ONE_WIRE_BUS D2
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
float tempSensor1, tempSensor2, tempSensor3;
uint8_t sensor1[8] = { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC };
uint8_t sensor2[8] = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 };
uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };
/*Put your SSID & Password*/constchar* ssid = "YourNetworkName"; // Enter SSID hereconstchar* password = "YourPassword"; //Enter Password here
ESP8266WebServer server(80);
voidsetup() {
Serial.begin(115200);
delay(100);
sensors.begin();
Serial.println("Connecting to ");
Serial.println(ssid);
//connect to your local wi-fi network
WiFi.begin(ssid, password);
//check wi-fi is connected to wi-fi networkwhile (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected..!");
Serial.print("Got IP: "); Serial.println(WiFi.localIP());
server.on("/", handle_OnConnect);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
}
voidloop() {
server.handleClient();
}
voidhandle_OnConnect() {
sensors.requestTemperatures();
tempSensor1 = sensors.getTempC(sensor1); // Gets the values of the temperature
tempSensor2 = sensors.getTempC(sensor2); // Gets the values of the temperature
tempSensor3 = sensors.getTempC(sensor3); // Gets the values of the temperature
server.send(200, "text/html", SendHTML(tempSensor1,tempSensor2,tempSensor3));
}
voidhandle_NotFound(){
server.send(404, "text/plain", "Not found");
}
String SendHTML(float tempSensor1,float tempSensor2,float tempSensor3){
String ptr = "<!DOCTYPE html> <html>\n";
ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr +="<title>ESP8266 Temperature Monitor</title>\n";
ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
ptr +="</style>\n";
ptr +="</head>\n";
ptr +="<body>\n";
ptr +="<div id=\"webpage\">\n";
ptr +="<h1>ESP8266 Temperature Monitor</h1>\n";
ptr +="<p>Living Room: ";
ptr +=tempSensor1;
ptr +="°C</p>";
ptr +="<p>Bedroom: ";
ptr +=tempSensor2;
ptr +="°C</p>";
ptr +="<p>Kitchen: ";
ptr +=tempSensor3;
ptr +="°C</p>";
ptr +="</div>\n";
ptr +="</body>\n";
ptr +="</html>\n";
return ptr;
}
Web Sunucusuna Erişim
Krokiyi yükledikten sonra 115200 baud hızında Seri Monitörü açın. Ve NodeMCU üzerindeki RST düğmesine basın. Her şey yolundaysa, yönlendiricinizden alınan dinamik IP adresini çıkaracak ve HTTP sunucusu başlatıldı mesajını gösterecektir .
Ardından, bir tarayıcı yükleyin ve seri monitörde gösterilen IP adresine yönlendirin. ESP8266, tüm DS18B20'lerden sıcaklıkları gösteren bir web sayfası sunmalıdır.
Ayrıntılı Kod Açıklaması
Çizim, aşağıdaki kitaplıkları dahil ederek başlar.
ESP8266WebServer.h kitaplığı, ağa bağlanmak için çağırdığımız ESP8266'ya özgü WiFi yöntemlerini sağlar. Ayrıca, düşük seviyeli uygulama ayrıntıları hakkında endişelenmenize gerek kalmadan bir sunucu kurmamıza ve gelen HTTP isteklerini işlememize yardımcı olacak bazı yöntemler de mevcuttur.
DallasTemperature.h kitaplığı, daha düşük düzeyli işlevleri işleyen donanıma özgü bir kitaplıktır. Çalışması için One Wire Library ile eşleştirilmesi gerekir.
OneWire.h kitaplığı, yalnızca DS18B20 ile değil, herhangi bir tek kablolu cihazla iletişim kurar.
Daha sonra sıcaklık sensörü ve değişkenlerin sıcaklık okumalarını depolaması için gereken örnekleri oluşturuyoruz. Sıcaklık sensörü GPIO D2'ye bağlanır.
// Data wire is plugged into port D2 on the ESP8266
#define ONE_WIRE_BUS D2
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
float tempSensor1, tempSensor2, tempSensor3;
Ardından, her bir sıcaklık sensörü için önceden bulunan adresleri giriyoruz. Bizim durumumuzda aşağıdakilere sahibiz.
ESP8266'yı İstasyon (STA) modunda yapılandırırken, mevcut WiFi ağına katılacaktır. Bu nedenle, ona ağınızın SSID ve Parolasını sağlamamız gerekir. Daha sonra web sunucusunu 80 numaralı bağlantı noktasından başlatıyoruz.
/*Put your SSID & Password*/constchar* ssid = "YourNetworkName"; // Enter SSID hereconstchar* password = "YourPassword"; //Enter Password here
ESP8266WebServer server(80);
İç Kurulum () İşlevi
Kurulum () Fonksiyonu İçinde HTTP sunucumuzu çalıştırmadan önce yapılandırıyoruz. Öncelikle, PC ile seri iletişimi başlatıyoruz ve begin()fonksiyon kullanarak DallasTemperature nesnesini başlatıyoruz . Veriyolunu başlatır ve üzerinde bulunan tüm DS18B20'leri algılar. Her sensöre daha sonra bir indeks atanır ve bit çözünürlüğü 12 bit olarak ayarlanır.
Gelen HTTP isteklerini işlemek için, bir URL'ye basıldığında hangi kodun çalıştırılacağını belirtmemiz gerekir. Bunu yapmak için yöntem kullanırız . Bu yöntem iki parametre alır. Birincisi bir URL yolu ve ikincisi, o URL'ye ulaşıldığında yürütmek istediğimiz fonksiyonun adıdır.
Aşağıdaki kod, bir sunucu kök ( / ) yolunda bir HTTP isteği aldığında handle_OnConnectişlevi tetikleyeceğini belirtir . Belirtilen URL'nin göreli bir yol olduğuna dikkat edin.
server.on("/", handle_OnConnect);
İstemci, ile belirtilenden farklı bir URL isterse sunucunun ne yapması gerektiğini belirtmedik server.on. Bir HTTP durumu 404 (Bulunamadı) ve kullanıcı için bir mesajla yanıt vermelidir. Bunu da bir işleve koyarız ve server.onNotFoundona belirtilmemiş bir URL için istek aldığında yürütmesi gerektiğini söylemek için kullanırız .server.on
server.onNotFound(handle_NotFound);
Şimdi, sunucumuzu başlatmak için, sunucu nesnesi üzerinde başlangıç yöntemini çağırıyoruz.
server.begin();
Serial.println("HTTP server started");
Inside Loop () Fonksiyonu
Gerçek gelen HTTP isteklerini işlemek için, handleClient()yöntemi sunucu nesnesinde çağırmamız gerekir .
server.handleClient();
Daha sonra, server.onhatırladın mı? İle kök (/) URL'ye eklediğimiz bir işlev oluşturmamız gerekiyor.
Bu fonksiyonun başlangıcında, her sensörden sıcaklık okuması alıyoruz. HTTP isteğine yanıt vermek için gönderme yöntemini kullanıyoruz. Yöntem farklı bir bağımsız değişken kümesiyle çağrılabilse de, en basit biçimi HTTP yanıt kodu, içerik türü ve içerikten oluşur.
Bizim durumumuzda, Tamam yanıtına karşılık gelen 200 kodunu ( HTTP durum kodlarından biri) gönderiyoruz . Ardından, içerik türünü "metin / html" olarak belirliyoruz ve son olarak, sıcaklık okumalarını içeren dinamik bir HTML sayfası oluşturan özel işlevi çağırıyoruz .SendHTML()
SendHTML()işlevi, ESP8266 web sunucusu bir web istemcisinden bir istek aldığında bir web sayfası oluşturmaktan sorumludur. Yalnızca HTML kodunu büyük bir dizeye birleştirir ve server.send()daha önce tartıştığımız işleve geri döner . İşlev, HTML içeriğini dinamik olarak oluşturmak için sıcaklık okumalarını bir parametre olarak alır.
Her zaman göndermeniz gereken ilk metin, HTML kodu gönderdiğimizi belirten <! DOCTYPE> beyanıdır.
Daha sonra, <meta> görüntü alanı öğesi, web sayfasını herhangi bir web tarayıcısında duyarlı hale getirirken, başlık etiketi sayfanın başlığını belirler.
ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr +="<title>ESP8266 Temperature Monitor</title>\n";
Web Sayfasını Biçimlendirme
Ardından, web sayfası görünümünü şekillendirmek için biraz CSS'miz var. Helvetica yazı tipini seçiyoruz, görüntülenecek içeriği satır içi blok olarak tanımlıyoruz ve ortaya hizalıyoruz.
Web Sayfasını Daha Profesyonel Görünecek Şekilde Şekillendirme
Bizim gibi programcılar genellikle tasarımdan korkar - ancak biraz çaba, web sayfanızın daha çekici ve profesyonel görünmesini sağlayabilir. Aşağıdaki ekran görüntüsü size ne yapacağımız hakkında temel bir fikir verecektir.
Oldukça şaşırtıcı, değil mi? Daha fazla uzatmadan, önceki HTML sayfamıza biraz stil uygulayalım. Başlamak için, SendHTML()yukarıdaki çizimden işlevi değiştirmek için aşağıdaki kodu kopyalayıp yapıştırın .
Bu işlevi bir öncekiyle karşılaştırmaya çalışırsanız, bu değişiklikler dışında benzer olduklarını anlarsınız.
Web sayfamız için Google tarafından yaptırılan Open Sans web fontunu kullandık. Cihazda aktif internet bağlantısı olmadan Google yazı tipini göremeyeceğinizi unutmayın. Google yazı tipleri anında yüklenir.
Sıcaklık okumalarını görüntülemek için kullanılan simgeler aslında <svg> etiketinde tanımlanan Ölçeklenebilir Vektör Grafikleridir (SVG). SVG oluşturmak, herhangi bir özel programlama becerisi gerektirmez. Sayfanız için grafikler oluşturmak için Google SVG Editör'ü kullanabilirsiniz . Bu SVG simgelerini kullandık.
Kodda İyileştirme - Otomatik Sayfa Yenileme
Kodumuzla yapabileceğiniz iyileştirmelerden biri, sensör değerini güncellemek için sayfayı otomatik olarak yenilemektir.
HTML belgenize tek bir meta etiket eklenerek, tarayıcıya sayfayı belirli bir aralıkta otomatik olarak yeniden yüklemesi talimatını verebilirsiniz.
<meta http-equiv="refresh" content="2" >
Bu kodu belgenizin <head> etiketine yerleştirin, bu meta etiket tarayıcıya her iki saniyede bir yenileme talimatı verecektir. Oldukça şık!
Sensör Verilerini AJAX ile dinamik olarak yükleyin
Yoğun bir web sayfanız varsa bir web sayfasını yenilemek çok pratik değildir. Sayfayı yenilemeden sunucudan eşzamansız olarak (arka planda) veri talep edebilmemiz için Eşzamansız Javascript Ve Xml ( AJAX ) kullanmak daha iyi bir yöntemdir .
XMLHttpRequest JavaScript içindeki nesne genellikle web sayfalarında AJAX çalıştırmak için kullanılır. Sessiz GET isteğini sunucu üzerinde gerçekleştirir ve sayfadaki elemanı günceller. AJAX yeni bir teknoloji veya farklı bir dil değil, sadece yeni şekillerde kullanılan mevcut teknolojilerdir. AJAX, bunun yanı sıra şunları da mümkün kılar:
Sayfa yüklendikten sonra bir sunucudan veri isteyin
Sayfa yüklendikten sonra bir sunucudan veri alın
Arka planda bir sunucuya veri gönderin
İşte kullanacağımız AJAX betiği. Bu komut dosyasını </head> etiketini kapatmadan hemen önce yerleştirin.
Komut dosyası <script> etiketiyle başlar. AJAX betiği bir javascript'ten başka bir şey olmadığı için, onu <script> etiketi ile yazmamız gerekiyor. Bu işlevin tekrar tekrar çağrılması için javascript setInterval()işlevini kullanacağız . İki parametre alır - yürütülecek bir işlev ve işlevin ne sıklıkla çalıştırılacağına ilişkin zaman aralığı (milisaniye cinsinden).
Bu betiğin kalbi bir loadDoc()işlevdir. Bu işlevin içinde bir XMLHttpRequest()nesne oluşturulur. Bu nesne, bir web sunucusundan veri talep etmek için kullanılır.
ptr +="function loadDoc() {\n";
ptr +="var xhttp = new XMLHttpRequest();\n";
xhttp.onreadystatechange()Fonksiyon readyState her değiştirdiğinde denir. ReadyState özelliği, XMLHttpRequest'in durumunu tutar. Aşağıdaki değerlerden birine sahiptir.
0: istek başlatılmadı
1: sunucu bağlantısı kuruldu
2: istek alındı
3: işleme isteği
4: istek tamamlandı ve yanıt hazır
Status özelliği, XMLHttpRequest nesnesinin durumunu tutar. Aşağıdaki değerlerden birine sahiptir.
200: "Tamam"
403 yasak"
404 Sayfa Bulunamadı"
ReadyState 4 ve durum 200 olduğunda, yanıt hazırdır. Şimdi, vücut içeriği (tutma sıcaklığı okumaları) güncellenir.
Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.