ESP8266-01_ Arduino_Pic_TCPserver_XML_datalog_excel_grafik

Bu konumuzda Arduino veya PIC ile yapılmış devrelerimizden, kablosuz olarak datalog oluşturmak. XML ile oluşturulan bu dosyaların EXCEL üzerine aktarılması ve analiz için grafiğinin çıkarılmasını göreceğiz.

Datalog iki şekilde oluşabilir. SD kart üzerinde oluşturup bilgisayara taşıyabilirsiniz. Ya da gerçek zamanlı olsun derseniz, kablosuz olarak PC ye aktarabilirsiniz.
PC ye nasıl aktaracağız derseniz de, PC üzerinde bir TCP server programı olacak. Bu program VB6 ile yapıldı. XP gibi eski bilgisayarlarda çalıştığı gibi WIN10 bilgisayarlarda da çalışabilmektedir. Bu program gelen bilgileri bir txt dosyasına kaydeder. Bu dosya uzantısı xml olarak değiştirilerek, XML dosyası oluşturulur.

Öncelikle Arduino ya da PIC ile yapılmış programın, satın almış olduğunuz ESP8266-01 ile nasıl haberleştiğini görelim.
( Şayet ESP8266-01 modülünüzü AT komutundan farklı bir şekilde kullandıysanız, içerisindeki SDK programı Yenilemek isteyebilirsiniz. Bu sayfadan faydalanıp SDK yani AT komut setine cevap verecek duruma getirmeniz gerek. )

Bu linkten ESP01 modülünüzü AT komut seti olarak nasıl çalıştıracağınızı öğrenebilirsiniz. 

Bu linkten ESP01 ile ilk defa çalışıyorsanız, Nasıl başlayabilirsiniz bunu öğrenebilirsiniz.

ESP01 modülünüzü AT komut setiyle çalıştırdıysanız, Artık deneme programınızı Arduinoya ya da PIC işlemcinize yükleyebilirsiniz.
AT komut seti hakkında ayrıntılı bilgiyi buradan alabilirsiniz. 
Her iki program da benzer programlardır.
Önce ESP01 modülünü istemci olarak ayarlamak için AT komutlarını yollar.
AT+RST               ESP01 reset atar.
AT                       Bu komut hazır mı diye kontrol etmemizi sağlar. Cevap “OK” dir.
AT+CWMODE=3  Modülün STA,AP,SAT+AP şeklinde çalışması gerektiğini belirtiriz.
AT+CIPMODE=0  Modülde Transfer modudur. 0=Normal mod.
AT+CIPMUX=1     Modülde sunucu açılacaksa çoklu bağlantıya izin vermesi.
AT+CWJAP=”SSID ismi”,”şifre”   Modeminize bağlanmak için gereken kullanıcı ismi ve şifre.
AT+CIPSTART=0,”TCP”,”192.168.1.102″,1001    PC deki sunucunun IP adresi ve PORT adresi.
Buraya kadar olan komutlarla PC bağlantımızı kurmuş olduk. Şimdi de bilgi gönderme kısmını oluşturalım.
AT+CIPSEND=0,8   Bu komut ile kaç karakter bilgi göndereceğimizi ESP ye söyleriz. ESP bize    AT+CIPSEND=0,8     OK   cevabını verdikten sonra 8 karakterlik bilgimizi göndeririz. Örnek: deneme   Bu 6 karakter ediyor diye düşünüyorsunuzdur. Evet 6 karakter. Biz 8 karaktere tamamlamak için ENTER ve Line Feed ( CR+LF ) denilen 2 karakteri gönderiyoruz. PICbasic ile yapılan programda Hserout satırının sonunda 13,10 karakterleri yer almaktadır.
Arduino programında ise bir karakter yazılmamıştır. Sadece Serial.println ile gönderilmesi yeterlidir.
Bunun sebebi ise ESP8266-01 modülü, gelen bilgilerin sonunda bu karakterleri arar, bulunca son karakter olduğunu anlar.

