查看: 490|回復: 4
打印 上一主題 下一主題

[項目] 藍牙串口助手 1.3 beta 1測試版

[復制鏈接]
  • TA的每日心情
    慵懶
    2019-12-23 17:45
  • 簽到天數: 6 天

    [LV.2]偶爾看看I

    跳轉到指定樓層
    樓主
    發表于 2020-1-18 23:57 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

    在之前版本的基礎上增加了視覺相關功能:

    顏色跟蹤模式及人臉跟蹤模式,

    增加了發送hex格式命令功能;

    貼幾張圖:

    主要是將檢測區域的中心坐標以及檢測區域的大?。ò霃?寬高)發送給下位機

    安卓端的檢測:




    下位機的接受處理:


    然后hex格式發送以及下位機的接收處理,(之前發送字符串功能依然保留)





    下位機的接收處理:


    下位機處理部分主要是幾個回調函數,解析部分做成庫了,便于使用



    然后app還增加了反饋功能,有什么bug和建議可以提交一下,也可以檢查更新,樓主也不確定什么時候更新

    代碼部分,現在為了調試,用了軟串口接收數據,自帶串口作為打印輸出,可以修改,也不麻煩

    然后app下載連接:百度云的

    鏈接:https://pan.baidu.com/s/1F9kGKFXjY1ECTw52p5HRZQ
    提取碼:28gu


    還有arduino的庫和例子:

    CvTracking.zip (14.75 KB, 下載次數: 2)

    最后貼點代碼吧:

    ino部分:

    kittenblock中小學創客名師推薦的圖形化編程軟件

    #include "RtBle.h"
    
    #define BAUD 9600
    #define PORT 0
    
    RtBle ble;
    
    void strCall(String str)
    {
            printf("data: %s \n", str.c_str());
    
            ble.ReturnStr("i am ok");
    }
    
    void hexCall(uint16_t intt)
    {
            printf("%x ", intt);
    
    }
    
    void posCall(uint16_t cx, uint16_t cy, uint16_t rd)
    {
            printf("cx: %d, cy: %d, rd: %d \n", cx, cy, rd);
    }
    
    void setup()
    {
            //初始化
            ble.InitPrintSerial(BAUD);
            ble.InitReadSerial(BAUD);
            ble.InitPrintf(); //初始化printf輸出
    
            //設置回調//可在回調函數中根據所得數據進行相應操作
            ble.fun.strCallBack = strCall;
            ble.fun.hexCallBack = hexCall;
            ble.fun.posCallBack = posCall;
    
    }
    
    void loop()
    {
            //讀取數據
            ble.ReadBytes();
            //ble.ReadStr();
    
    }



    庫頭文件:

    kittenblock中小學創客名師推薦的圖形化編程軟件

    #pragma once
    #ifndef _RT_BLE_H
    #define _RT_BLE_H
    
    //#define DEBUG
    
    #include <Arduino.h>
    #include <HardwareSerial.h>
    #include "SoftwareSerial.h"
    
    //app返回數據格式
    
    //一、直接發送字符串,以 \r\n 結尾讀取
    
    //二、含標志位數據格式如下
    /**
    
    數據頭:F0 - 1字節
    
    模式標志:0x01 | 0x02 | 0x03 - 跟蹤模式 | 按鍵發送hex | 命令行發送hex - 1字節
    
    數據區
     ————
    |
    |每個數據3字節
    |
    |app當前最大返回整數 9999 對應bcd碼 1001 1001 1001 1001 
    |只為跟蹤模式下返回坐標,坐標實際沒有這么大,分辨率當前最大可設置為 1280 x 720
    |
     ————
    數據區
    
    數據尾:FF - 1字節
    
    如有問題:可以使用app反饋功能提交修改建議
    
    (*^_^*)
    
    */
    
    //數據頭
    #define DATA_HEAD (byte)0xf0
    //數據尾
    #define DATA_TAIL (byte)0xff
    //默認接收模式為以/r/n結束的字符串
    #define MODE_DEFAULT -1
    //跟蹤模式//返回位置信息,中心點坐標(x,y),跟蹤區域直徑或寬度d
    #define MODE_TRACK (byte)0x01
    //按鍵發送HEX模式
    #define MODE_KEY (byte)0x02
    //命令行發送HEX模式
    #define MODE_CMD (byte)0x03
    //超時時間 
    #define TIME_OUT 5000;
    
    static HardwareSerial *myPrintSerial;
    
    //回調函數
    typedef struct
    {
            void(*strCallBack)(String str);
            void(*hexCallBack)(uint16_t intt);
            void(*posCallBack)(uint16_t cx, uint16_t cy, uint16_t rd);
    }RtBleCallBack;
    
    class RtBle
    {
    public:
            RtBle();
            ~RtBle();
            void
    
                    //默認使用Serial作為打印輸出串口
                    InitPrintSerial(uint16_t baud),
    
                    //軟串口默認使用 6, 5 引腳, rx: 6 ; tx: 5 //與藍牙模塊交叉相連 //作為讀取數據串口
                    InitReadSerial(uint16_t baud, uint8_t rx = 6, uint8_t tx = 5), 
    
                    //初始化Printf輸出
                    InitPrintf(void),
    
                    //串口返回字符串
                    ReturnStr(String str);
    
            bool
                    
                    //按標志位讀取
                    ReadBytes(),
    
                    //按 \r\n 結尾讀取
                    ReadStr();
    
            RtBleCallBack fun;
    
    private:
            String revData;
            uint8_t revBytes[128];
            byte mode_bit; //模式標志位
            int bytesLen;
    
            bool isReadComplete;
            SoftwareSerial *myReadSerial;
            unsigned long time;
    };
    
    #endif // !_RT_BLE_H
    


    cpp部分:

    kittenblock中小學創客名師推薦的圖形化編程軟件

    #include "RtBle.h"
    
    uint16_t power(uint16_t base, int times)
    {
            int i;
            uint16_t rslt = 1;
            for (i = 0; i < times; i++)
            {
                    rslt *= base;
            }
    
            return rslt;
    }
    
    //bcd轉dec
    uint16_t BcdToDec(uint8_t * bcd, int length)
    {
            int i;
            uint16_t tmp, k;
            uint16_t dec = 0;
            uint8_t k_bit = *(bcd + 2);
    
            switch (k_bit)
            {
            case 0x00:
                    k = 1;
                    break;
            case 0x01:
                    k = 10;
                    break;
            case 0x02: //
                    k = 100;
                    break;
            }
    
            for (i = 0; i < length - 1; i++)
            {
                    tmp = ((bcd >> 4 & 0x0F) * 10 + (bcd & 0x0F));
                    dec += tmp * power(k, length - 2 - i);
            }
            return dec;
    }
    
    RtBle::RtBle()
    {
            this->isReadComplete = false;
            this->bytesLen = 0;
    }
    
    RtBle::~RtBle()
    {
            delete revBytes;
    }
    
    void RtBle::InitPrintSerial(uint16_t baud)
    {
            //默認串口0作為打印輸出串口
            myPrintSerial = &Serial;
            myPrintSerial->begin(baud);
            myPrintSerial->println(F("**************begin**************"));
    }
    
    void RtBle::InitReadSerial(uint16_t baud, uint8_t rx, uint8_t tx)
    {
            //軟串口讀取
            myPrintSerial->println(F("read data from software serial"));
            myReadSerial = new SoftwareSerial(rx, tx);
            myReadSerial->begin(baud);
    }
    
    bool RtBle::ReadStr()
    {
            if (myReadSerial->available())
            {
                    //以\r\n結尾讀取
                    revData = myReadSerial->readStringUntil('\n');
                    revData.trim(); //去除首尾空格
    
                    if (revData.length())
                    {
                            fun.strCallBack(revData);
                            return true;
                    }
            }
            return false;
    }
    
    bool RtBle::ReadBytes()
    {
            if (myReadSerial->available())
            {
                    //按標志讀取
                    if (myReadSerial->read() == DATA_HEAD)
                    {
                            this->time = millis() + TIME_OUT;
                            this->isReadComplete = false;
                            this->bytesLen = 0;
    
                            while(millis() < time)
                            {
                                    if (myReadSerial->available())
                                    {
                                            byte tmp = myReadSerial->read();
    
                                            if (tmp == DATA_TAIL)
                                            {
                                                    this->isReadComplete = true;
                                                    break;
                                            }
    
                                            revBytes[bytesLen] = tmp;
                                            bytesLen++;
                                    }
                            }
    
                            mode_bit = revBytes[0];
                    }
    
                    //讀取完成
                    if (this->isReadComplete)
                    {
    #if defined(DEBUG)
                            for (int i = 1; i < bytesLen; i++)
                            {
                                    Serial.println(revBytes);
                            }
    
                            this->isReadComplete = true;
                            return true;
    #endif
    
                            //判斷模式
                            switch (mode_bit)
                            {
                            case MODE_TRACK:
                                    fun.posCallBack(
                                            BcdToDec(&revBytes[1], 3), //每個數據3字節
                                            BcdToDec(&revBytes[4], 3),
                                            BcdToDec(&revBytes[7], 3)
                                    );
                                    break;
                            case MODE_KEY:
                            case MODE_CMD:
                                    myPrintSerial->print(F("data: "));
                                    for (int i = 1; i < bytesLen; i += 3)
                                    {
                                            fun.hexCallBack(
                                                    BcdToDec(&revBytes, 3)
                                            );
                                    }
                                    myPrintSerial->println();
                                    break;
                            }
    
                            isReadComplete = false;
                            return true;
                    }
    
            }
    
            return false;
    
    }
    
    void RtBle::ReturnStr(String str)
    {
            //軟串口簡單輸出數據
            //app目前只接受以 "\n" 結尾的數據
            //以 \n 結尾
            myReadSerial->print(str + "\n");
    }
    
    int serial_putc(char c, struct __file *)
    {
            myPrintSerial->write(c);
            return c;
    
    }
    
    void RtBle::InitPrintf(void)
    {
            fdevopen(&serial_putc, 0);
    }
    
    

  • TA的每日心情
    無聊
    2020-2-10 21:06
  • 簽到天數: 3 天

    [LV.2]偶爾看看I

    沙發
    發表于 2020-1-20 22:08 | 只看該作者
    樓主! JDY-10M 藍牙模塊無法連接!
  • TA的每日心情
    慵懶
    2019-12-23 17:45
  • 簽到天數: 6 天

    [LV.2]偶爾看看I

    板凳
     樓主| 發表于 2020-1-20 22:22 | 只看該作者
    tom66 發表于 2020-1-20 22:08
    樓主! JDY-10M 藍牙模塊無法連接!

    測試用的 hc05 你說的這個沒有測試 之后我試下

    點評

    哦! 可以看到設備,就是連接不上!  發表于 2020-1-20 22:43

    該用戶從未簽到

    地板
    發表于 2020-1-21 09:13 | 只看該作者
    強力技術貼
    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    熱門推薦

    新手求助,github上一個arduino開源CG重心稱的問題
    新手求助,github上一個ar
    在github找到一個開源CG重心稱的代碼,并按文檔說明搭建了硬件環境。發現程序在串口監
    求助為什么下載開發板出錯???
    求助為什么下載開發板出錯
    網絡,網址都沒錯,為什么下載開發板出錯???謝謝
    自制arduino時,usb周圍電路搞不懂
    自制arduino時,usb周圍電
    最近在畫搭載atmega 32u4的arduino 兼容板,參考的arduino micro的設計,但電路知識貧
    關于DS1302.h
    關于DS1302.h
    去年買了個ARDUINO沒怎么玩(就是不會玩),然后今天看見了例程中有一個DS1302.h時鐘
    小愛控制ws2812,能開燈,調亮度、顏色,就是不能關燈
    小愛控制ws2812,能開燈,
    小愛控制ws2812,能開燈,調亮度、顏色,就是不能關燈,跑的例程不行,改了代碼也是不
    Copyright   ©2015-2016  Arduino中文社區  Powered by©Discuz!   
    快速回復 返回頂部 返回列表
    北京快乐8论坛