ESP8266 Wifi Module Örnek Uygulama

Başlatan MrDarK, 01 Kasım 2014, 11:47:01

MrDarK

Merhaba arkadaşlar ;

Bir insan söz verdiğinde onu tutmalı diyerekten zaman daraltarak söz verdiğim projenin örnek demosunu sonunda tamamlayabildim. Bahsettiğim konuya ait link https://www.picproje.org/index.php/topic,55311.0.html

İlerleyen zamanlarda bu modülle ilgili yine bu konu üzerinde farklı çalışmalara ait kodlar paylaşacağım. Bu örneğimizde www.picproje.org sayfasına index atıp gelen verileri alıyoruz. Çok uzun olduğu için gelen response un son kısmını kesip atacağım.

Öncelikle modül hakkında bilgilendirme için aşağıdaki linkden faydalanabilirsiniz.
Link : www.space.nl/ESP8266


Burada önemli bir detay var. CH_PD pinini de VCC pini ile birleştirin.
Ekstra olarak RST pinini ben STM'ye bağladım. Debug işlemlerinde gir çık yaparken reset almasını istiyordum bağlanmasını öneririm.

Devre şemasını ise şu şekilde kurdum ;

Yazılım STM32F4 Discovery'e uygun olup derleyici olarak gcc ide olarak emblocks kullanılmıştır.

/*****************************************************************************
*
* File Name        : ESP8266_Example.c
*
* Description      : ESP8266 Modulune ait uygulamalar
*
* Author           : Picproje & MrDarK
*
* Additional Information :
*
*******************************************************************************/

#include "stm32f4xx_conf.h"
#include <stdio.h>
#include <string.h>

#define ESP8266BUFFER_LENGHT 500

char g_arrui8ESP8266Buf[ESP8266BUFFER_LENGHT];
static uint16_t ESPWriteIndex=0;

/***********************************************************
* Function Name  : Clear_ESPBuffer
* Description    : Buffer temizlenir.
* Input          : None
* Return         : None
***********************************************************/
static void Clear_ESPBuffer(void)
{
    uint16_t i;

    for(i=0;i<ESP8266BUFFER_LENGHT;i  )
        g_arrui8ESP8266Buf[i] = 0;

    ESPWriteIndex=0;
}
/***********************************************************
* Function Name  : Delay
* Description    : Yazılımsal Gecikme Fonksiyonu.
* Input          : Gecikme Degeri
* Return         : None
***********************************************************/
void Delay(__IO uint32_t nCount) {
  while(nCount--) {
  }
}

/***********************************************************
* Function Name  : USART_puts
* Description    : Girdiðimiz cümle ilgili buffer'dan çýkar.
* Input          : USARTx
* Return         : None
***********************************************************/
void USART_puts(USART_TypeDef* USARTx, volatile char *s)
{
	while(*s){
		// wait until data register is empty
		while( !(USARTx->SR & 0x00000040) );
		USART_SendData(USARTx, *s);
		*s  ;
	}
}

/***********************************************************
* Function Name  : Usart_InitializeHW
* Description    :
* Input          : None
* Return         : None
***********************************************************/
void Usart_InitializeHW(void)
{
    GPIO_InitTypeDef     GPIO_InitStruct;

    // B Portuna Clock Verilir
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

    /**
    * PB6 ve PB7 Pinleri alternatif fonksiyon olarak çalýþacaðý tanýmlanýr
    * @onemli Usartý aktif etmeden önce çaðrýlmalýdýr.!
    */
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1); //	TX()
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1); //	RX()
    // Initialize pins as alternating function
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); //	TX()
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3); //	RX()
    // Initialize pins as alternating function
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_ResetBits(GPIOB,GPIO_Pin_13);
}

