ESP8266-01 incelemesi. ( Modülün Sunucu ( Server ) olarak çalışması )

SUNUCU OLARAK ÇALIŞMA :
ESP modülümüzü seri port üzerinden PC ye bağladıktan sonra program ile ESP modülümüzün Sunucu ayarlarını yapmaya başlayalım. Bu adımlar aynı zamanda arduino yada pic gibi mikroişlemciler ve seri port kullanan diğer sistemler ile simüle edilebilir.
PC olmaksızın sunucu olarak çalıştırmamızı ve gelecek olan bilgiye göre sistemimizi programlamamızı sağlayacaktır.
Sayfa sonundaki Videolarda hem PIC12F1822 ve PICBASIC kullanılarak yapılmış örneği, hem de Arduino ile kütüphane kullanılmadan yapılmış örnekleri göreceksiniz.
Programın ilk sayfasında gerekli bağlantı işlemlerini yapmanız sağlanır. 2. sayfasında ise Sunucu (Server)  ve İstemci (Client) kısımları bulunur.
Her AT komutunu verdiğinizde ESP size bilgi döndürür. Bu cevabın sonunda çoğu zaman OK cevabı gelir. AT komutlarının sonuna mutlaka “/r/n” koymalısınız.
AT komutları için bu bağlantıya bakabilirsiniz.AT Komutları PDF dosyası

 

 

 

 