Arduino programında baştaki AT hazırlık komutlarının bazılarında sadece bilgi gönderdim cevap beklemedim. Cevap yerine DELAY komutuyla bekleme yaptım.
Bu şekilde AT+CIPSEND=0,8 gibi bir komut gönderdiğimde OK cevabını aldığımda, bilgiyi hemen gönderip alındı bilgisini de Espnin gönderdiği SEND OK bilgisinden anlıyorum. Sonrasında yeni bilgi için yine AT+CIPSEND=0,? komutu yolluyorum. Programlarda bu iki değişik geri bildirimi yakalamak için bir değişken kullandım. Hangisini bekleyecek isem, o değişkene OK ya da SEND OK yazıyorum ve o cevabı bekliyorum.

Programlar basit olduğundan anlaşılması zor olmayacaktır. Farklı olan kısmı XML şeklinde yazdırmaktır.
XML için gereken yazılım şekli aşağıdadır.
<?xml version=”1.0″ encoding=”UTF-8″?>    : standart bildirim satırı
<?xml-stylesheet type=”text/css” href=”datalog.css”?>   : internet sayfası olarak göstermek için sayfa stilini ayarlayan dosya adı.
<DATALOG>   : başlık kısmıdır.
<tempretures> : konu kısmıdır
<SENS_NO>01</SENS_NO>   :diğerleri verilerdir.
<Temp>001</Temp>
<Date>03.05.2020</Date>
<Hour>09:25:30</Hour>
</tempretures>
<tempretures> : konu kısmıdır
<SENS_NO>01</SENS_NO>   :diğerleri verilerdir.
<Temp>002</Temp>
<Date>03.05.2020</Date>
<Hour>09:25:30</Hour>
</tempretures>
</DATALOG>
Bu şekilde yazdırırken, aradaki değerleri de yazdırmadan önce sizin hesaplamanız gerekiyor. Mesela birden fazla sensörünüz var. Bu sensörün numarasını gerekli yere yazdırmak için hazırlamanız gerek. Sonrasında sensör değerlerini kontrol etmeniz gerek. RTC varsa saat bilgisini de alarak bu bilgileri tamamlayıp ESP01 ile PC ye gönderebilirsiniz. < > bu karakterler arası görünen yazılar zaten değişmez.
Bu şekilde gönderirken her satırın sonunda CR+LF olduğunu da dikkate almanız gerek.
Arduino da komut olarak dizinin karakter sayısını hesaplayan LENGTH komutunu kullandım. Bu sayı bana, gönderilecek karakter sayısını verecektir. PICBASIC  te ise bu tip bir komut olmadığından ben de gönderilen karakter sayısı değişmesin diye 15 göndermek yerine 015 gönderecek şekilde DEC3 belirtecini kullandım.
Arduinoda AT+CIPSEND için karakter sayısı her defasında hesaplanıyor PICBASIC te ise hep sabit olarak gönderiliyor.
Bu sensör bilgilerini temsil etmek için bir sayaç koydum. Her defasında 1 artarak bilgi gönderiliyor. Sizler bu sayaç yerine, kendi sensör değerlerinizi koyup, gönderecek şekilde programda değişiklik yapabilirsiniz.

Arduino programında 179. ve 180. ve 185. satırdaki komutlar ESP8266-01 in yazılımsal seri port ile çalıştırılması esnasında sorun yaratmasın diye, haberleşme hızını geçici şekilde 9600 baud olarak ayarlamak içindir. Bu komut ile ESP01 modülüne bundan sonra reset atılasıya kadar, haberleşme hızın 9600 baud olsun demiş oluyoruz. Tekrar RESET atılırsa veya yada yeniden enerji verilirse 115200 baud haberleşme hızına geçer.  İstenirse Kalıcı olarak da 9600 baud hızına ayarlanabilir. Bunun için yukarıda linkini vermiş olduğum AT komut setine bakmanız sanırım yeterli olacaktır.
Yazılımsal seri port kullanıyorsanız, 9600 baud gibi düşük hızları kullanmanız, haberleşme hatalarını en aza indirecektir.

