国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

科技不總是冷冰冰,智能便攜打印機讓文字更有溫度!——嵌入式功能實現篇

Mr_houzi / 955人閱讀

摘要:將信號拉高激活打印元件,接著使步進電機轉動兩步完成一點行的打印。步進電機的步長為,一點行的寬度為,因此打印出一點行的數據需要步進電機轉兩步。由于步進電機和熱敏頭不能長時間連續工作,因此打印份數不宜設置過多,否則容易燒壞電機和熱敏頭。

簡介:利用Wi-Fi&BLE云模組讓普通打印機實現App端輸入文字即可實時&遠程打印。

1、功能需求

基本打印流程:
(1)用戶通過涂鴉App完成設備配網。
(2)將需要打印的文字或者簡單圖片輸入文本框。
(3)輸入完成后APP將文本框中的內容全部轉換成bmp單色位圖存儲到云端,并將圖片的url給到App。
(4)分別將第一段url和第二段url下發到設備,設備端將url拼接。
(5)設置打印份數后點擊開始打印。
(6)設備收到打印命令后訪問url,下載圖片到模組后開始打印。
(7)返回打印結果(成功/失敗)。

功能名稱功能詳解
打印份數設置具體要打印的份數,默認一份
生成第一段鏈接APP生成的圖片會存儲到云端,以url形式給到設備,url長度超過255個字節,由于IoT平臺string類型DP最多只能容納255個字節,因此需要兩個DP
生成第二段鏈接將得到的兩組url拼接成完整的url,設備訪問該url將圖片下載到模組
開始打印設置好打印份數,下發打印命令,設備開始打印
正在打印份數根據設置的打印份數,設備會上報當前正在打印的份數在APP顯示
缺紙報警檢測到打印機無紙時無法打印,并上報缺紙狀態到APP
電量顯示電量以10%間隔顯示在APP
低電量報警電量在低于10%時APP電量報警
打印結果
打印狀態打印成功、打印失敗(缺紙、電池電量不足、圖片拉去失敗)

2、環境搭建

(1)開發環境搭建可以參考Wi-Fi 模組二次開發教程——1. SoC開發環境搭建。如果已經有虛擬機和烏班圖的開發環境可直接跳至4.2 下載編譯依賴工具處進行剩余環境搭建。
(2)產品創建可以參考Wi-Fi模組二次開發教程——2. 涂鴉IoT平臺介紹。由于IoT平臺品類中沒有打印機,所以選擇找不到品類?。默認自定義方案,填入產品名稱和產品型號,通訊協議默認Wi-Fi&藍牙,創建產品后添加所需的功能點。

功能點定義完成后選擇設備面板為自由配置面板,其他步驟均可參考Wi-Fi模組二次開發教程——2. 涂鴉IoT平臺介紹完成產品創建。
(3)參考Wi-Fi模組二次開發課程——3. 快速上手來完成代碼修改編譯、固件上傳、獲取token、燒錄授權和設備配網。

3、功能實現

3.1 打印功能

打印是打印機最重要的功能點,其他所有的功能點都是在此基礎上實現的。通過步進電機和熱敏頭的協同工作來實現字符和圖片的打印。
打印頭與涂鴉Wi-Fi&BLE雙模模組之間通過SPI進行數據通信,具體打印步驟為:
(1)模組每次向熱敏頭發送48位數據。
(2)熱敏頭接收到數據后在CLK信號的上升沿將數據傳輸到移位寄存器。
(3)一行(48位)數據傳輸完成后將/LAT信號拉低緊接著拉高把數據存儲到鎖存寄存器中。
(4)將DST信號拉高激活打印元件,接著使步進電機轉動兩步完成一點行的打印。
(5)在電機轉過兩步后要及時將DST信號拉低,長時間加熱會損壞加熱元件甚至冒煙。

步進電機的步長為0.01325mm,一點行的寬度為0.0625mm,因此打印出一點行的數據需要步進電機轉兩步。DST信號激活頻率為步進電機每轉兩步激活一次。
打印時序圖如下:

步進電機時序圖如下:

打印功能部示例代碼:

