关注分享主机优惠活动
国内外VPS云服务器

技术并不总是冰冷的。 一款智能便携打印机,让文字更温暖! ——内置功能实现篇

总结:通过将信号设置为高来激活打印组件,并分两步旋转步进电机来完成一行打印。 步进电机的步长为 ,1 点线的宽度为 ,因此步进电机需要旋转 2 步才能打印 1 点线的数据。 步进电机和热敏头不能长时间连续运行,因此如果打印数量设置过高,电机和热敏头可能会烧坏。

简介:通过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 字节。 物联网平台中的字符串类型DP最多只能容纳255字节,因此需要两个DP来生成第二个链接并将两个生成的URL组合成完整的URL。 设备访问 URL,将图像下载到模块,然后开始打印。 设置份数并发出打印命令后,将开始打印。 打印份数根据设定的份数而定。 设备报告当前打印的份数。 当打印机检测到缺纸时,APP会显示缺纸报警,并且无法打印。 在APP电量显示上通知缺纸情况。 剩余电池电量以 10% 为间隔显示。 APP出现低电量报警。 当电池电量低于10%时,APP会显示电量报警。警报打印结果的打印状态: 打印成功、打印失败(缺纸、电池电量低、获取图像失败) 2. 环境设置

(1) 有关设置开发环境的信息,请参见 Wi-。 Fi模块二次开发教程——1.SoC开发环境搭建。 如果您已经有虚拟机和Ubuntu开发环境,可以直接进入4.2下载并编译依赖工具来构建您的其余环境。 (2) 产品制作请参见Wi-Fi模块二次开发教程-2.涂鸦物联网平台介绍。 IoT平台类别中没有打印机,为什么我无法选择该类别? 默认自定义方案。 输入产品名称和产品型号。 默认通信协议为 Wi-Fi&Bluetooth。 创建产品后添加所需的功能点。 定义完功能点后,选择设备面板作为自由配置面板。 其他步骤请参见Wi-Fi模块二次开发教程-2.引入涂鸦物联网平台完成产品创建。 (3) 参见Wi-Fi模块二次开发课程-3。 立即上手,完成代码修改和编译、固件上传、token获取、写入认证、设备网络配置。

3、功能实现 3.1 打印功能 打印是打印机最重要的功能点,其他所有功能点都是基于此实现的。 通过步进电机和热敏头的配合实现文字和图片的打印。 打印头与涂鸦 Wi-Fi&BLE 双模模块之间通过 SPI 进行数据通信。 具体打印步骤如下。 (1) 模块每次向热敏头发送48位数据。 (2)热敏头接收到数据后,在CLK信号的上升沿将数据发送到移位寄存器。 (3) 完成一行(48 位)数据传输后,将/LAT 信号拉低然后拉高,将数据存储到锁存寄存器中。 (4) 将DST信号拉高,启动打印组件,步进电机分两步转动,完成一行打印。 (5) 电机旋转2步后,DST信号应及时变低。 长时间加热可能会损坏加热元件或产生烟雾。

步进电机的步长为0.01325mm,虚线宽度为0.0625mm。 因此,为了打印虚线数据,需要使步进电机旋转两步。 DST信号的激活频率为步进电机每旋转两步一次。 打印时序图如下: 步进电路这是机器的时序图:

打印功能示例代码:

/*** @function:set_motor_phases* @brief: 设置电机相位* @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(PH3, Phase[2]); );}/*** @function:idle_motor* @brief: 空闲状态 无功耗* @param[in]: none* @return: none*/VOIDidle_motor(VOID){ if (isIdle) { return value; UINT8_Tidle_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 总步数 = ARRAY_SIZE; currStep = (currStep +totalSteps + 1) %totalSteps;set_motor_phases(motor_phases[currStep]);}/*** @function:tuya_motor_feedPaper_line* @brief: 送纸 `count` 行* @param[in]: 计数 -> 打印行数* @param[ in]:方向:FORWARD->前进 BACKWARD->后退* @param[in]: 速度:电机速度调整单位:ms* @return: none*/VOID tuya_motor_feedPaper_line(UINT_T count, INT8_T Direction , UINT8_T speed){ INT_T i;/* 缺纸或纸张计数为 0 return */if (1 == tuya_TmlHead_out_of_paper_alarm() || 0 == count) {return;}CONST UINT_T StepsPerLine = ARRAY_SIZE / 2;for (i = 0; i Data打印* @return: 无*/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(打印纬度,假);tuya_gpio_write(PRINT_LAT, TRUE);tuya_gpio_write(PRINT_DST, TRUE);}/*** @function:end_printLine* @brief:加热结束 * @param[in]: none* @return: none*/STATIC VOID end_printLine(VOID) {tuya_gpio_write(PRINT_DST, FALSE);}/*** @function: print_1bLine* @brief: 输出一行数据* @param[in]: data -> 要输出的数据* @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); // 实际步数为 2*Paramend_printLine();}

应合理控制步进电机的走纸速度。 如果速度太快,纸张可能无法移动。 如果速度太慢,加热头会长时间加热热敏纸上的同一点,热敏纸的颜色会由黑色变为灰色甚至白色。 ,会影响印刷效果。

3.2 打印份数

默认打印份数为 1。 可以通过应用程序上设置参数来调整要打印的份数。 步进电机和热敏头不能长时间连续运行,因此如果打印数量设置过高,电机和热敏头可能会烧坏。

3.3 生成第一个链接,生成第二个链接。

由于平台限制,URL长度大于255字节,且一个字符串类型DP最多只能容纳255字节,因此需要两个DP。 URL 基本上是代码中的字符串。 美联社P 将 URL 的两端发送到设备,并将两个检索到的 URL 组合成一个完整的 URL。 设备访问 URL 并将图像下载到模块。 案例 PRINT_NUM_DPID: bmp_info.paper_num = root->value.dp_value; 案例 CREATE_LINK1_DPID: memset (bmp_info.first_url, 0, 255); , strlen(root->value.dp_str)); 案例 CREATE_LINK2_DPID: memset (bmp_info.second_url, 0, 255); memcpy(bmp_info.second_url, root->value.dp_str, strlen(root[k4) ]>value.dp_str); Destroy; 3.4 打印开始和份数

接收打印命令的设备访问 URL,将图像下载到模块,并在模块 RAM 可用时开始打印。只剩下40k左右的空间,要打印的照片可以超过40k,份数bmp_info.paper_num是通过取出部分照片同时打印来完成的,控制for循环的次数。 bmp_info.print_num 为当前打印份数,实时向APP报告print_num,并开始打印部分代码:

CHAR_T *image_url = (CHAR_T *)malloc(512*siz)eof(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); bmp_info.second_url); for (bmp_info.print_num = 0; bmp_info.print_num 缺纸 NORMAL-->缺纸 * @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].time_stamp = 0; 3.6 电池电量显示和低电量报警

打印机为 7.4V 可充电打印机锂电池供电,采用ADC采集电池端子电压并显示10%、20%、...、90%、100%,电池电压达到10%时红灯亮,提醒用户充电。该任务将始终亮起绿灯。ADC_ELECTRICITY 处理电压的一些示例为 2.1v。代码:

/*** @function:tuya_BatMon_BatStatus* @brief: 电量显示* @param[in]: none* @return: none*/VOID tuya_BatMon_BatStatus(VOID){ UINT16_T Battery_val = 0; BOOL_T 蝙蝠报警= 0; while (1) { Battery_val = tuya_BatMon_BatVal_get(2400, 4096, 4, 400); if (battery_val = precent_100) { vlotage_percent = _100p; } else if (battery_val = precent_90) { vlotage_percent = _90p; else if (battery_val = precent_60) { vlotage_percent = _60p; } else if (battery_val = precent_50) { vlotage_percent = _50p; } else if ( Battery_val =Previous_40) { vlotage_percent = _40p; } else if (battery_val = precent_30) { vlotage_percent = _30p; } else if (battery_val = precent_20) { vlotage_percent = _20p; } else { vlotage_percent = _10p; } /* 电压检测频率 */ tuya_hal_system_sleep( ckeck_time); tuya_update_bat_val_dp(bat_alarm);}}}

} else if (battery_val = precent_20) { vlotage_percent = _20p; } else { vlotage_percent = _10p; }

/* 电压检测频率 */ tuya_hal_system_sleep(CKECK_TIME);date_Bat_Val_dp(bat_alarm);} }

未经允许不得转载:主机频道 » 技术并不总是冰冷的。 一款智能便携打印机,让文字更温暖! ——内置功能实现篇

评论 抢沙发

评论前必须登录!