/*  3.3V seviye dönüşüm yaparak esp Rx e ver. ayrıca gnd yi pc gnd ye tak. ayrı power kullanıldığında.
 ESP8266-01_ istemci (client) çalışması
 Aşağıdaki bilgiler ESP ye gönderilen komutlar ve alınan geri bildirimlerdir. 
 Bunlara bakarak gerçekte nasıl bir geri bildirim gelmesi gerektiğini görebilirsiniz. 

 AT+CWJAP="Guest_SSID_1_4A09","guest1997"
0,CLOSED
WIFI DISCONNECT
WIFI CONNECTED
WIFI GOT IP

OK

AT+CIPSTART=0,"TCP","192.168.1.102",1001
0,CONNECT

OK

AT+CIPSEND=0,21

OK
> 
Recv 21 bytes

SEND OK

+IPD,0,9:send dataAT+CIPSEND=0,466

OK
> 
Recv 466 bytes

SEND OK

+IPD,0,24:send data   sdfsdfsdfsdf

AT+CIPSEND=0,10
deneme esp
***************************************************
serverden gelen bilgi aşağıda OK yok IPD kontrol et. 
+IPD,0,26:2,GONDERiLECEK BiLGiYi YAZ
**********************************************
=================================================================
client servere gönderirken
AT+CIPSEND=0,12

OK
>
deneme esp  gönderilir ama esp bunu göstermez. sadece recv 12 bytes yazar. ve gönderme tamamlandığında SEND OK bilgisini döndürür.  
Recv 12 bytes

SEND OK
==============================================================
----------------------------------------------------------------
Client bağlantısı kurulduğunda 
AT+CIPSTART=0,"TCP","192.168.1.102",1001  // 0 esp nin servere bağlantı yaptığı kanal 3 e kadar farklı kanallardan gönderebilir. 
                                          //  bu 0 sunucunun bağlantı numarasını etkilemez. sunucu hangi sırada bağlandıysa o numarayı atar
                                          //   aradaki haberleşme için. 
0,CONNECT

OK
---------------------------------------------
 */
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
 
 String readString;
String bak[5]="";
String denek = "";
String gonderbilgi="";


//__FlashStringHelper *gonderbilgi ;   
__FlashStringHelper *srv1 ;    // __FlashStringHelper komutuyla srv1 e ait bilgilerin program belleğine yüklenmesi için yer ayrılır. 
__FlashStringHelper *srv2 ;
__FlashStringHelper *srv3 ;
__FlashStringHelper *srv4 ;
//__FlashStringHelper *srv5 ;
__FlashStringHelper *srv6 ;
//__FlashStringHelper *srv7 ;
char * kont;
char * pch;
char * str;
int say=0;
int say2=0;
int prob=0;
int hata=0;

void bakgel(){        // bekleme komutunu tekrar tekrar kullanmak yerine bu şekilde yapıldı hafıza kaplamasın diye. 
 hata=0;
 delay(100);
// Serial.print("string ");Serial.println("*********************************");
  while  (mySerial.available()){
        char c = mySerial.read();
        readString += c;
  }  
  bak[1]=readString;
  denek=readString;
   Serial.print("Gelen : ");Serial.println(denek);
   readString="";
   str = bak[1].c_str(); 
  pch=strstr (str,kont);    // OK den sonra ne varsa onu pch olarak tutar 
   denek=pch;               // pch taki char değerleri string e çevirerek alır. 
   say=denek.indexOf(kont);  // denek dizisi içerisinde OK kaçıncı karakter. 
   if (kont=="OK"){
    denek=denek.substring(say,say+2);
   }
   if (kont=="SEND OK"){
    denek=denek.substring(say,say+7);
   }
      
if (denek=="OK" || denek=="SEND OK"){
  hata=0;
 }else{
  hata=1;  
}
  //delay(1000);
}