/***********************************************************
* Function Name  : Usart_InitializeAp
* Description    :
* Input          : None
* Return         : None
***********************************************************/
void Usart_InitializeAp(void)
{
    USART_InitTypeDef USART_InitStruct;
    NVIC_InitTypeDef NVIC_InitStructure;
    /**
     * USART1 modülüne Clock verilir.
     */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    /**
     * USART3 modülüne Clock verilir.
     */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

    /**
     * Baudrate 115200
     * Hardware Flow Kapali
     * Usart Full-Duplex çalisacak TX ve RX modu aktif edilir.
     * Parity Kullanmiyoruz.
     * 1 stop byte mevcut
     * Data bit uzunlugumuz 8
     *
     * USART1 Kurulup
     * Aktif edilir.
     */
    USART_InitStruct.USART_BaudRate = 115200;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART1, &USART_InitStruct);

    USART_InitStruct.USART_BaudRate = 115200;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Tx;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART3, &USART_InitStruct);
    USART_Cmd(USART3, ENABLE);  // USART3 aktif edilir.

	/* USART1 Rx interrupt aktif ediliyor
	 * USART'dan herhangi bir data geldiginde
	 * USART1_IRQHandler() adiyla isimlendirdigimiz fonksiyona gider
	 */
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // USART1 Rx interrupt aktif ediliyor

	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;		 // USART1 interrupt ina ince ayar vermek istiyoruz.
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// Öncelik olarak bu interrupt kaynagina 0 veriyoruz. ( 0 yazarak En öncelikli kaynak yapiyoruz )
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		 // Kendi bagli olduðu vektordeki alt grup içinde de en öncelikli olarak kurduk
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			 // USART1 interrupt kanali aktif edilir.
	NVIC_Init(&NVIC_InitStructure);							 // Yaptigimiz ayarlari NVIC birimine yüklüyoruz.

    USART_Cmd(USART1, ENABLE);  // Nihayetinde USART1 aktif edilir.
}

/***********************************************************
* Function Name  : ESP8266_Init
* Description    : Modül bir aga baglanana kadar burada kalir.
* Input          : None
* Return         : None
***********************************************************/
static void ESP8266_Init(void)
{
    static uint8_t ESPInitCase=0;

    // Modul Reset Pini High yapiliyor.
    GPIO_SetBits(GPIOB,GPIO_Pin_13);

    switch(ESPInitCase)
    {
        case 0:
            // Standart AT Komutu gonderilir , Cevabi OK olmalidir.
            USART_puts(USART1,"ATrn");
            // 1 saniye gecikme koyuyoruz.
            Delay(1000000L);
            ESPInitCase = 1;
        break;

        case 1:
            // STRSTR fonksiyonu metin icinde metin arayan bir fonksiyondur
            // Eger aranilan metni bulabilirse pointer adresi ile geri donus yapar
            // Bulamaz ise NULL dondurur. Bizde null'dan farklı mı diye sorariz.
            if (strstr(g_arrui8ESP8266Buf,"OK") != NULL)
            {
                Clear_ESPBuffer();
                USART_puts(USART3,"Module Erisildi");
                ESPInitCase = 2;
            }
            else
            {
                Clear_ESPBuffer();
                USART_puts(USART3,"Modul Bulunamadi, Tekrar Deneniyor");
                ESPInitCase = 0;
            }
        break;

        case 2:
            // Modulun 3 modu var gerekli bilgi datasheet'de biz 1 olmasini istiyoruz
            USART_puts(USART1,"AT CWMODE?rn");
            // 1 saniye gecikme koyuyoruz.
            Delay(1000000L);
            ESPInitCase = 3;
        break;

        case 3:
            // Gelen cevap mode 1 'mi
            if (strstr(g_arrui8ESP8266Buf," CWMODE:1") != NULL)
            {
                Clear_ESPBuffer();
                USART_puts(USART3,"MODE Ayar Dogru");
                ESPInitCase = 4;
            }
            else
            {
                // Fabrika ayarları olarak 2 geliyor biz onu 1 yapip reset komutu ile tamamlariz.
                USART_puts(USART1,"AT CWMODE=1rn");
                USART_puts(USART1,"AT RSTrn");
                Delay(1000000L);

                Clear_ESPBuffer();
                USART_puts(USART3,"MOD Degistirilir.");
                ESPInitCase = 0;
            }
        break;

        case 4:
            // Baglanilacak olan wifi agina ait kullanici adi ve sifre girisi yapilir.
            USART_puts(USART1,"AT CWJAP="MrDarK","sifreniz"rn");
            // 1 saniye gecikme koyuyoruz.
            Delay(2000000L);
            ESPInitCase = 5;
        break;

         case 5:
             // Baglanti saglandiginde OK Cevabi alinir
            if (strstr(g_arrui8ESP8266Buf,"OK") != NULL)
            {
                Clear_ESPBuffer();
                USART_puts(USART3,"Modeme Baglanti yapildi");
                ESPInitCase = 6;
            }
            else
            {
                Delay(1000000L);
                USART_puts(USART3,"Baglanti Bekleniyor.");
            }
        break;

        case 6:
            // IP adresi nedir diye soruyoruz ?
            USART_puts(USART1,"AT CIFSRrn");
            // 1 saniye gecikme koyuyoruz.
            Delay(1000000L);
            ESPInitCase = 7;
        break;

        case 7:
            // IP alana kadar error bilgisi gonderir. Onu ayırırız. =)
            if (strstr(g_arrui8ESP8266Buf,"ERROR") == NULL)
            {
                USART_puts(USART3,"Alinan IP = ");
                // Gelen bilginin 11.karakterinden itibaren IP adresi yaziyor.
                USART_puts(USART3,&g_arrui8ESP8266Buf[11]);
                Clear_ESPBuffer();
                ESPInitCase=8;
            }
            else
            {
                // ERROR der ise tekrar dene 
                Delay(1000000L);
                USART_puts(USART3,"Tekrar Dene.");
                Clear_ESPBuffer();
                ESPInitCase=6;
            }

        break;

        case 8:
            // Baglanilacak siteye ait bilgiler girildi.
            USART_puts(USART1,"AT CIPSTART="TCP","www.picproje.org",80rn");
            // 1 saniye gecikme koyuyoruz.
            Delay(1000000L);
            ESPInitCase = 9;
        break;

        case 9:
            // Baglanti kuruldugunda Linked diye bir cevap aliriz.
            if (strstr(g_arrui8ESP8266Buf,"Linked") != NULL)
            {
                Clear_ESPBuffer();
                USART_puts(USART3,"Server ile baglanti kuruldu");
                ESPInitCase = 10;
            }
            else
            {
                // Cevap gelene kadar bekler
                Delay(1000000L);
                USART_puts(USART3,"Baglanti Bekleniyor.");
            }
        break;

        case 10:
            // Artık HTTP Request bilgimizi gonderebiliriz.
            // CIPSEND ile kac byte bilgi gondereceksek o kadar yazarız.
            USART_puts(USART1,"AT CIPSEND=100rn");
            // Komutu verdikten sonra bize '>' bilgisi geliyor. 
            Delay(1000000L);
            // HTTP Request Hazirlanir.
            USART_puts(USART1,"GET / HTTP/1.1rn");
            USART_puts(USART1,"Host: [url=https://www.picproje.orgrn]www.picproje.orgrn[/url]");
            USART_puts(USART1,"Accept: */*rn");
            USART_puts(USART1,"Content-Type: text/htmlrn");
            USART_puts(USART1,"Content-Length: 0rnrnrn");
            
            // Buradan sonra http request'e gelen cevaplari degerlendirerek
            // Ne yapmak istiyorsanız onu yapabilirsiniz =)
            // Herkese bol sanslar ! Iyi gunler efenim.
            while(1);
        break;

    }
}