/*** @function:set_motor_phases* @brief: set motor phases* @param[in]: phase[4]* @return: none*/STATIC VOID set_motor_phases(CONST UINT8_T phase[4]){    tuya_gpio_write(PH1, phase[0]);    tuya_gpio_write(PH2, phase[1]);    tuya_gpio_write(PH3, phase[2]);    tuya_gpio_write(PH4, phase[3]);}/*** @function:idle_motor* @brief: idel status no power consumption* @param[in]: none* @return: none*/VOID idle_motor(VOID){    if (isIdle) {        return;    }    CONST UINT8_T idle_phase[] = {0, 0, 0, 0};    set_motor_phases(idle_phase);    isIdle = TRUE;}/*** @function:set_motor_step* @brief: * @param[in]: none* @return: none*/VOID set_motor_step(VOID) {    isIdle = false;    CONST INT_T totalSteps = ARRAY_SIZE;    currStep = (currStep + totalSteps + 1) % totalSteps;    set_motor_phases(motor_phases[currStep]);}/*** @function:tuya_motor_feedPaper_line* @brief: Feed paper for `count` lines* @param[in]: count -> print line num* @param[in]: direction: FORWARD->forward  BACKWARD->backward* @param[in]: speed: Adjust the motor speed unit:ms* @return: none*/VOID tuya_motor_feedPaper_line(UINT_T count, INT8_T direction, UINT8_T speed){	INT_T i;	/* out of paper or cuont num is 0 return */	if (1 == tuya_TmlHead_out_of_paper_alarm() || 0 == count) {		return;	}	CONST UINT_T stepsPerLine = ARRAY_SIZE / 2;	for (i = 0; i < (stepsPerLine * count); i++) {		tuya_motor_set_motor_step(direction);		tuya_hal_system_sleep(speed);	// delay 2ms unit:ms	}}/*** @function:begin_print_line* @brief: send 1bpp data to printhead and begin heating* @param[in]: data -> The data to be printed* @return: none*/STATIC VOID begin_print_line(UINT8_T* data){	if (1 == out_of_paper_alarm()) {		return;	}	bk_spi_master_dma_send(&g_spi_msg);	tuya_hal_system_sleep(5);	tuya_gpio_write(PRINT_DST, FALSE);	tuya_gpio_write(PRINT_LAT, FALSE);	tuya_gpio_write(PRINT_LAT, TRUE);	tuya_gpio_write(PRINT_DST, TRUE);}/*** @function:end_printLine* @brief:end heating * @param[in]: none* @return: none*/STATIC VOID end_printLine(VOID){	tuya_gpio_write(PRINT_DST, FALSE);}/*** @function: print_1bLine* @brief: Print one line of data* @param[in]: data -> Data to be printed* @return: none*/STATIC VOID print_1bLine(UINT8_T* data){	if (1 == out_of_paper_alarm()) {		return;	}	begin_print_line(data);	motor_feedPaper_line(1, FORWARD, 2);    // The actual number of steps is 2*Param	end_printLine();	}

要合理控制步進電機送紙速度,速度過快容易走不動紙,速度過慢加熱頭會對熱敏紙同一個點長時間加熱使熱敏紙顏色由黑變灰甚至變白,影響打印效果。

3.2 打印份數

打印份數默認打印一份,在APP上設置參數可調整打印份數。由于步進電機和熱敏頭不能長時間連續工作,因此打印份數不宜設置過多,否則容易燒壞電機和熱敏頭。

3.3 生成第一段鏈接 & 生成第二段鏈接

由于平臺受限,url長度超過255個字節,string類型DP最多只能容納255個字節,因此需要兩個DP。url在代碼中本質為字符串。APP將兩端url下發到設備后再將得到的兩組url拼接成完整的url,設備訪問該url將圖片下載到模組。

        case PRINT_NUM_DPID:            bmp_info.paper_num = root->value.dp_value;        break;        case CREATE_LINK1_DPID:            memset (bmp_info.first_url, 0, 255);            memcpy(bmp_info.first_url, root->value.dp_str, strlen(root->value.dp_str));        break;        case CREATE_LINK2_DPID:            memset (bmp_info.second_url, 0, 255);            memcpy(bmp_info.second_url, root->value.dp_str, strlen(root->value.dp_str));        break;

3.4 開始打印 & 正在打印的份數

設備收到打印命令后訪問url下載圖片到模組后開始打印。由于模組RAM有限,剩余空間只有40k左右,而需要打印的圖片很可能超過了40k,因此采用一邊拉取部分圖片一邊打印的方式完成打印。打印份數bmp_info.paper_num控制for循環的次數,bmp_info.print_num即為當前正在打印的份數,將print_num實時上報到APP即可顯示當前正在打印的份數。
開始打印部分代碼:

    CHAR_T *image_url = (CHAR_T *)malloc(512*sizeof(CHAR_T));    strcpy(image_url, "https://storage-proxy.tuyacn.com:7779/dst=");    tuya_hal_semaphore_wait(pv_handle);    strcat(image_url, bmp_info.first_url);    strcat(image_url, bmp_info.second_url);    for (bmp_info.print_num = 0; bmp_info.print_num < bmp_info.paper_num; bmp_info.print_num++) {        iot_httpc_download_file(image_url, PULL_SIZE, iot_download_image_cb, NULL, bmp_info.total_len, file_hmac);         tuya_bmp_print_num_update(++bmp_info.print_num);    }

3.5 缺紙報警

打印機內部采用一個反射性光電通斷偵測傳感器,當缺紙時,光電偵測發出的光無法被反射,輸出高電平。當紙張正常,光電偵測發出的光被反射,由接收管接收,輸出低電平。將輸出的電平值實時上報到APP。當缺紙時,不能啟動加熱頭和電機。
缺紙檢測部分代碼:

/** * @function: out_of_paper_alarm * @brief: detection printer have paper * @param: none * @return: ALARM-->out of paper  NORMAL-->have a paper * @others: none */UCHAR_T out_of_paper_alarm(VOID){    if (NO_PAPER == tuya_gpio_read(PAPER_SENSOR)) {		return PAPER_ALARM;    } else {		return PAPER_NORMAL;	}}	dp_arr[2].dpid = OUT_OF_PAPER_DPID;     dp_arr[2].type = PROP_BOOL;         dp_arr[2].time_stamp = 0;    dp_arr[2].value.dp_bool = out_of_paper_alarm();

3.6 電量顯示 & 低電量報警

打印機采用7.4v可充電鋰電池供電,采用ADC采集電池端的電壓,顯示10%、20%、…、90%、100%電量值,當電池電壓等于10%時上報APP,并且紅燈亮起,提醒用戶充電。大于10%時綠燈常亮。該任務放在多帶帶的線程中每3s采集一次電池電壓,并上報電量值。


ADC_ELECTRICITY處分壓后電壓為2.1v。
部分示例代碼:

/*** @function:tuya_BatMon_BatStatus* @brief: Battery level display* @param[in]: none* @return: none*/VOID tuya_BatMon_BatStatus(VOID){    UINT16_T battery_val = 0;    BOOL_T bat_alarm = 0;    while (1) {        battery_val = tuya_BatMon_BatVal_get(2400, 4096, 4, 400);        if (battery_val <= precent_10) {            bat_alarm = 1;            tuya_BatMon_ch443k_toggle(BAT_LED_PIN, FALSE);            tuya_gpio_write(BAT_LED_PIN, FALSE);        } else {            bat_alarm = 0;            tuya_BatMon_ch443k_toggle(BAT_LED_PIN, TRUE);            tuya_gpio_write(BAT_LED_PIN, TRUE);        }        if (battery_val >= precent_100) {            vlotage_percent = _100p;        } else if (battery_val < precent_100 && battery_val >= precent_90) {            vlotage_percent = _90p;        } else if (battery_val < precent_90 && battery_val >= precent_80) {            vlotage_percent = _80p;        } else if (battery_val < precent_80 && battery_val >= precent_70) {            vlotage_percent = _70p;        } else if (battery_val < precent_70 && battery_val >= precent_60) {            vlotage_percent = _60p;        } else if (battery_val < precent_60 && battery_val >= precent_50) {            vlotage_percent = _50p;        } else if (battery_val < precent_50 && battery_val >= precent_40) {            vlotage_percent = _40p;        } else if (battery_val < precent_40 && battery_val >= precent_30) {            vlotage_percent = _30p;        } else if (battery_val < precent_30 && battery_val >= precent_20) {            vlotage_percent = _20p;        } else {            vlotage_percent = _10p;        }                /* Voltage detection frequency */        tuya_hal_system_sleep(CKECK_TIME);        tuya_update_Bat_Val_dp(bat_alarm);    }}

e if (battery_val < precent_50 && battery_val >= precent_40) {
vlotage_percent = _40p;
} else if (battery_val < precent_40 && battery_val >= precent_30) {
vlotage_percent = _30p;
} else if (battery_val < precent_30 && battery_val >= precent_20) {
vlotage_percent = _20p;
} else {
vlotage_percent = _10p;
}

    /* Voltage detection frequency */    tuya_hal_system_sleep(CKECK_TIME);    tuya_update_Bat_Val_dp(bat_alarm);} }

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119772.html