void istemciac(){          // ******istemciyi hazırla ve gönder. ****************
srv1=F("AT+CWMODE=3");        // F fonksiyonu ile program belleğine gönderildi bu değişkenler. Sebep data belleğinde yer açmak.
srv2=F("AT+CIPMODE=0");
srv3=F("AT+CIPMUX=1");
srv6=F("AT+CIPSTART=0,\"TCP\",\"192.168.1.102\",1001"); // gelen bilgi 0,CONNECT OK
srv4=F("AT+CWJAP=\"Guest_SSID_1_4A09\",\"guest1997\""); // gelen bilgi WIFI CONNECTED   WIFI GOT IP   OK   

  kont="OK";
 //RST:         //***********  AT+RST uygula ve 3000ms bekle. **************** kullanılmıyor zaten ilk enerji verildiğinde bunu yapıyor. 
// Serial.println("AT+RST");// denemeOK
//delay(3000);
//  bakgel();
  //Serial.print("HATA : "); Serial.println(hata,DEC);
//    if (hata==1){
//    goto RST;
//  }
  CWMODE:
  mySerial.println(srv1);
 delay(100);
  bakgel();
  Serial.print("HATA : "); Serial.println(hata,DEC);
  if (hata==1){
    goto CWMODE;
  }
  CIPMODE:
  mySerial.println(srv2);
 delay(100);
  bakgel();
  if (hata==1){
    goto CIPMODE;
  }
  CIPMUX:
  mySerial.println(srv3);
 delay(100);
  bakgel();
  if (hata==1){
    goto CIPMUX;
  }
  STA_AC:
  mySerial.println(srv4);
 delay(500);
  bakgel();
  bakgel();         // kontrol yapılmıyor sadece buffer daki bilgiler temizleniyor. 
 
  ISTEMCI_AC:
  mySerial.println(srv6);

  delay(500);
  bakgel();
  bakgel();       // kontrol yapılmıyor sadece buffer daki bilgiler temizleniyor.
 delay(1000);

}


void setup() {
  Serial.begin(9600);        
   delay(500);
 
mySerial.begin(115200);
mySerial.println("AT+UART_CUR=9600,8,1,0,0");    // softserial 115200 kullanamadığı için açılışta ESP8266-01 haberleşmesi
                                                 // 9600 olarak çevrilip bundan sonra 
                                                // 9600 olarak haberleşilir. KApatılıp açılınca yine 115200 e döner. 
                                                // kalıcı yapılmak istenirse AT+UART_DEF=9600,8,1,0,0 yapılır ama tavsiye etmem 
                                                // kapatıp açınca 9600 de kalır ve sonrasında unuttuğunuzda problem var diye düşünüp arızalı diyebilirsiniz.                         
mySerial.begin(9600);
delay(200);
mySerial.println("AT");
delay(100);
bakgel();         // sadece AT komutu gönderiliyor kontrol yapılmıyor. 

  say2=1;
  prob=0;
 
  istemciac();
  
}


void loop() {       // ***********  Artık ESP istemci olarak ayarlanmıştır. sadece dataları ESP ye yollamaya başlar. 
say2=say2+1;        // sanki sıcaklık ölçüm değeri gibi bu değer değişkenlik sağlayıp PC ye gönderiliyor. 

TEKRAR_GONDER:          // Şayet AT+CIPSEND hata verirse buraya döner. aynı bilgiyi göndermeye çalışır. 


gonderbilgi="<tempretures>\r\n<Temp>"+String(say2)+"</Temp>\r\n"+"<Date>"+String(say2+1)+"</Date>\r\n"+"<Hour>"+String(say2+2)+"</Hour>\r\n</tempretures>\r\n"; 
delay(200);
say=gonderbilgi.length();
if (say==0){    // normalde olmaması gereken bir kontrol fakat bazen sabit bilgi bile olsa gonderbilgi boş olabiliyor. kontrol edip kaldırabilirsiniz. 
  delay(2000);    // atmega168 hafızasından dolayı hata yapmış olabilir. 
    goto TEKRAR_GONDER;
}

mySerial.print("AT+CIPSEND=0,");mySerial.println(say);  // bu komut kaç karakter gönderileceğini ESP ye bildiriyor. 
delay(500);
kont="OK";  // bu komuttan sonra OK bekleniyor. 
bakgel();   // geri bildirim alma kısmına gidiyor. 
 if (hata==1){
    
    delay(2000);
    Serial.println("CIPSEND HATA***********************");
    goto TEKRAR_GONDER;       // sunucu açık değilse hata verir. burada 5 kez deneyip  hata verirse, sonrasında kullanıcıyı uyar diyebilirsiniz. 
  }
kont="SEND OK";       //  gönderilen karakterler gönderildiğinde OK değil SEND OK ya da SEND FAIL döndürür. SEND OK kontrol edilir. 
mySerial.print(gonderbilgi);
         delay(500);
  bakgel();   

  Serial.print("HATA ve kont: "); Serial.print(hata,DEC);Serial.println(kont);
    if (hata==1){
    //  Serial.println("Tekrar gonderiliyor");
    delay(2000);
    goto TEKRAR_GONDER;
  }

  // DİKKAT Program ve data hafızasına ihtiyaç duyuluyorsa Serial print ile gösterilen anlık bilgi satırları iptal edilebilir. 
  // Bu satırlar data hafızasını oldukça dolduruyor. 
  
  
}