Server için kullanacağımız AT komutları aşağıda yazılmıştır.
AT    ( İlk haberleşme var mı diye bakılır. OK cevabı döner.)
AT+RST    ( ESP ye reset atılır. )
AT+CWMODE=3    ( sta ve ap modlarını birlikte kullanabilirsin )
AT+CIPMODE=0    ( normal kullanım )
AT+CIPMUX=1    ( birden fazla bağlantı aynı anda yapılabilmesini sağlar. Sunucu kurduğunuzda bunun mutlaka 1 olması gerekir.)
AT+CWSAP=”ESP8266″,”12345678″,6,4 ( AP KISMI ÇALIŞACAKSA )
AT+CWJAP=”ESP8266″,”12345678″    ( station modem kısmı erişim  noktası çalışacaksa)
Arduinoya yeni başlayanlar için bir not. ( işaretlerinin de gönderilmesi gerektiğinden bu satırı yazarken tırnak işareti yerine \” koymak gerekebilir  örneğe dikkat ediniz
örnek : (“AT+CWSAP=\”ESP8266\”,\”12345678\”,6,4″)

AT+CWDHCP=2,0                (hangi tip erişim noktası istiyorsunuz. AP ya da kendi modeminiz üzerinden bağlantı Bu haliyle AP modundadır.)
AT+CIPSERVER=1,80            ( sunucu açmak için kullanılır. 80 olan port numarasıdır. 80 olarak kullanırsanız kolaylık olur ve internet sayfalarıda kullandığından sorun olmayacaktır. modeminizde bazı portlar koruma altında olabilir.
Bu komutları verdiğinizde sunucunuz açılmış demektir. Fakat iş bununla bitmiyor. İnternet sayfasından bir data gelecektir. Bu datanın ayrıştırılması gerekmektedir.
Bu datayı ayırmak için aşağıdaki Arduino programını kullanabilirsiniz.

String readString;
String bak[5]="";
String denek = "";

__FlashStringHelper *den1 ;
__FlashStringHelper *den2 ;
__FlashStringHelper *den3 ;
__FlashStringHelper *den4 ;
__FlashStringHelper *den5 ;
__FlashStringHelper *den6 ;
__FlashStringHelper *den7 ;
__FlashStringHelper *den8 ;
__FlashStringHelper *den9 ;
__FlashStringHelper *srv1 ;
__FlashStringHelper *srv2 ;
__FlashStringHelper *srv3 ;
__FlashStringHelper *srv4 ;
__FlashStringHelper *srv5 ;
__FlashStringHelper *srv6 ;
__FlashStringHelper *srv7 ;

char * pch;
char * str;
int say=0;
int say2=0;
int x=1;
int bekle=0;
int wc=0;
int prob=0;
int sayac=0;
int saybak=0;

void bakgel(){        // bekleme komutunu tekrar tekrar kullanmak yerine bu şekilde yapıldı hafıza kaplamasın diye. 
  delay(1000);
}

void serverac(){          // ****** server bilgilerini gönder ****************
srv1=F("AT+CWMODE=3");        // F fonksiyonu ile program belleğine gönderildi bu değişkenler. 
srv2=F("AT+CIPMODE=0");
srv3=F("AT+CIPMUX=1");
srv4=F("AT+CWDHCP=2,0");
srv5=F("AT+CIPAP=\"192.168.4.1\"");
srv6=F("AT+CWSAP=\"ESP8266\",\"12345678\",6,4");
srv7=F("AT+CIPSERVER=1,80");
  
  Serial.println("AT+RST");
  delay(5000);
  Serial.println(srv1);
  bakgel();
  Serial.println(srv2);
  bakgel();
  Serial.println(srv3);
  bakgel();
  Serial.println(srv4);
  bakgel();
  Serial.println(srv5);
  bakgel();
  Serial.println(srv6);
  bakgel();
  Serial.println(srv7);
  bakgel();
  
}

void ipdcontrol(){
  
      
      sayac=0;
str = bak[1].c_str(); 
   pch=strstr (str,"IPD");    // 2. string ifadenin bulunduğu yerden itibaren string ifadenin sonuna kadar okur. 
    denek=pch;                      // bu pch  char şeklinde olduğundan bunu string değişkenine çevirip uzunluğunu bulmak istiyoruz.
    say=denek.length();           // string uzunluğunu buluruz.
      if (say>0){
        prob=1;
        sayac=1;
        //Serial.print("bak[1]ipdcontrol ") ;Serial.println(bak[1]) ;
        }
      
}



void kontrol(){         // ***************  string ifadesinde 2. bir string ifadeyi bulur yoksa null döndürür. 
//Serial.println(" kontrol") ;
    if (say2==0) {      // bu devamlı buraya geldiğinde işlem yapmadan gitsin diye yapıldı. vakit kaybetmesin
      wc=2;
      denek=bak[2];
      str = bak[2].c_str();   // bu ifade normal string ifadesini const char şekline dönüştürür. normal şekilde const char ifadelere  str=bak[2] şeklinde çeviriyi kabul etmez.
 
      //**********  buton tanımlamaları ***********************
      
     pch=strstr (str,"LIGHT1+ON");    // 2. string ifadenin bulunduğu yerden itibaren string ifadenin sonuna kadar okur. 
     denek=pch;                      // bu pch  char şeklinde olduğundan bunu string değişkenine çevirip uzunluğunu bulmak istiyoruz.
     say=denek.length(); // string uzunluğunu buluruz.
        if (say>0){digitalWrite(11,HIGH);
        wc=1;
        //Serial.println(bak[2]) ;
        }
  
     pch=strstr (str,"LIGHT2+ON");    // 2. string ifadenin bulunduğu yerden itibaren string ifadenin sonuna kadar okur. 
     denek=pch;                      // bu pch  char şeklinde olduğundan bunu string değişkenine çevirip uzunluğunu bulmak istiyoruz.
     say=denek.length();           // string uzunluğunu buluruz.
       if (say>0){digitalWrite(12,HIGH);wc=1;}
  
     pch=strstr (str,"LIGHT1+OFF");    // 2. string ifadenin bulunduğu yerden itibaren string ifadenin sonuna kadar okur. 
     denek=pch;                      // bu pch  char şeklinde olduğundan bunu string değişkenine çevirip uzunluğunu bulmak istiyoruz.
     say=denek.length();           // string uzunluğunu buluruz.
       if (say>0){digitalWrite(11,LOW);wc=1;}
  
    pch=strstr (str,"LIGHT2+OFF");    // 2. string ifadenin bulunduğu yerden itibaren string ifadenin sonuna kadar okur. 
    denek=pch;                      // bu pch  char şeklinde olduğundan bunu string değişkenine çevirip uzunluğunu bulmak istiyoruz.
    say=denek.length();           // string uzunluğunu buluruz.
      if (say>0){digitalWrite(12,LOW);wc=1;}

        if (wc==2){
   str = bak[1].c_str(); 
   pch=strstr (str,"IPD");    // 2. string ifadenin bulunduğu yerden itibaren string ifadenin sonuna kadar okur. 
    denek=pch;                      // bu pch  char şeklinde olduğundan bunu string değişkenine çevirip uzunluğunu bulmak istiyoruz.
    say=denek.length();           // string uzunluğunu buluruz.
      if (say>0){
        prob=1;
        //digitalWrite(12,HIGH);
        htmlpage();         // ****  şayet ilk defa web isteği geliyorsa kullanıcıya uygun web sayfasını yollar. 
        wc=1;
        }
   }
        // Serial.println(wc) ;
        // Serial.println(denek) ;
       // Serial.print("bak[1]") ;Serial.println(bak[1]) ;        // ******************** videoda bunları AÇ göster ****************************************************
   //  Serial.println(bak[2]) ;
    bak[1]="";
    bak[2]="";
    say2=1;x=1;bekle=0;
    }
 bekle=0;  
}

void htmlpage(){
 // Serial.println(den1,den2,den3) ;
  Serial.println("AT+CIPSEND=0,450");
         delay(200);
  Serial.print(den1) ;
  Serial.print(den9) ;
  Serial.print(den2) ;
  Serial.print(den3) ;
  Serial.print(den4) ;
  Serial.print(den5) ;
  Serial.print(den6) ;
  Serial.print(den7) ;
  Serial.println(den8) ;
  delay(100);
  prob=0;
}

void setup() {
   Serial.begin(115200);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
 // Serial.println("baslangic");
  say2=1;
  prob=0;
  // **************  aşağıdaki denx değişkenleri saklama alanına F donksiyonu ile gönderiliyor. ******************
  den1 = F("<!DOCTYPE html><html><form action=\"\" method=\"post\">");
  den9 = F("<input type=\"\" name=\"action\" value=\"Butonlari kullanin\" /><br><br>");
  den2 = F("<input id=\"LIGHT1ON\" type=\"submit\" name=\"submit\" value=\"LIGHT1 ON\">");
  den3 = F("<input id=\"LIGHT1OFF\" type=\"submit\" name=\"submit\" value=\"LIGHT1 OFF\">");
  den4 = F("<p><input id=\"LIGHT2ON\" type=\"submit\" name=\"submit\" value=\"LIGHT2 ON\">");
  den5 = F("<input id=\"LIGHT2OFF\" type=\"submit\" name=\"submit\" value=\"LIGHT2 OFF\"></p>");
  den6 = F("</form></html>");
  den7 = F("<?php");
  den8 = F("if (isset($_POST['action'])) {}?>");
   serverac();
}

void loop() {
  if (Serial.available() > 0){
    delay(5);
    lightkontrol();
/*    char c = Serial.read();
               readString += c;
               readString.trim();
    
    if (readString == "+IPD"){
      Serial.println("Ok");
      bak[1]=readString;
      lightkontrol();
       readString="";
    }*/
  }
}

void lightkontrol(){
 sayac=0;bak[1]="";
  readString="";
  basadon:
  say2=0;
  delay(10);
  if (Serial.available() > 0){
    sayac=1;say2=1;
    if (bak[1]==""){
      saybak=0;  
    }
    
while  (Serial.available() > 0){
        char c = Serial.read();
        saybak++;
      

  if (saybak<=20){
        readString += c;
  }
   if (saybak==20){
    bak[1]=readString;
         readString=""; 
    }
  if (saybak>=285 ){
        readString += c;
  }
   
}  
  bak[2]=readString;
  //Serial.print("saybak" );Serial.println(saybak);
  }
  if (sayac==1){
    sayac=0;
    goto basadon;
  }
//Serial.print("say2" );Serial.println(say2);
//Serial.print("bak1light" );Serial.println(bak[1]);
//Serial.print("bak2 light");Serial.println(bak[2]);

kontrol();
}

GELEN DATANIN İNCELENMESİ:
ESP nin benim gördüğüm 2 çeşit çalışma şekli var.

1 – ) internet sayfasından  gelen veri
2 – ) Soket mimarisi kullanım.
Bunların farklılıklarını aşağıda görebileceksiniz.
1-) İnternet üzerinden bilgi göndererek yada alarak çalışacaksanız.
İnternet üzerinden formatı belli bir dizi karakter gelir. Bu karakterleri ayrıştırmak için bilgileri ESP den seri port vasıtasıyla alıp, bilgileri ayrıştırmamız gerekiyor.  Bu sistemde internet sayfasından bir istek ESP modüle geldiğinde aşağıdaki ifade gelmiş demektir.
( seri port buffer denilen tampon bellek 64 karakterdir. Bu karakter adedi dolduğunda veriler gelemiyor yada verici gönderse bile kayboluyor. Programı incelediğinizde verileri zaman kaybetmeden devamlı aldığımız ve değişkenlere aktardığımız için 115200 hızında bile verileri alabiliyor. gelen veri 400-500 karakter uzunluğunda oluyor. devamlı buffer belleği boşaltıldığı için yeni verilerin gelişinde sorun olmuyor. )
0,CONNECT