相關文章

  • 輸入9V-12V輸出8.4V1.5A雙節鋰電池充電芯片

    摘要:輸入輸出,非常適用于消費類電子產品,如便攜式個人媒體播放器和便攜式系統,為確保對高容量鋰離子電池的可靠充電,這些全集成充電管理控制器在一個單芯片上集成了一些關鍵的標準充電管理和安全功能。 輸入9V-12V輸出8.4V1.5A雙節鋰電池充電芯片平板電腦MID 智能MID 便捷式MID 1A-1...

    不知名網友 評論0 收藏0
  • 谷歌董事長:我可以非常直接地說,互聯網將消失

    摘要:當互聯網概念在中國資本市場上方興未艾之時,互聯網巨頭谷歌公司的執行董事長埃里克施密特在前段時間舉行的座談會上大膽預言互聯網即將消失,一個高度個性化互動化的有趣世界物聯網即將誕生。他說我可以非常直接地說,互聯網將消失。 當互聯網概念在中國資本市場上方興未艾之時,互聯網巨頭谷歌公司的執行董事長埃里克?施密特在前段時間舉行的座談會上大膽預言:互聯網即將消失,一個高度個性化、互動化的有趣世界——物聯...

    hiyayiji 評論0 收藏0
  • 最新最全AI快報:馬斯克被懟,谷歌最近太平...

    摘要:馬斯克呼吁對人工智能進行監管,并警告說這種技術可能會造成獨裁者并引發第三次世界大戰。,谷歌最近并不太平。目前,雙方正在聯合承辦的比賽。 AI行業動態 1,新浪美股訊,北京時間5月28日晚間,據外媒消息,IBM沃森和云高級副總裁大衛肯尼表示,人工智能已經證明是有益的。特斯拉首席執行官馬斯克等發出的末日警告有些言過其實。它使網絡變得更加安全,幫助醫生護士和病人更好地找到醫療保健方式,幫助人...

    Astrian 評論0 收藏0
  • 亞馬遜新時代:云服務獨領風騷,AI助手無處

    摘要:亞馬遜人工智能語音助手技能超過萬個,全球各主要硬件廠商紛紛搭載或兼容,使得其亞馬遜助手無處不在。物聯網設備透過云端實現跨行業和跨設備互聯互通,所收集數據除了在邊緣側處理,還需要上傳至云端,云端作為數據集散地,各種數據經過云端AI處理后,對這些數據利用將會帶來新的商業模式。在物聯網資深專家楊劍勇看來,云計算是全球物聯網重要基礎設施,作為物聯網產業發展基石,聚集了亞馬遜、微軟、谷歌和BAT等重量...

    Bmob 評論0 收藏0
  • 螞蟻微貸互動營銷技術體系實踐

    摘要:財富管理專場上,螞蟻金服微貸事業群高級前端技術專家王卓做了主題為螞蟻微貸互動營銷技術體系實踐的精彩分享。通過互動技術,最終實現拉新,留存和促活等目標。營銷技術方案對接研發平臺,通過鳳蝶系統和研發管理體系進行打通。 摘要:以數字金融新原力(The New Force of Digital Finance)為主題,螞蟻金服ATEC城市峰會于2019年1月4日上海如期舉辦。財富管理專場上,螞...

    aristark 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<