摘要:涂鴉模組中的固件應(yīng)為通用固件,通用固件支持,兩種波特率自適應(yīng)。涂鴉智能將每個(gè)功能點(diǎn)抽象成數(shù)據(jù)點(diǎn),數(shù)據(jù)點(diǎn)定義成不同的類(lèi)型,例如布爾枚舉數(shù)值等。指定通信協(xié)議下事件的。上報(bào)設(shè)備狀態(tài)函數(shù)注冊(cè)獲取連接狀態(tài)輪詢(xún)串口數(shù)據(jù)在中調(diào)用。
Tuya MCU SDK Arduino Library 基于涂鴉Wi-Fi 通用對(duì)接方案進(jìn)行開(kāi)發(fā)的,設(shè)備 MCU 通過(guò)串口與 Wi-Fi 模組連接實(shí)現(xiàn)設(shè)備聯(lián)網(wǎng)。涂鴉模組中的固件應(yīng)為通用固件,通用固件支持9600,115200
兩種波特率自適應(yīng)。
注意點(diǎn):
Arduino板子 + 涂鴉模塊
的開(kāi)發(fā)方式,據(jù)說(shuō)后期可以多帶帶模塊開(kāi)發(fā)。- 串口通信
https://gitee.com/ant_onio/tuya-wifi-mcu-sdk-arduino-library 點(diǎn)擊下載
解壓到自己的電腦路徑(此電腦->文檔->Arduino->libraries)
Arduino IDE -> 工具 -> 管理庫(kù) -> 搜索 tuya-> 安裝最新版本
記住一點(diǎn),這種方式是mcu + module
串口通信開(kāi)發(fā)方式
簡(jiǎn)單來(lái)說(shuō),肯定數(shù)據(jù)是
不斷處理串口通信
,那么從另外一個(gè)點(diǎn)來(lái)說(shuō)就是模組已經(jīng)內(nèi)置了串口協(xié)議數(shù)據(jù)處理邏輯。
博哥大概代碼看了一下:
class TuyaUart{public: // 主要是定義串口通信buffer緩存大小 volatile unsigned char wifi_uart_rx_buf[PROTOCOL_HEAD + WIFI_UART_RECV_BUF_LMT]; //Serial data processing buffer volatile unsigned char wifi_uart_tx_buf[PROTOCOL_HEAD + WIFIR_UART_SEND_BUF_LMT]; //Serial receive buffer volatile unsigned char wifi_data_process_buf[PROTOCOL_HEAD + WIFI_DATA_PROCESS_LMT]; //Serial port send buffer TuyaUart(void); ~TuyaUart(void); void wifi_protocol_init(void); // 接收數(shù)據(jù) unsigned char uart_receive_input(unsigned char data); void uart_receive_buff_input(unsigned char value[], unsigned short data_len); unsigned char take_byte_rxbuff(void); unsigned char with_data_rxbuff(void); // 傳輸發(fā)送數(shù)據(jù) void uart_transmit_output(unsigned char value); void wifi_uart_write_data(unsigned char *in, unsigned short len); void wifi_uart_write_frame(unsigned char fr_type, unsigned char fr_ver, unsigned short len); unsigned short set_wifi_uart_byte(unsigned short dest, unsigned char byte); unsigned short set_wifi_uart_buffer(unsigned short dest, const unsigned char *src, unsigned short len); /* serial set */ bool _isHWSerial; // 串口設(shè)置 void set_serial(HardwareSerial *serial); void set_serial(SoftwareSerial *serial); void begin(long baud_rate); char read(void); size_t write(char value); int available(void);private: volatile unsigned char *rx_buf_in; volatile unsigned char *rx_buf_out; Stream *_port;};
class TuyaTools{public: TuyaTools(void); ~TuyaTools(void); unsigned char hex_to_bcd(unsigned char Value_H, unsigned char Value_L); // 計(jì)算字符串長(zhǎng)度 unsigned long my_strlen(unsigned char *str); // 設(shè)置字符串 void *my_memset(void *src, unsigned char ch, unsigned short count); // 內(nèi)存拷貝 void *my_memcpy(void *dest, const void *src, unsigned short count); // 字符串拷貝 char *my_strcpy(char *dest, const char *src); // 字符串對(duì)比 int my_strcmp(char *s1, char *s2); // int 轉(zhuǎn)字節(jié)數(shù)組 void int_to_byte(unsigned long number, unsigned char value[4]); // 字節(jié)數(shù)組 轉(zhuǎn)int unsigned long byte_to_int(const unsigned char value[4]); unsigned char get_check_sum(unsigned char *pack, unsigned short pack_len);private:};
class TuyaDataPoint{public: // TuyaDataPoint(void); // ~TuyaDataPoint(void); // 下發(fā)節(jié)點(diǎn)數(shù)據(jù) unsigned char mcu_get_dp_download_bool(const unsigned char value[], unsigned short len); unsigned char mcu_get_dp_download_enum(const unsigned char value[], unsigned short len); unsigned long mcu_get_dp_download_value(const unsigned char value[], unsigned short len); // 上報(bào)節(jié)點(diǎn)數(shù)據(jù) unsigned char mcu_dp_raw_update(unsigned char dpid, const unsigned char value[], unsigned short len); unsigned char mcu_dp_bool_update(unsigned char dpid, unsigned char value); unsigned char mcu_dp_value_update(unsigned char dpid, unsigned long value); unsigned char mcu_dp_string_update(unsigned char dpid, const unsigned char value[], unsigned short len); unsigned char mcu_dp_enum_update(unsigned char dpid, unsigned char value); unsigned char mcu_dp_fault_update(unsigned char dpid, unsigned long value);private:};
注意區(qū)分一下數(shù)據(jù)類(lèi)型。
DP為 Data Point 的縮寫(xiě),即數(shù)據(jù)點(diǎn),偶爾被稱(chēng)為 DP 點(diǎn),表示智能設(shè)備所具備的功能點(diǎn)。
True
或 False
。DPID:指定通信協(xié)議下 DP 事件的 ID。
節(jié)點(diǎn)類(lèi)型:
#define DP_TYPE_RAW 0x00 //RAW type#define DP_TYPE_BOOL 0x01 //bool type#define DP_TYPE_VALUE 0x02 //value type#define DP_TYPE_STRING 0x03 //string type#define DP_TYPE_ENUM 0x04 //enum type#define DP_TYPE_BITMAP 0x05 //fault type
在A(yíng)rduino中使用該庫(kù)進(jìn)行編程開(kāi)發(fā)時(shí),必須在你的Arduino工程文件中包含 TuyaWifi.h 頭文件。
一般很多sdk的開(kāi)發(fā)方式都是:
- 1、創(chuàng)建對(duì)象 構(gòu)造方法
- 2、初始化 init
- 3、回調(diào)配置、信息注冊(cè) register、callbackHandler
- 4、不斷輪詢(xún)處理響應(yīng)
PID通過(guò)在 Tuya IoT平臺(tái) 上創(chuàng)建產(chǎn)品獲取,wifi類(lèi)的長(zhǎng)度一般為16,mcu_ver 這個(gè)參數(shù)是軟件的版本號(hào)。
在Tuya IoT平臺(tái)創(chuàng)建產(chǎn)品,獲取產(chǎn)品DP點(diǎn)信息。
DP為 Data Point 的縮寫(xiě),即數(shù)據(jù)點(diǎn),偶爾被稱(chēng)為 DP 點(diǎn),表示智能設(shè)備所具備的功能點(diǎn)。
True
或 False
。DPID:指定通信協(xié)議下 DP 事件的 ID。
MCU SDK需要知道你創(chuàng)建了哪些DP點(diǎn),他們是什么類(lèi)型的。
/** * @description: MCU set wifi working mode * @param {unsigned char} mode : enter mode * 0(SMART_CONFIG):enter smartconfig mode * 1(AP_CONFIG):enter AP mode * @return {*} */void TuyaWifi::mcu_set_wifi_mode(unsigned char mode);
當(dāng)APP控制設(shè)備的時(shí)候,會(huì)從云端下發(fā)對(duì)應(yīng)的DP命令到設(shè)備,設(shè)備對(duì)數(shù)據(jù)進(jìn)行解析后,對(duì)下發(fā)的命令執(zhí)行相對(duì)于的動(dòng)作。
對(duì)下發(fā)命令的處理,通過(guò)回調(diào)函數(shù)來(lái)調(diào)用,所以我們需要把你的處理函數(shù)注冊(cè)一下。
偽代碼:
//register DP download processing callback function my_device.dp_process_func_register(dp_process);/** * @description: DP download callback function. * @param {unsigned char} dpid * @param {const unsigned char} value * @param {unsigned short} length * @return {unsigned char} */unsigned char dp_process(unsigned char dpid, const unsigned char value[], unsigned short length){ switch (dpid) { case DPID_BOOL: DebugSerial.println("Bool type:"); dp_bool_value = my_device.mcu_get_dp_download_data(dpid, value, length); DebugSerial.println(dp_bool_value); /* After processing the download DP command, the current status should be reported. */ my_device.mcu_dp_update(DPID_BOOL, dp_bool_value, 1); break; case DPID_VALUE: DebugSerial.println("Value type:"); dp_value_value = my_device.mcu_get_dp_download_data(DPID_VALUE, value, length); DebugSerial.println(dp_value_value); /* After processing the download DP command, the current status should be reported. */ my_device.mcu_dp_update(DPID_VALUE, dp_value_value, 1); break; case DPID_ENUM: DebugSerial.println("Enum type:"); dp_enum_value = my_device.mcu_get_dp_download_data(dpid, value, length); DebugSerial.println(dp_enum_value); /* After processing the download DP command, the current status should be reported. */ my_device.mcu_dp_update(DPID_ENUM, dp_enum_value, 1); break; case DPID_STRING: DebugSerial.println("String type:"); /* */ for (unsigned int i=0; i<length; i++) { dp_string_value[i] = value[i]; DebugSerial.write(dp_string_value[i]); } DebugSerial.println(""); /* After processing the download DP command, the current status should be reported. */ my_device.mcu_dp_update(DPID_STRING, dp_string_value, length); break; case DPID_RAW: DebugSerial.println("Raw type:"); /* */ for (unsigned int i=0; i<length; i++) { dp_raw_value[i] = value[i]; DebugSerial.write(dp_raw_value[i]); } DebugSerial.println(""); /* After processing the download DP command, the current status should be reported. */ my_device.mcu_dp_update(DPID_RAW, dp_raw_value, length); break; default: break; } return SUCCESS;}
這里得注意一個(gè)方法:
mcu_get_dp_download_data (`下發(fā)DP數(shù)據(jù)處理`)
對(duì)字節(jié)數(shù)組進(jìn)行數(shù)據(jù)解析。
/* char * */ unsigned char mcu_dp_update(unsigned char dpid, const unsigned char value[], unsigned short len); /* char raw */ /* unsigned long / long */ unsigned char mcu_dp_update(unsigned char dpid, unsigned long value, unsigned short len); unsigned char mcu_dp_update(unsigned char dpid, long value, unsigned short len); /* unsigned char / char */ unsigned char mcu_dp_update(unsigned char dpid, unsigned char value, unsigned short len); unsigned char mcu_dp_update(unsigned char dpid, char value, unsigned short len); /* unsigned int / int */ unsigned char mcu_dp_update(unsigned char dpid, unsigned int value, unsigned short len); unsigned char mcu_dp_update(unsigned char dpid, int value, unsigned short len);
基本上大同小異。注意一下dpid和數(shù)據(jù)類(lèi)型即可。
#include TuyaWifi my_device;#define DPID_SWITCH 20//Record the current status of the ledunsigned char switch_value = 0;...void setup() { ... //register DP download processing callback function my_device.dp_update_all_func_register(dp_update_all); ...}/** * @description: Upload all DP status of the current device. * @param {*} * @return {*} */void dp_update_all(void){ my_device.mcu_dp_update(DPID_SWITCH, switch_v
/** * @description: Wifi serial port processing service * @param {*} * @return {*} */void TuyaWifi::uart_service(void)
在arduino loop中調(diào)用。不斷檢測(cè)串口數(shù)據(jù)。
/* * @FileName: DataPointType.ino * @Author: Tuya * @Email: * @LastEditors: Tuya * @Date: 2021-04-19 14:31:52 * @LastEditTime: 2021-04-28 19:47:36 * @Copyright: HANGZHOU TUYA INFORMATION TECHNOLOGY CO.,LTD * @Company: http://www.tuya.com * @Description: * @Github:https://github.com/tuya/tuya-wifi-mcu-sdk-arduino-library */#include #include TuyaWifi my_device;SoftwareSerial DebugSerial(8,9);/* Current LED status */unsigned char led_state = 0;/* Connect network button pin */int wifi_key_pin = 7;/* Data point define */#define DPID_BOOL 101#define DPID_VALUE 102#define DPID_ENUM 103#define DPID_STRING 104#define DPID_RAW 105#define DPID_FAULT 106/* Current device DP values */unsigned char dp_bool_value = 0;long dp_value_value = 0;unsigned char dp_enum_value = 0;unsigned char dp_string_value[8] = {"Hi,Tuya"};unsigned char dp_raw_value[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};int dp_fault_value = 0x01;/* Stores all DPs and their types. PS: array[][0]:dpid, array[][1]:dp type. * dp type(TuyaDefs.h) : DP_TYPE_RAW, DP_TYPE_BOOL, DP_TYPE_VALUE, DP_TYPE_STRING, DP_TYPE_ENUM, DP_TYPE_BITMAP*/unsigned char dp_array[][2] = { {DPID_BOOL, DP_TYPE_BOOL}, {DPID_VALUE, DP_TYPE_VALUE}, {DPID_ENUM, DP_TYPE_ENUM}, {DPID_STRING, DP_TYPE_STRING}, {DPID_RAW, DP_TYPE_RAW}, {DPID_FAULT, DP_TYPE_BITMAP},};unsigned char pid[] = {"xxxxxxxxxxx"}; // 填上自己的產(chǎn)品IDunsigned char mcu_ver[] = {"1.0.0"};/* last time */unsigned long last_time = 0;void setup(){ Serial.begin(9600); DebugSerial.begin(9600); //Initialize led port, turn off led. pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); //Initialize networking keys. pinMode(wifi_key_pin, INPUT_PULLUP); // 三部曲 —— 初始化、配置、注冊(cè)回調(diào) //Enter the PID and MCU software version my_device.init(pid, mcu_ver); //incoming all DPs and their types array, DP numbers my_device.set_dp_cmd_total(dp_array, 6); //register DP download processing callback function my_device.dp_process_func_register(dp_process); //register upload all DP callback function my_device.dp_update_all_func_register(dp_update_all); last_time = millis();}void loop(){ // 不斷輪詢(xún) my_device.uart_service(); //Enter the connection network mode when Pin7 is pressed. if (digitalRead(wifi_key_pin) == LOW) { delay(80); if (digitalRead(wifi_key_pin) == LOW) { my_device.mcu_set_wifi_mode(SMART_CONFIG); } } /* LED blinks when network is being connected */ if ((my_device.mcu_get_wifi_work_state() != WIFI_LOW_POWER) && (my_device.mcu_get_wifi_work_state() != WIFI_CONN_CLOUD) && (my_device.mcu_get_wifi_work_state() != WIFI_SATE_UNKNOW)) { if (millis() - last_time >= 500) { last_time = millis(); /* Toggle current LED status */ if (led_state == LOW) { led
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/119500.html
摘要:使用中間件后的也是通過(guò)中間件包裝后的。在的位置則進(jìn)行觸發(fā)監(jiān)聽(tīng)器,監(jiān)聽(tīng)器設(shè)置則在中增加。現(xiàn)在來(lái)解釋?zhuān)蛯?duì)應(yīng)關(guān)系我當(dāng)時(shí)回答的是對(duì)應(yīng)的函數(shù)名稱(chēng),如果一致的話(huà)就會(huì)執(zhí)行。呵呵,那個(gè)涂鴉大工程師有問(wèn)題了如何綁定的呢,怎么確定是而不是。 redux 閑談 起因: 在與涂鴉智能一個(gè)web工程師交流過(guò)程中,他詢(xún)問(wèn)我dispatch一個(gè)action,是如何和reducer 綁定的,dispatch(act...
摘要:使用庫(kù)讀寫(xiě)環(huán)境光照度傳感器本文將教大家如何快速使用庫(kù)讀取光照度數(shù)據(jù)。五實(shí)驗(yàn)樣機(jī)測(cè)試展示通過(guò)之前配置好的面板,通過(guò)涂鴉智能進(jìn)行配網(wǎng)實(shí)時(shí)采集光照度傳感器的數(shù)據(jù)。 使用STM32 HAL庫(kù)讀寫(xiě)環(huán)境光照度傳感器(BH1750) 本文將教大家如何快速使用STM32HAL庫(kù)讀取光照度數(shù)據(jù)。 實(shí)現(xiàn)功能:通...
摘要:開(kāi)啟掃描時(shí)需要設(shè)備處于配網(wǎng)狀態(tài)一分類(lèi)配網(wǎng)子設(shè)備可以通過(guò)使用手機(jī)藍(lán)牙直接掃描獲取設(shè)備到設(shè)備基礎(chǔ)信息,再使用配網(wǎng)接口實(shí)現(xiàn)設(shè)備的本地配網(wǎng)。 ? (一)分類(lèi) ? (二)設(shè)備配置 ? (三)設(shè)備管理 ? ? 設(shè)備管理,大體分為兩類(lèi),mesh 和 其他 ? ? 獲取設(shè)備列表,給涂鴉sdk發(fā)送當(dāng)前房間id...
摘要:研究者創(chuàng)建了一個(gè)名叫文森特的系統(tǒng)是的,就是梵高那個(gè)文森特使用深度學(xué)習(xí),將簡(jiǎn)筆畫(huà)轉(zhuǎn)變?yōu)樗囆g(shù)品。研究人員認(rèn)為,除了在藝術(shù)繪畫(huà)方面大放異彩,類(lèi)似文森特的技術(shù)還有一系列潛在的應(yīng)用。 如果你喜歡藝術(shù)但下筆皆為靈魂畫(huà)作,那么今天要介紹的這個(gè)項(xiàng)目肯定合你心意。AI研究者創(chuàng)建了一個(gè)名叫文森特(Vincet)的系統(tǒng)——是的,就是梵高那個(gè)文森特——使用深度學(xué)習(xí),將簡(jiǎn)筆畫(huà)轉(zhuǎn)變?yōu)樗囆g(shù)品。用戶(hù)在平板上的涂鴉經(jīng)過(guò)文森特...
摘要:我們進(jìn)行了一個(gè)交互式網(wǎng)絡(luò)實(shí)驗(yàn),讓你能與一個(gè)名為的循環(huán)神經(jīng)網(wǎng)絡(luò)模型一起繪制作品。我們利用來(lái)自于游戲的數(shù)百萬(wàn)涂鴉訓(xùn)練該神經(jīng)網(wǎng)絡(luò)。一旦你停止涂鴉,神經(jīng)網(wǎng)絡(luò)將接管并試圖猜測(cè)涂鴉的其余部分。在變分自動(dòng)編碼器演示中,你將繪制指定對(duì)象的完整圖形。 對(duì)于通過(guò)蜂窩數(shù)據(jù)連接網(wǎng)絡(luò)的移動(dòng)用戶(hù):第一個(gè)演示大小約為 5 MB 數(shù)據(jù)。每次在演示中更改模型時(shí),您將使用另外 5 MB 的數(shù)據(jù)。我們進(jìn)行了一個(gè)交互式網(wǎng)絡(luò)實(shí)驗(yàn),讓...
閱讀 2944·2021-09-22 15:20
閱讀 3026·2021-09-22 15:19
閱讀 3576·2021-09-22 15:15
閱讀 2493·2021-09-08 09:35
閱讀 2434·2019-08-30 15:44
閱讀 3075·2019-08-30 10:50
閱讀 3865·2019-08-29 16:25
閱讀 1655·2019-08-26 13:55