+IPD,0,416:GET / HTTP/1.1
Host: 192.168.1.140:1234
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Bu ifade web sitesinin bağlanmak istediğini anlatır. Gelen ifadeyi ayırdığımızda +IPD belirteç olup yanındaki 0 bağlantı numarasıdır. Yanındaki 416 ise gelen karakterin 416 karakter olduğunu belirtir.
Arduino yada mikroişlemci ile bunları ayıklayıp ESP ile istek yapan WEB sitesine bir html sayfası göndeririz. Bu sayfada işlemimize göre butonlar bulunur. Yada bilgi satırları bulunur. Kullanıcı internet sayfasından butona bastığında Benzer bir satır gelir fakat son kısmı farklıdır.
+IPD,1,570:POST / HTTP/1.1
Host: 192.168.4.1
Connection: keep-alive
Content-Length: 39
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://192.168.4.1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://192.168.4.1/
Accept-Encoding: gzip, deflate
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
action=submit&name=John&submit=LIGHT1+ON
Bu en alttaki satır basılan butona göre değişiklik gösterebilir. Kendi gönderdiğiniz web sayfanıza göre. LIGHT2+ON yada OFF olabilir.
Örnek web sayfası : Bu sayfada butonları ESP ye gönderen kısım PHP kısmıdır.
İsterseniz kendinize göre düzeltebilirsiniz fakat düzelttiğinizde tüm karakter sayısını doğru bir şekilde sayıp AT+CIPSEND ile önceden ESP ye bildirmeniz gerekiyor. Programda bunu görebileceksiniz.