int main(void)
{
    // System Clock Init Edilir.
    SystemInit();
    // Usart modullerinin portlarının hardware ayarlari yapilir.
    Usart_InitializeHW();
    // Usart modullerinin clock , baud ve interrupt ayarlari yapilir.
    Usart_InitializeAp();
    // Giris metnimiz =)
    USART_puts(USART3,"MrDarK & PicProje ESP8266 Example Starting..! rn");
    // Komut gondermeden once module ait bufferı temizleriz.
    Clear_ESPBuffer();

    while(1)
    {
        // Bakmayın init yazdığına her biseyi yapiyor =)
        ESP8266_Init();
    }


}

// USART1 interrupt Alt Programi
void USART1_IRQHandler(void){
    // USART1 RX interrupt flag kontrol edilir.
    if( USART_GetITStatus(USART1, USART_IT_RXNE) )
    {
        uint8_t Received_Byte = USART1->DR; // Gelen bilgi değişken içine alinir.
        USART3->DR = Received_Byte;         // Debug monitor icin ayni bilgi usart3'e gonderilir.
        
        // Strstr fonksiyonu için eklendi, modülden null karakteri gelebiliyordu , onu engellemis olduk.
        if(Received_Byte != 0)
        {
            g_arrui8ESP8266Buf[ESPWriteIndex] = Received_Byte;
            ESPWriteIndex  ;
        }

    }
}


HTTP Request işleminden ufak bir parça :)

IPD,1024
Modul bize bilgileri 1024 1024 veriyor.

IPD ise karşıdan gelen bilgi olduğunu söylüyor.

AT CIPSEND=100

