Haber

ESP8266 ile Cep Telefonuna Uyari Göndermek

Gnexlab’da ilk IoT uygulamalrımızı SparkCore ile yapmıştık. Geçekten başarılı bir modül. Photon kod ismi ile bir de 19 Dolarlık bir ürün tanıttılar. Eminim çok kişi tarafından bir çok IoT projesinde kullanılacaktır. Ama sizlerin bu modülü halen pahalı bulacağınızı düşünüyorum. Çinli üreticilerin çıkardığı ESP8266 giderek ünleniyor. Bizde bir kaç tanıtıcı yazı yazmıştık. Bu yazılardan sonra modül üzerinde bir çok denemeler ve hazır kütüphaneler kullandık. Bu yazıda da sizlerle SparkCore ile daha önce burada paylaştığımız örneği bir de ESP8266 ile tekrarlayalım istedik.

Yapmak istediğimiz bir anahtar tetiklendiğinde Cep telefonumuza bir uyarı gelmesi. SMS yada başka yollarda olabilir ama biz Push Notification denilen bir uyarı sistemini kullanacağız. Bu uyarıyı cep telefonumuza alabilmek için yüklememiz gereken uygulama Prowl. Prowl’u iphone app store dan satın alıyoruz fiyatı 2.99 Dolar :( Çok büyük ihtimalle Android olanıda vardır. Bilenler varsa bu yazıya yorumda bulunarak diğer kullanıcıları bilgilendirebilir. Push Notification’ı IoT cihazları ile gönderebilmek için birde aracı bir hizmet kullanmamız gerekli. Bu hizmeti PushingBox veriyor. Üye olup My Services den bir prowl servisi yaratıyoruz. Prowl api anahtarımızı bu servise tanıtıyoruz. Bundan sonra yine Pushingbox da bir senaryo yaratıyoruz. Gerekli bilgileri girip bu senaryo ya action olarak tanımladığımız Prowl servisini ekliyoruz. Dilerseniz başka servislerde ekleyebilirsiniz. Olay olduğunda hem eposta alabilir hem de bir tween yayımlayabilirsiniz. Birden fazla servis aktive edilebilir.

Bu yazıda ınput sinyali için basit bir switch kullandık. Aslında ucuz PIR sensörleri ile bu çalışmayı yapmak daha anlamlı olurdu. Elimde olmadığı için bu PIR sensörünü kullanamıyorum. Çok uygun fiyatlı bu sensörlerden edinmek istiyorum.

ESP8266’nın bu denli ucuz fiyata piyasaya çıkması sensörleri yakındaki belirli bir merkezle (Network HUB) haberleşirmek yerine doğrudan Clould ile haberleştirmeyi sağlamaya yöneliyor beni. Buda Cloudun önemini artırıyor. Gnexlab üyelerinin IoT çalışmalarını deneyip test etmeleri ve daha sonrada ürün olarak bir çalışma yapılırsa bu ürünün yönetimi için çalışabilecek bir IoT cloud çalışmasına başladık. Henüz duyurmak için erken ama size şimdiden müjdesini vermiş olayım. Node Js temelli çok sağlam bir Cloud server Amsterdam serverlarında test faaliyetlerine başladı. Belli olmaz ilk IoT ürünü ile yakında açıklarız.

Bu çalışmaya geri dönecek olursak. ESP8266 yı AT komutları ile herhangi bir kütüphane kullanmadan PushigBox apilerini HTTP 1.1 protokolü üzerinden dürtüklüyoruz.

Hardaware’den bahsetmek gerekirse;

Mikro işlemci kartı olarak Arduino Mega kullandım. Hem Seri Mönütöre Debug mesajları göndermek hemde ESP8266’ya AT komutlarını göndermek için iki seri iletişim elimizin altında diye. Bu donanım aslında Reha Beyin söylemi ile overkill. Hep elimdekileri hazırdakileri kullanmak yönünde bir çabam olduğundan test amaçlı bence uygun bir setup oldu. Bildiğiniz gibi ESP8266 3volt. Arduino ise 5v. Bu yüzden arada bir voltaj converter kullandım. Internette ESP8266 ya direkt 5v arduinoyu bağlayan arkadaşlar var biliyorum ama bir elektronikçi bu yazıyı okuyup da bizi ayıplamasın diye ben devreyi olması gerektiği gibi kurdum. Sparkfun üretimi Logic Level Converter ile ilgili bilgiyi buradan bulabilirsiniz.

Devrenin Fritzing çizimi aşağıdaki gibi.

 

esp8266_bb

photo (16)

 

Breadboardun aşağıdaki voltaj hattı 3.3v. Yukarıdaki voltaj hattıda 5v. Logic Level Converterın yüksek voltaj kısmını 5volt ile düşük voltaj kısmını da 3.3volt ile besliyoruz. İnternet üzerinde direnç ve diyotlarla yapılmış basit voltaj düzenleyiciler de mevcut.

 

 

 

 

Devremizin gerçek görünümü bu kadar anlaşılır olmuyor tabi biraz daha karmaşık görünsede fritzing ile bağlantılar bire bir aynı.

 

 

 

 

 

 

 

 

 

 

Gelelim Yazılıma;

Yazılım bir kere switch’e basıldığında tek bir push notification yollayacak şekilde ayarlanmış durumda. Bunu koddan basitce değiştirebileceğinizi düşünüyorum. Aşağıda Arduino kodunu görebilirsiniz.

 

 

#define SSID "Sizin wifi acess point isminiz" //name of wireless access point to connect to
#define PASS "Sizin wifi şifreniz" //wifi password
#define DST_IP "213.186.33.19" // IP of api.pushingbox.com maybe it changes, so take DST_HOST
#define DST_HOST "api.pushingbox.com"

#define LED 13
#define buttonPin 2

int buttonState = 0;

String sMessage_1 = "v47699E76AEDB1CE";
//String sMessage_2 = "vsfdkjfkjsdhfkdsjfh";
//String sMessage_3 = "sdkfhshfkdshfksdas";

void setup() //initialise device & connect to access point in setup
{
pinMode(LED,OUTPUT);
pinMode(buttonPin, INPUT);
//softwarereset();
reset();

Serial1.begin(115200); // hardware serial connects to esp8266 module
Serial.begin(115200); // usb serial connects to to pc
delay(4000); //wait for usb serial enumeration on 'Serial' & device startup

boolean wifi_connected=false; //not connected yet...
for(int i=0;i<5;i++) //attempt 5 times to connect to wifi - this is a good idea
{
if(connectWiFi()) //are we connected?
{
wifi_connected = true; //yes
break; //get outta here!
}
}
if (!wifi_connected) hang("wifi not connected"); //these seem ok - never had a problem
delay(250);
if(!cipmux0()) hang("cipmux0 failed");
delay(250);
if(!cipmode0()) hang("cipmode0 failed");
delay(250);
}

void loop()
{
buttonState = digitalRead(buttonPin);

// !!!! ONLY TESTING OF METHOD TO PUSH THE MESSAGES TO MY PHONE :-)
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(LED, HIGH);
sendToPushingBox(sMessage_1);
delay(1000);
// while(1);
}
else {
// turn LED off:
digitalWrite(LED, LOW);
}

//delay(1000);
//sendToPushingBox(sMessage_2);
//delay(1000);
//sendToPushingBox(sMessage_3);

}
//------------------------------------------------------------------------------------
void sendToPushingBox(String devid)
{
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += DST_HOST;
cmd += "\",80";

Serial1.println(cmd); //send command to device

delay(2000); //wait a little while for 'Linked' response - this makes a difference

cmd = "GET /pushingbox?devid=";
cmd += devid;
cmd += " HTTP/1.1\r\n"; //construct http GET request
cmd += "Host: api.pushingbox.com\r\n\r\n";
Serial1.print("AT+CIPSEND=");
Serial1.println(cmd.length()); //esp8266 needs to know message length of incoming message - .length provides this

if(Serial1.find(">")) //prompt offered by esp8266
{
Serial1.println(cmd); //this is our http GET request
}
else
{
Serial1.println("AT+CIPCLOSE"); //doesn't seem to work here?
Serial.println("No '>' prompt received after AT+CPISEND");
}

Serial1.println("AT+CIPCLOSE");
}