<!DOCTYPE html>
<html>
<form action="" method="post">
   
    <input id="LIGHT1ON" type="submit" name="submit" value="LIGHT1 ON">
    <input id="LIGHT1OFF" type="submit" name="submit" value="LIGHT1 OFF"><p>
    <input id="LIGHT2ON" type="submit" name="submit" value="LIGHT2 ON">
    <input id="LIGHT2OFF" type="submit" name="submit" value="LIGHT2 OFF"></p>
<p>
<br>
</p>

Sensor Degeri : 
<input type="text" name="takım" size="10" value="degeryaz."><br>
</form>
</html>

<?php
if (isset($_POST['action'])) {}?>

Bu sayfayı internet üzerinden sayfa isteği geldiğinde program otomatik olarak gönderecektir. Şayet Giriş bölümünde kullandığınız programı kullanmak isterseniz SERVER kısmındaki beyaz kutudaki html yazılarıyla bu html yazılarını yer değiştirmeniz yeterlidir.

2-) SOKET mimarisinde işler biraz daha kolaydır. Bu genelde aynı network üzerinde yakın mesafede mesela ev içerisinde kullandığınız sistemlerde olabilir.
MIT2 App inventor da yapabileceğiniz wifi programlarda soket mimarisi kullanılır.
Bu sistemde sadece gönderilecek bilgi ESP tarafından alınır. Mesela sadece LIGHT1ON kelimesini gönderebilirsiniz.
Gelen bilgilerden örnekler aşağıdadır.
1,CONNECT

+IPD,1,5:LCDDD
+IPD,1,16:LCDWR 1,3-DENEME
+IPD,1,5:LCDCB
+IPD,1,10:LCDRC 1,5-1,CLOSED

Bizde soket mimarisine uygun bir şekilde geri bilgi gönderebiliriz. Bunun için önce ESP ye kaç karakter yollayacağımızı bildiriyoruz. Göndereceğimiz bilgi : “Geri bildirim”
AT+CIPSEND=0,13
OK
>

Recv 13 bytes
SEND OK
Bu sistemde Seri port üzerinden gelen bilgileri ayrıştırmak daha kolaydır.
Fakat bunu internet üzerinden soket mimarisine göre gönderecek program bulamadım. Bundan dolayı aynı ağ üzerinde çalışan android sisteminden yada 2 arduino arası ya da PC den ESP ye gönderim olarak kullanabilirsiniz.

Ayrıca Proteus ve PIC12F1822 kullanılarak ESP kontrolünü gerçekleştiren PICBASIC kodunu da bulacaksınız.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2018 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 29.03.2018                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;********************** AYARLAR BAŞLANGICI ****************************** 
#config
 __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF 
 __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_ON & _STVREN_OFF & _BORV_19 & _LVP_ON
