HM-10 modülü ile BLE haberleşmesi

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
24,143
Benim çekmeceleri bugün biraz kurcaladım ve çok önce aldığım HM-10 modülünü buldum. Bununla BLE testi yapmak için interneti araştırınca şu sayfa çıktı:


Hemen oradaki sayfaya göre devreyi kurayım dedim. Kodu da aynen kopyaladım. Ama akıllı telefon uygulaması olarak sayfada verileni değil de google play'den şu BLE terminal uygulamasını yükledim:

 
Neyse programı derledim ve yükledim. Sistem hiç çalışmadı. Uzun lafın kısası, sayfada verilen bilgilerde bir sürü hata var. BLE Terminalden gönderdiğim hiçbir bilgi arduino'ya gitmiyor. Arduino'dan gönderilen bilgiler de terminale ulaşmıyor. Sonra programdaki gereksiz şeyleri çıkardım, UART pin bağlantıları yanlış verilmiş onu düzelttim, sonra haberleşme çalıştı.

IMG_20220427_212922.jpg
 
Kullandığım Arduino programı

C++:
#include <SoftwareSerial.h>

SoftwareSerial HM10(2, 3);

char rx_buffer[150];
unsigned int index = 0;

void setup()
{
  Serial.begin(115200);
  HM10.begin(9600);
}

void loop()
{
  HM10.listen();
  while (HM10.available() > 0)
  {
    char data = HM10.read();
    if (index < (sizeof(rx_buffer) - 1))
    {
      rx_buffer[index++] = data;
      if (data == '\n')
      {
        rx_buffer[index++] = '\0';
        Serial.println(rx_buffer);
        index = 0;
      }
    }
  }

  if (Serial.available())
  {
    HM10.write(Serial.read());
  }
}
 
Bu modülden ben de de 3-4 tane var Bluetooth bağlantı sevmediğim için çok kulanmiyorum
 
Neyse programı derledim ve yükledim. Sistem hiç çalışmadı. Uzun lafın kısası, sayfada verilen bilgilerde bir sürü hata var. BLE Terminalden gönderdiğim hiçbir bilgi arduino'ya gitmiyor. Arduino'dan gönderilen bilgiler de terminale ulaşmıyor. Sonra programdaki gereksiz şeyleri çıkardım, UART pin bağlantıları yanlış verilmiş onu düzelttim, sonra haberleşme çalıştı.

17045 eklentisine bak
Bu orjinal HM-10
Şuan pek bulunmuyor piyasada.
 
Yalnız bu modül sadece AT komutunu kabul ediyor, ona da yalnış cevap veriyor. Diğer hiçbir AT komutunu kabul etmiyor. Herhalde bundaki firmware güncellenecek.
 
Abi Şöyle denedin mi
AT+NAME?

AT+BAUD?
 
Hepsine ERROR diyor dangalak.
 
Hepsine ERROR diyor dangalak.
O zaman benim engin tecrübemden istifade edip update yapacaksın :katil1:

 
Abi bana da esp01 öyle diyip duruyodu chip en pinini lojik 1 yapmak lazımmış uykusundan uyanıp cevap vereye tenezzül etmesi için belki seninkide en pinine birşeyler bekliyordur

Uyku modunda olsa haberleşme çalışmazdı herhalde. Haberleşme iyi çalışıyor

a.jpg


1651092359680.png
 
Son düzenleme:
Bu da arduinodan terminale

1651093104112.png


a.jpg
 
Kullandığım Arduino programı

C++:
#include <SoftwareSerial.h>

SoftwareSerial HM10(2, 3);

char rx_buffer[150];
unsigned int index = 0;

void setup()
{
  Serial.begin(115200);
  HM10.begin(9600);
}

void loop()
{
  HM10.listen();
  while (HM10.available() > 0)
  {
    char data = HM10.read();
    if (index < (sizeof(rx_buffer) - 1))
    {
      rx_buffer[index++] = data;
      if (data == '\n')
      {
        rx_buffer[index++] = '\0';
        Serial.println(rx_buffer);
        index = 0;
      }
    }
  }

  if (Serial.available())
  {
    HM10.write(Serial.read());
  }
}

Bu kodu referans alarak kullandığım işlemci için bir kod yazdım. Arduino ile deneme yaptığımda modül AT komutlarına cevap verdi yani çalışıyor. Fakat kendi işlemcim ile çalıştırmayı denediğimde henüz iletişim kuramadım. Kullandığım işlemci MS51FB9AE. Nuvoton'un yapmış olduğu 8051 mimarili bir işlemci.