Arduino BAğlantı şeması :

Aşağıdaki PICBASIC programı PIC12F1822 entegresine aittir. İç osilatörü 32Mhz hızında kullanılmıştır. 271. 272. satırlardaki komutlar WHILE döngünüzde bir sayaç değeri kadar ESP den geri bildirim beklesin. Geri bildirim istenildiği gibi gelmezse, hata versin diye yazılmıştır. Bu satırlar olmasa hata verdiğinde while döngünüzde kilitlenir ve hata düzeltilemezdi.
WHILE döngülerinde böyle bir teknik kullanılması lazım yoksa sonsuz döngüye girer programınız reset atılmadıkça normale dönemezdi. PIC programında donanımsal seri port ESP01 in haberleşmesinde kullanılıyor. Yazılımsal seri port ise EASYLCD kontrollü LCD de bilgileri yazdırmak için kullanılmaktadır.

'****************************************************************
'*  Name    : ESP01_DATALOG                                     *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020                                *
'*          : All Rights Reserved                               *
'*  Date    : 08.02.2020                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

DEFINE OSC 32
 OSCCON = %11110000        '32mhz

#config    
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
  __config _CONFIG2, _WRT_OFF & _PLLEN_OFF & _LVP_OFF & _STVREN_OFF
#ENDCONFIG

CM1CON0 = 0

ADCON0=%00000000
ADCON1=%00000000 
ANSELA=0 ;ADC ler iptal
 TRISA=%00100000
 APFCON=%10000100
 
pause 500

SYMBOL RXPIN=porta.4 
SYMBOL TXPIN=porta.5
SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit


temp var byte
  sayhata   var word
sens_no    var byte
D var byte[40]

T   var byte
TMP_1   var byte
d1  var byte
d2  var byte
d3  var byte
h1  var byte
h2  var byte
h3  var byte
kont_kar    var byte
say2        var byte
don     var     byte
PS      var     byte
don=0
 say2=0
; donanımsal eusart 8mhz 9600 baud
;DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
;DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
;DEFINE HSER_CLROERR 1 ' Clear overflow automatically
;DEFINE HSER_SPBRG 51  ' 9600 Baud @ SPBRGH = 0
;BAUDCON.3 = 1         ' Enable 16 bit baudrate generator

; ********  32 mhz de   9600 baud 8 N 1 ****************
;DEFINE HSER_RCSTA 90h ; Enable serial port & continuous receive
;DEFINE HSER_TXSTA 24h ;' Enable transmit, BRGH = 0
;DEFINE HSER_CLROERR 1 ;' Clear overflow automatically
;DEFINE HSER_SPBRGH 3
;DEFINE HSER_SPBRGL 64         ;++++++++++++  SPBRG  L olmalı +++++++++++++++++++++
;BAUDCON= %01001000         ' Enable 16 bit baudrate generator

; ********  32 mhz de   115200 baud 8 N 1 ESP8266-01 için ****************

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 68  ' 115200 Baud @ SPBRGH = 0
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator


 ;goto yazdir
serOut2 porta.0,84, ["LCDDD"] 
pause 300
 
RCIE=1
PEIE=1
GIE=1
TEMP=RCREG

ON INTERRUPT GOTO KESME 
 
basla:
kont_kar=0
ATRST:
ps=1
hserout ["AT+RST" ,13,10] 
;call kontrol
pause 5000
;if don=0 then goto ATRST

pause 300
;call kesme
don=0
 
AT_code:
ps=2
serOut2 porta.0,84, ["LCDWR 2,3-SIRA:  ",DEC2 PS]
pause 200
 hserout ["AT",13,10]
 call kontrol
 if don=0 then 
; call kesme
 pause 300
 goto AT_code
 endif
 
 don=0
 pause 300