#ENDCONFIG

DEFINE OSC 32
;OSCILLATOR
;OSCCON=%01111000   '%01101000=4 mHZ
OSCCON=%11110000   ; 8*4=32mhz 16f1827 den   PLL enable ON olursa. 

PORTA=%00000000     :  ;    TRISA=%000011
ADCON0=%00000000    :      ADCON1=%00000000
ANSELA=%00000000
OPTION_REG=%00000000
WPUA=%111111 ' This register consists of "6" bits .

; **************** 4mhz 9600 baud 
;RCSTA = $90   ' Enable serial port & continuous receive
;TXSTA = $20   ' Enable transmit, BRGH = 0
;SPBRGL = 25    ' 9600 Baud @ 4MHz, 0,16%
;SPBRGH = 0
;BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
;DEFINE HSER_CLROERR 1 ' Clear overflow automatically

 ; *************** 32mhz 9600 baud **********************
RCSTA = $90   ' Enable serial port & continuous receive
TXSTA = $24   ' Enable transmit, BRGH = 1
SPBRG = 64    ' 9600 Baud @ 0,04%
SPBRGH = 3
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

; *************** 16mhz 9600 baud **********************
;RCSTA = $90   ' Enable serial port & continuous receive
;TXSTA = $24   ' Enable transmit, BRGH = 1
;SPBRG = 160   ' 9600 Baud @ -0,08%
;SPBRGH = 1
;BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
;DEFINE HSER_CLROERR 1 ' Clear overflow automatically

; Kesmeler için
SYMBOL  GIE  =INTCON.7  
SYMBOL  PEIE =INTCON.6  
SYMBOL  RCIE =PIE1.5    
SYMBOL  RCIF =PIR1.5

CM1CON0=0                         
CM1CON1=0 
APFCON.7=1      ; RA5 RX tanımlandı
APFCON.2=1       ; RA4 TX olarak tanımlandı
APFCON.0=0
CCP1CON=0
ANSELA  =   0                   
TRISA   =   %000101000  ; MCLR OFF fakat input olarak kullanılabilir

;************************** AYARLAR SONU *******************************
;*****************  DEĞİŞKENLERİN TANIMLANMASI ********************        

'***********Sensör Tanımlamaları***********

Comm_Pin1   VAR	PortA.2
Busy        VAR BIT
HAM         VAR	WORD
ISI         VAR WORD
SIGN        VAR BYTE
SIGN_BITI   VAR HAM.Bit11
NEGAT_ISI   CON 1
;TEMP        VAR BYTE
Float       VAR WORD



kar1    var byte
kar2    var byte
dd  var byte[10]
temp1 var byte
temp var byte
clear
PORTA   =   3
Pause 200


 
;*****************  DEĞİŞKENLERİN TANIMLANMASI  SONU ********************       

;***************************   KESMELERİN TANIMLANMASI 
GIE=0   'tüm kesmeler kapalı 
PEIE=1  'Çevre birim kesmesi aktif
RCIE=1  'Usart alım kesmesi aktif
RCIF=0
GIE=1   'tüm kesmeler aktif  

;***********************
 
ON INTERRUPT GOTO KESME 

 hserout ["AT",13,10]
 pause 200
 
 hserout ["AT+CWMODE=3",13,10]
 pause 200
 hserout ["AT+CIPMODE=0",13,10]
  pause 200
 hserout ["AT+CIPMUX=1",13,10]
  pause 200
 hserout ["AT+CWDHCP=2,0",13,10]
  pause 200
 hserout ["AT+CIPAP=",34,"192.168.4.1",34,13,10]
   pause 200
 hserout ["AT+CWSAP=",34,"ESP8266",34,",",34,"12345678",34,",6,4",13,10]
    pause 200
hserout ["AT+CIPSERVER=1,80",13,10]
  pause 200    
BASLA:

 if kar1=1 and kar2=1 then call lightkontrol:kar1=0:kar2=0
 if kar1=1 and kar2=0 then call htmlgonder:kar1=0:kar2=0
 

GoTo basla