C:
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* SPDX-License-Identifier: Apache-2.0                                                                     */
/* Copyright(c) 2020 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include "ms51_16k.h"

#define STATE_DELAY_TIME       1000
#define RECEIVE_DATA_LENGTH     30

// Global variables
volatile uint16_t systemTick = 0;

uint8_t state = 0;
uint16_t stateFirstTime = 0;
uint16_t stateSecondTime = 0;

volatile uint8_t rxBuffer[RECEIVE_DATA_LENGTH];
volatile uint8_t index = 0;

/************************************************************************************************************/
/* PROTOTYPES                                                                                                                  */
/************************************************************************************************************/
void timer_1ms_init();
uint16_t millis();

void UART_Init(void);
void analyse_data(char*);


/************************************************************************************************************/
/* ISR FUNCTIONS                                                                                                          */
/************************************************************************************************************/
void Timer2_ISR (void) interrupt 5        // Vector @  0x2B
{
_push_(SFRS);
        systemTick++;
    clr_T2CON_TF2;
_pop_(SFRS);
}

void SerialPort1_ISR(void) interrupt 15
{
    _push_(SFRS);
 
    if (RI_1)
        {
            uart1_receive_data = SBUF_1;
            if (index < RECEIVE_DATA_LENGTH - 1)
            {
                rxBuffer[index++] = uart1_receive_data;
                if (uart1_receive_data == '\n')
                {
                    rxBuffer[index] = '\0';
                    analyse_data(rxBuffer);
                    index = 0;
                }
            }
            
            RI_1 = 0;
        }

    if (TI_1)
    {
                TI_1 = 0;
    }

    _pop_(SFRS);
}

/************************************************************************************************************/
/* FUNCTION_PURPOSE: Main Loop                                                                              */
/************************************************************************************************************/
void main (void)
{
        // Init functions
    MODIFY_HIRC(HIRC_24);
    Enable_UART0_VCOM_printf_24M_115200();
    UART_Init();
    timer_1ms_init();        // led blink on electronic board
        
    P12_PUSHPULL_MODE;
    P12 = 1;
    ENABLE_GLOBAL_INTERRUPT;
    
    
    while(1)
        {
            switch(state)
            {
                case 0:
                {
                    state = 1;
                }break;
                
                case 1:
                {
                    stateFirstTime = millis();
                    // printf("stateFirstTime = %u\r",stateFirstTime);
                    state = 2;
                }
                case 2:
                {
                    stateSecondTime = millis();
                    // printf("stateSecondTime = %u\n",stateSecondTime);
                    if (stateSecondTime - stateFirstTime > STATE_DELAY_TIME)
                    {
                        P12 ^= 1;
                        state = 0;
                    }
                }
            }
        }

}


/************************************************************************************************************/
/* TIMER RELATED FUNCTIONS                                                                                        */
/************************************************************************************************************/
void timer_1ms_init()
{
    // Timer2_AutoReload_Interrupt_Initial(24,300000);
        TIMER2_DIV_128;
    TIMER2_Auto_Reload_Delay_Mode;
    RCMP2L = TIMER_DIV128_VALUE_1ms_FOSC_24000000;
    RCMP2H = TIMER_DIV128_VALUE_1ms_FOSC_24000000 >> 8;
    TL2 = 0;
    TH2 = 0;

    set_ET2;    // Set timerinterrupt
    set_TR2;    // Start timer
}

uint16_t millis()
{
    return systemTick;
}


/************************************************************************************************************/
/* UART RELATED FUNCTIONS                                                                                          */
/************************************************************************************************************/
void UART_Init(void)
{
    P16_QUASI_MODE;
    P02_INPUT_MODE;
    UART_Open(24000000, UART1_Timer3 , 9600);
    ENABLE_UART1_INTERRUPT;
}

void analyse_data(char* buffer)
{
    int i = 0;
    
    while (buffer[i] != '\0')
    {
        printf("%X", buffer[i]);
        i++;
    }
    
    printf("\r\n");
    
    index = 0;
}

Yazdığım kodda bir sorun var mı? Yoksa Putty'den vs. kaynaklanan bir hata olabilir mi burada? Donanımsal olarak da HM-10'un RX pinine bir gerilim bölücü koydum 3.3 volt seviyesinde tutmak için.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,956
Mesajlar
118,801
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top