> GET / HTTP/1.1
Host: [url=https://www.picproje.org]www.picproje.org[/url]
Accept: */*
Content-Type: text/html
Content-Length: 0


busy

SEND OK

 IPD,1024:
HTTP/1.1 200 OK
Date: Sat, 01 Nov 2014 09:26:27 GMT
Server: Apache/2.2.26 (Unix) mod_ssl/2.2.26 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
X-Content-Type-Options: nosniff
Pragma: no-cache
Cache-Control: private
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Vary: Accept-Encoding
Set-Cookie: PHPSESSID=0590f04caeb7a8b7afa2c7d692fc8248; path=/; domain=.picproje.org
Last-Modified: Sat, 01 Nov 2014 09:26:28 GMT
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<link rel="stylesheet" type="text/css" href="http://picproje.org//Themes/default/css/index.css?fin20" />
	<script type="text/javascript" src="http://picproje.org//Themes/default/scripts/script.js?fin20"></script>
	<script type="text/javascript"


Yazılım dosyalarına erişmek için Link : https://drive.google.com/file/d/0B2Ja5iH4DRMGNy1QZDBhb21MVHc/view?usp=sharing
Picproje Eğitim Gönüllüleri ~ MrDarK

ArifAhmet

#1
Elinize, emeğinize sağlık hocam.

mesaj birleştirme:: 01 Kasım 2014, 18:04:23

strstr

Hocam aradığım fonksyion buydu. Bende nasıl gelen cevabı alıp işleyecem diyordum. Yaşasın hazır fonksiyonlar. Tekrar çok sağolun.
Yaşasın Open Source!

muhittin_kaplan


Gökhan BEKEN

Özel mesaj okumuyorum, lütfen göndermeyin.

baran123


MrDarK

Yorumlarınız için çok teşekkür ederim :)

CCS için yldzelektronik'e bu modülden verdim sözü var baskı yapın açsın konuyu :)
Picproje Eğitim Gönüllüleri ~ MrDarK

yldzelektronik

Alıntı yapılan: MrDarK - 23 Kasım 2014, 10:49:15
Yorumlarınız için çok teşekkür ederim :)

CCS için yldzelektronik'e bu modülden verdim sözü var baskı yapın açsın konuyu :)

Yapıcam ancak pic için elimde hiçbir donanım şuanda yok.Pcb için bekliyorum ben de.Eğer elinde ufak da olsa board olan varsa hemen geçebilirim.Ama deneme yapmadan kodları ccsye uyarlaya da bilirim.İki ihtimal seçin;

Ya donanım için yardımcı olun veya bekleyin donanımı hazırliim koddan emin olup öyle paylaşim (Aslında donanım dediğimde öyle abartılı bişey yok.Elimde hiç pic mcu yok.Ne kit ne ufak board.).
Ya da verilmiş uygulamalardan ccs için çeviriim.Herhangi bir mcu için yapabilirim.İster 18f serisi ister 16f serisi.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Recep METE

Alıntı yapılan: yldzelektronik - 24 Kasım 2014, 08:08:00
Yapıcam ancak pic için elimde hiçbir donanım şuanda yok.Pcb için bekliyorum ben de.Eğer elinde ufak da olsa board olan varsa hemen geçebilirim.Ama deneme yapmadan kodları ccsye uyarlaya da bilirim.İki ihtimal seçin;

Ya donanım için yardımcı olun veya bekleyin donanımı hazırliim koddan emin olup öyle paylaşim (Aslında donanım dediğimde öyle abartılı bişey yok.Elimde hiç pic mcu yok.Ne kit ne ufak board.).
Ya da verilmiş uygulamalardan ccs için çeviriim.Herhangi bir mcu için yapabilirim.İster 18f serisi ister 16f serisi.

Hocam, ccs c ye çevirdikten sonra proteusta deneme yapma şansınız yok mu?
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

yldzelektronik

Alıntı yapılan: semfero - 24 Kasım 2014, 10:06:45
Hocam, ccs c ye çevirdikten sonra proteusta deneme yapma şansınız yok mu?

Modül proteusta olmadığından öyle bir imkan yok malesef.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

elektronik

resimdeki pcb uygunsa gönderebilirim.

Selim Koç arkadaşımızdan almıştım.



yldzelektronik

Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

elektronik


yldzelektronik

Gören biri wordpress dışında bir yere upload edebilir mi?Ben bazı sayfaları görüntüleyemiyorum.Firewall var.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

vitruvius

Alıntı yapılan: yldzelektronik - 24 Kasım 2014, 14:02:00
Gören biri wordpress dışında bir yere upload edebilir mi?Ben bazı sayfaları görüntüleyemiyorum.Firewall var.

http://oi57.tinypic.com/3166qhf.jpg

Tinypic de olmuyorsa olan bir yer söyleyin oraya yükleyeyim hocam.

Kabil ATICI

@elektronik
Neden o kadar büyük resim koyuyorsun ki?
Forumdaki herkesin bağlantı hızı aynı değil.

Aynı zamanda kendi blog'un kotasını da boşu boşuna dolduruyorsun. Normalde baskı almıyorsan o kadar yüksek çözünürlüğe ihtiyacın yok. Çok ince ayrıntı olmadıkça 800x600 çözünürlük yeterde artar, ki iş sadece  ürünü göstermek ise 320x240 bile yeterli.

İnternet sayfası ile uğraşan biri olarak resim düzenleme programlarından birini öğrenmen yerinde olur.
Tabii olay senin bileceğin iş...
ambar7