CWMODE:
ps=3 
serOut2 porta.0,84, ["LCDWR 2,3-SIRA:  ",DEC2 PS]
pause 200
 hserout ["AT+CWMODE=3",13,10]
 call kontrol
  if don=0 then goto CWMODE
  don=0
   pause 300

CIPMODE:
ps=4
serOut2 porta.0,84, ["LCDWR 2,3-SIRA:  ",DEC2 PS]
pause 200
 hserout ["AT+CIPMODE=0",13,10]
 call kontrol
 if don=0 then goto CIPMODE 
 don=0
     pause 300

CIPMUX;
ps=5 
serOut2 porta.0,84, ["LCDWR 2,3-SIRA:  ",DEC2 PS]
pause 200
 hserout ["AT+CIPMUX=1",13,10]
 call kontrol
  if don=0 then goto CIPMUX
  don=0
    pause 300

CWJAP:
PS=6
serOut2 porta.0,84, ["LCDWR 2,3-SIRA:  ",DEC2 PS]
pause 200
hserout ["AT+CWJAP=",34,"Guest_SSID_1_4A09",34,",",34,"guest1997",34,13,10]
;AT+CWJAP="Guest_SSID_1_4A09","guest1997"
  call kontrol
  if don=0 then goto CWJAP
  don=0
    pause 300

CIPSTART:
PS=7 
serOut2 porta.0,84, ["LCDWR 2,3-SIRA:  ",DEC2 PS]
pause 200 
hserout ["AT+CIPSTART=0",",",34,"TCP",34,",",34,"192.168.1.102",34,",","1001",13,10]
 
 call kontrol
  if don=0 then 
  pause 200
   serOut2 porta.0,84, ["LCDWR 1,1-NO TCP SERVER"]   ; eklendi
   pause 1000     ;eklendi
  goto CIPSTART
  endif        ;eklendi
  
  don=0
  serOut2 porta.0,84, ["LCDWR 1,1-TCP SRV CONNECT"]  ;eklendi
  pause 300

yazdir:
kont_kar=0
PS=8
;serOut2 porta.0,84, ["LCDWR 2,3-SIRA:  ",DEC2 PS]
 say2=say2+1
 d1=3
 d2=5
 d3=20
 
 h1=9
 h2=25
 h3=30
 sens_no=1
                                                                 
 tekrar:  
 ;mySerial.print("AT+CIPSEND=0,");mySerial.println(say);
Hserout ["AT+CIPSEND=0,",dec3 114,13,10] 
 call kontrol
  if don=0 then 
     pause 300
    goto tekrar ; bu tekrar sayısına göre sorun varsa close yapıp lcd ye hata yazdırabilirsiniz. 
  endif
    don=0
 ;                     23          2                            17        3                               2     1   2       3     2                      14      2     1   2       1    2                             23
kont_kar=1
Hserout ["<tempretures>",13,"<SENS_NO>",dec2 sens_no,"</SENS_NO>",13,"<Temp>",dec3 say2,"</Temp>",13,"<Date>",dec2 d1,".",dec2 d2,".20",dec2 d3,"</Date>",13,"<Hour>",dec2 h1,":",dec2 h2,":",dec2 h3,"</Hour>",13,"</tempretures>",13]
; burada gönderirken sensör numarasını da gönder. hangi sensörden gelirse gelsin kayıt yapsın. 
;hangi clienttan gelirse gelsin işlemler sensör numarasına göre işlenir ve rapor çıkarılır. 

call kontrol
  if don=0 then 
  goto tekrar
  endif
  
  don=0
  pause 200
serOut2 porta.0,84, ["LCDWR 2,1-Sensor: ",dec2 sens_no,"  ",DEC3 say2]
pause 300

goto yazdir  
 
 
 
  
DISABLE
KESME:  ; SERİ PORT KESMESİ
GIE=0
don=0
if kont_kar=0 then 
HSERIN 300,atla2, [WAIT("OK")] 
endif  
;  bu şekilde OK bekle geldiyse devam et. gelmediyse tekrar gönder. 
; 3 kez tekrarla şayet hala bozuksa problem bildir. 
if kont_kar=1 then 
HSERIN 300,atla2,[WAIT("SEND O"),D[0]]
endif

