将数组绘制到C / C ++中用于热敏打印机的位图中

时间:2013-07-29 08:10:37

标签: printing bitmap zebra-printers thermal-printer

我正试图从其他人那里做一些倒退的事情。给定一系列传感器数据,我希望打印出它的图形图。我的测试台使用步进电机移动传感器的输入轴,停止,获得传感器电压的ADC值,重复。

我当前的0.9版工作台没有图形输出。适当的最终解决方案将。目前,我有35个数据点,我希望得到90到100.结果只是存储在 int 数组中。索引是线性的,所以它不是一个复杂的情节,但我在从左下角到右上角的概念化图形到显示给操作员时遇到了问题。我想在TFT屏幕上,我可以直接翻译原点,然后从点到点绘制线条......

更糟糕的是,我还希望将其打印到热敏打印机,因此我需要将其转换为低于384像素的宽图。我不是太担心semantics of communicating the image to the printer,而是如何将数组转换为图像。

它变得更好:我在Arduino Mega上做这个,所以库不是很强大。至少它有很多代码的RAM。 :/

以下是我从Arduino测试中获取数据并将其输入Excel的示例。我不是在寻找颜色,但是我希望图表出现,而且这个设置没有连接到计算机。或者网络。 This is the ESC/POS printer, btw

plot of sensor data


更新:我已经找到了答案,但尚未回答自己尚未与社区分享。如果您在这里尝试学习同样的事情,请通过我的个人资料给我发电子邮件,我会在这里或您直接回答。

1 个答案:

答案 0 :(得分:1)

这个算法分为三个主要阶段:
1)将Y从左上角翻译到左下角 2)将X分解为单词:位值 3)使用Bresenham算法在点之间绘制线条。然后弄清楚如何make the line thicker

对于my exact case,目标位图为384x384,因此需要19k的SRAM存储在内存中。我不得不抛弃“跛脚”的Arduino Mega并升级到ChipKIT uC32以取消它,32k RAM,80 MHz cpu和& I / O的两倍!

我弄清楚这一点的方法是将我的逻辑基于Adafruit's Thermal library为Arduino。在他们的示例中,它们包括如何将1位位图转换为静态数组以进行打印。我使用他们的GFX库来实现setXY函数以及他们的GFX Bresenham算法,使用我的setXY()在(X,Y)s之间绘制线条。

这一切都归结为我写的这个函数中的代码:

// *bitmap is global or class member pointer to byte array of size 384/8*384
// bytesPerRow is 384/8
void setXY(int x, int y) {
    //  integer divide by 8 (/8) because array size is byte or char
    int xByte = x/8;
    //  modulus 8 (%8) to get the bit to set
    uint8_t shifty = x%8;
    //  right shift because we start from the LEFT
    int xVal = 0x80 >> shifty;
    //  inverts Y from bottom to start of array
    int yRow = yMax - y;
    //  Get the actual byte in the array to manipulate
    int offset = yRow*bytesPerRow + xByte;
    //  Use logical OR in case there is other data in the bitmap,
    //  such as a frame or a grid
    *(bitmap+offset)|=xVal;
}

最重要的是要记住一个数组,我们从位图的左上角开始,向右穿过行,然后沿着Y行向下重复。 gotchya's正在将X翻译成单词:bit combo。你必须从左侧移动(有点像向后翻译Y)。另一个问题是Y的簿记错误一次性。

我把所有这些都放在一个类中,这有助于阻止我做一个大功能来完成这一切,通过更好的设计使得实现比我想象的更容易。

打印输出的图片:
Output from TPS test bench I made
Write-up of the project is here