boolean connectWiFi()
{
String cmd="AT+CWJAP=\""; //form eg: AT+CWJAP="dynamode","55555555555555555555555555"
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
Serial1.println(cmd);
delay(5000); //give it time - my access point can be very slow sometimes
if(Serial1.find("OK")) //healthy response
{
Serial.println("Connected to WiFi...");
return true;
}
else
{
Serial.println("Not connected to WiFi.");
return false;
}
}
//--------------------------------------------------------------------------------
//ditch this in favour of hardware reset. Done
boolean softwarereset()
{
Serial1.println("AT+RST");
if (Serial1.find("ready"))
{
return true;
}
else
{
return false;
}
}
//--------------------------------------------------------------------------------
void reset()
{
Serial1.println("AT+RST");
digitalWrite(LED,HIGH);
delay(100);
digitalWrite(LED,LOW);
}
//------------------------------------------------------------------------------
boolean cwmode3()
// Odd one. CWMODE=3 means configure the device as access point & station. This function can't fail?

{
Serial1.println("AT+CWMODE=3");
if (Serial1.find("no change")) //only works if CWMODE was 3 previously
{
return true;
}
else
{
return false;
}
}
//----------------------------------------------------------------------------------
boolean cipmux0()
{
Serial1.println("AT+CIPMUX=0");
if (Serial1.find("OK"))
{
return true;
}
else
{
return false;
}
}
//-----------------------------------------------------------------------
boolean cipmode0()
{
Serial1.println("AT+CIPMODE=0");
if (Serial1.find("OK"))
{
return true;
}
else
{
return false;
}
}
//------------------------------------------------------------------------
void hang(String error_String) //for debugging
{
Serial.print("Halted... ");
Serial.println(error_String);
while(1)
{
digitalWrite(LED,HIGH);
delay(100);
digitalWrite(LED,LOW);
delay(100);
}
}
//----------------------------------------------------------------------------
void hangreset (String error_String) //for debugging
{
Serial.print(error_String);
Serial.println(" - resetting");
reset();
}

 

Umarım bu projeyi kolayca uygulayabileceğiniz kadar besit anlatabilmişimdir. Sorularınızı yorum olarak bu sayfaya gönderebilirsiniz. Mümkün olduğunca hepsini yanıtlamaya çalışacağım.

Bitirş video ile olsunda çalıştığına inanın 🙂

 

 
 
Teknoloji dolu günler