htmlgonder:
gosub sensoroku

 hserout ["AT+CIPSEND=0,376",13,10]
 pause 100
 hserout ["<!DOCTYPE html><html><form action=",34,34," method=",34,"post",34,">",13,10]
 hserout ["<input id=",34,"LIGHT1ON",34," type=",34,"submit",34," name=",34,"submit",34," value=",34,"LIGHT1 ON",34,">",13,10]
 hserout ["<input id=",34,"LIGHT1OFF",34," type=",34,"submit",34," name=",34,"submit",34," value=",34,"LIGHT1 OFF",34,"><p>",13,10]
 hserout ["<input id=",34,"LIGHT2ON",34," type=",34,"submit",34," name=",34,"submit",34," value=",34,"LIGHT2 ON",34,">",13,10]
 hserout ["<input id=",34,"LIGHT2OFF",34," type=",34,"submit",34," name=",34,"submit",34," value=",34,"LIGHT2 OFF",34,"></p>",13,10]
 hserout ["</form></html>",13,10]
 hserout ["<?php",13,10]
 hserout ["if (isset($_POST['action'])) {}?>",13,10]
 
return

lightkontrol:
if  dd[5]="O" and dd[6]="N" then call ac
if  dd[5]="O" and dd[6]="F" then call kapat
return
ac:
if  dd[3]="1" then porta.0=0
if  dd[3]="2" then porta.1=0
return
kapat:
if  dd[3]="1" then porta.0=1
if  dd[3]="2" then porta.1=1
return


disable
KESME:  ; SERİ PORT KESMESİ
GIE=0 :kar1=0:kar2=0
HSERIN 5,atla2, [WAIT("IPD"),dd[1]]
kar1=1
  HSERIN 5,atla, [ dd[2]]
HSERIN 5,atla2, [WAIT("LIGHT"),dd[3]]
kar2=1
  for temp1=4 to 10
  HSERIN 5,atla, [ dd[temp1]] 
  next temp1   
ATLA:
atla2:
TEMP=RCREG
GIE=1
return
enable

; sensor ds18b20  okuma ve gonderme.
 SENSOROKU: 
           
           OWOUT   Comm_Pin1, 1, [$CC, $44]' ISI değerini oku
           
Bekle1:
           OWIN    Comm_Pin1, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle1  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin1, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin1, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla1
           RETURN
    
Hesapla1:                 ; Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"  
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10 
       GOTO GEC1   
    endif
    TEMP = 625 * (HAM+1)         
    ISI = DIV32 10          ; Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC1:
    FLOAT = (ISI //1000)/100
    ISI=(ISI/1000)-1
  
  if ISI=64 then goto sensoroku  
 RETURN    
 

end

picbasic programı ve proteus şeması (12F1822 server)
Picbasic programı ds18b20 ile yapılmış sensör bilgilerini içeriyor. Çalışıyor fakat internete gönderim metodu daha eklenmedi. Bilgileri incelediğinizde aynı metodla internete gönderebilirsiniz.  
Tüm sistem 115200 baud olarak çalışacaktır. Fakat Proteus gerçek devreyi 115200 baud ile kontrol edemeyeceği için geçici olarak ESP modülün baud hızını değiştirmemiz gerekiyor.
Bu değişim ESP modüllerin versiyon ve modeline göre değişiyor. Bir başka ESP modülünde AT+CIOBAUD komutu kullanılıyormuş.
Benim modülümün versiyonları aşağıdadır.
AT+GMR    (komutuyla versiyon bilgilerini öğrenebilirsiniz. )

AT version:1.2.0.0(Jul  1 2016 20:04:45)
SDK version:1.5.4.1(39cb9a32)
Ai-Thinker Technology Co. Ltd.
Dec  2 2016 14:21:16
OK
Bu versiyona göre olan haberleşme hızı değiştirme komutları.
AT+UART UART configuration, [@deprecated]   Kullanımdan kaldırılmış.
AT+UART_CUR UART current configuration     Geçici olarak değiştirir. Güç kesildiğinde                                                                              eski haline döner.
AT+UART_DEF UART default configuration, save to flash     Bu komut kullanıldığında FLASH içerisinde değişiklik yapıldığından ayarladığınız şekilde kalacaktır.
PC üzerinde herhangi bir seri port uygulaması yada seri monitör kullanılarak  Geçici olarak haberleşme hızı değiştirilir.Sonrasında Proteus uygulaması açılır ve COMPIM komponenti ayarlarından ESP modülünün bağlandığı port seçilerek program çalıştırılır.

Gerekli açıklamaları videolar içerisinde bulacaksınız.

TÜM PROGRAMLARA BURADAN ULAŞABİLİRSİNİZ. 

SUNUCU (server) video-1

SUNUCU (server) video-1

Modülün İstemci (Client ) olarak çalışmasını görün

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.