don=1
for t=1 to 40    ; bufferda kalanları temizliyor. 
 HSERIN 300,atla2,[D[t]]
  
next t
 
 
 ;hserout ["don",dec don,13,10]
atla2:
 ; hserout ["kesmede ",dec don,13,10]
    ;serOut2 porta.0,84, ["LCDWR 2,1-don:  ",dec1 don,HEX2 TMP_1]
TEMP=RCREG
GIE=1
return
enable


kontrol:
sayhata=0
;pause 100

  while don=0
 sayhata=sayhata+1
 if sayhata=65000 then return
   wend

 ;serOut2 porta.0,84, [ "LCDWR 1,1-",D[0],D[1],D[2],D[3],D[4],D[5],D[6],D[7],D[8],D[9],D[10],D[11],D[12],D[13],D[14],D[15],D[16],D[17],D[18],D[19],D[20],D[21],D[22],D[23],D[24],D[25],D[26],D[27],D[28],D[29],D[30],D[31],D[32],D[33],D[34],D[35],D[36],D[37],D[38],D[39],D[40]]
; pause 500    ; eklendi. 
return



end

PIC12F1822 devre şeması:

 

 

 

VİDEO LİSTESİ : PIC videosunda xml ve tcpserver ayrıntılı açıklanmıştır.
1-) Arduino ile birlikte çalışması. Bu videodan sonra PIC videosunu da izleyerek ayrıntıları görmelisiniz.
2-) PIC ile birlikte çalışması
3-) XML dosyaları ve  excel’e aktarılması. XML dosyalarını excel’e aktarma ayrıntılı video.
4-) TCP server programının çalışması. TCPserver programının ayrıntılı çalışması. 
5-) Visual Basic 6 ile yapılan program WIN8 ve WIN10 da nasıl çalıştırılır. TCP server programının win10 da çalıştırılması için izlemeniz gerekli.

Not: TCPserver programı VB6 ile yapılmıştır. Bu programın EXE dosyası bazı virüs programlarınca virüs olarak değerlendiriliyor. Kaynak dosyası da elinizde olacağından bilgisayarınıza VB6 programını yükleyerek yeniden EXE şekline çevirebilirsiniz.
Ayrıca bu program datalog.txt dosyasını oluşturur. Bunu oluşturmak için verilerin pencerede yazılmış olması gerekir. Pencereye gelen tüm datalar dosyaya yazılmaktadır.
Bu kısım PIC çalışma videosunda gösterilmiştir. İstediğiniz taktirde programda değişiklikler yaparak dosyanızın ismini değiştirebilirsiniz. Bazı ek bilgiler girebilirsiniz. Ben saat bilgilerini arduino okur dedim. Fakat RTC kullanmayacaksanız datanın geldiği bilgiye ek olarak PC nin saatini okuyup koyabilirsiniz. RTC ye ihtiyacınız kalmaz.
Arduino ve PIC programında isterseniz I2C harici eprom kullanıp, sunucuya ulaşılamadığında bilgileri bu eproma yazmak ve sonrasında sunucu bağlantısı sağlandığında bu bilgileri PC ye aktarmak gibi bir değişiklik yapabilirsiniz. Bunu yapacaksanız RTC nin arduino ile birlikte kullanılması kaçınılmazdır.

Not: VB6 programları 32 bit eski windowslara göredir. Bunu WIN10 ile çalıştırmak için 3 dosyayı C:\windows\system32 dizinine kopyalayıp aşağıdaki örnekteki gibi regsrv32 ile win 10 sisteminizin içine alınması gerekir. 32 bit standart olmayan OCX ve DLL programlarının win 8 ve üstüne tanıtılması bu şekildedir.
Buradan regsvr32 kullanımı için bilgi alabilirsiniz.

Tüm gerekli dosyalara buradan ulaşabilirsiniz. 

Arduino ile çalışma : 

PIC ile çalışma : 

XML Videosu : 

TCP SERVER Videosu :

VB6 ile yapılan TCP server programının WIN 10 ile çalıştırılması için izlenecek yol. 
 

1 Comment

  1. Elinize sağlık. Kendim uygulayabilmek için daha iyi bir altyapım ve zamanım olsun isterdim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir