SkillAgentSearch skills...

QRCode

QR code generation library in C, optimized for low-power devices, such as Arduino.

Install / Use

/learn @ricmoo/QRCode
About this skill

Quality Score

0/100

Supported Platforms

Zed

README

QRCode

A simple library for generating QR codes in C, optimized for processing and memory constrained systems.

Features:

  • Stack-based (no heap necessary; but you can use heap if you want)
  • Low-memory foot print (relatively)
  • Compile-time stripping of unecessary logic and constants
  • MIT License; do with this as you please

Installing

To install this library, download and save it to your Arduino libraries directory.

Rename the directory to QRCode (if downloaded from GitHub, the filename may be qrcode-master; library names may not contain the hyphen, so it must be renamed)

API

Generate a QR Code

// The structure to manage the QR code
QRCode qrcode;

// Allocate a chunk of memory to store the QR code
uint8_t qrcodeBytes[qrcode_getBufferSize()];

qrcode_initText(&qrcode, qrcodeBytes, 3, ECC_LOW, "HELLO WORLD");

Draw a QR Code

How a QR code is used will vary greatly from project to project. For example:

  • Display on an OLED screen (128x64 nicely supports 2 side-by-side version 3 QR codes)
  • Print as a bitmap on a thermal printer
  • Store as a BMP (or with a some extra work, possibly a PNG) on an SD card

The following example prints a QR code to the Serial Monitor (it likely will not be scannable, but is just for demonstration purposes).

for (uint8 y = 0; y < qrcode.size; y++) {
    for (uint8 x = 0; x < qrcode.size; x++) {
        if (qrcode_getModule(&qrcode, x, y) {
            Serial.print("**");
        } else {
            Serial.print("  ");
        }
    }
    Serial.print("\n");
}

What is Version, Error Correction and Mode?

A QR code is composed of many little squares, called modules, which represent encoded data, with additional error correction (allowing partially damaged QR codes to still be read).

The version of a QR code is a number between 1 and 40 (inclusive), which indicates the size of the QR code. The width and height of a QR code are always equal (it is square) and are equal to 4 * version + 17.

The level of error correction is a number between 0 and 3 (inclusive), or can be one of the symbolic names ECC_LOW, ECC_MEDIUM, ECC_QUARTILE and ECC_HIGH. Higher levels of error correction sacrifice data capacity, but allow a larger portion of the QR code to be damaged or unreadable.

The mode of a QR code is determined by the data being encoded. Each mode is encoded internally using a compact representation, so lower modes can contain more data.

  • NUMERIC: numbers (0-9)
  • ALPHANUMERIC: uppercase letters (A-Z), numbers (0-9), the space ( ), dollar sign ($), percent sign (%), asterisk (*), plus (+), minus (-), decimal point (.), slash (/) and colon (:).
  • BYTE: any character

Data Capacities

<table> <tr> <th rowspan="2">Version</th> <th rowspan="2">Size</th> <th rowspan="2">Error Correction</th> <th colspan="3">Mode</th> </tr> <tr> <th>Numeric</th> <th>Alphanumeric</th> <th>Byte</th> </tr> <tr> <td rowspan="4">1</td> <td rowspan="4">21 x 21</td> <td>LOW</td><td>41</td><td>25</td><td>17</td> </tr> <tr> <td>MEDIUM</td><td>34</td><td>20</td><td>14</td> </tr> <tr> <td>QUARTILE</td><td>27</td><td>16</td><td>11</td> </tr> <tr> <td>HIGH</td><td>17</td><td>10</td><td>7</td> </tr> <tr> <td rowspan="4">2</td> <td rowspan="4">25 x 25</td> <td>LOW</td><td>77</td><td>47</td><td>32</td> </tr> <tr> <td>MEDIUM</td><td>63</td><td>38</td><td>26</td> </tr> <tr> <td>QUARTILE</td><td>48</td><td>29</td><td>20</td> </tr> <tr> <td>HIGH</td><td>34</td><td>20</td><td>14</td> </tr> <tr> <td rowspan="4">3</td> <td rowspan="4">29 x 29</td> <td>LOW</td><td>127</td><td>77</td><td>53</td> </tr> <tr> <td>MEDIUM</td><td>101</td><td>61</td><td>42</td> </tr> <tr> <td>QUARTILE</td><td>77</td><td>47</td><td>32</td> </tr> <tr> <td>HIGH</td><td>58</td><td>35</td><td>24</td> </tr> <tr> <td rowspan="4">4</td> <td rowspan="4">33 x 33</td> <td>LOW</td><td>187</td><td>114</td><td>78</td> </tr> <tr> <td>MEDIUM</td><td>149</td><td>90</td><td>62</td> </tr> <tr> <td>QUARTILE</td><td>111</td><td>67</td><td>46</td> </tr> <tr> <td>HIGH</td><td>82</td><td>50</td><td>34</td> </tr> <tr> <td rowspan="4">5</td> <td rowspan="4">37 x 37</td> <td>LOW</td><td>255</td><td>154</td><td>106</td> </tr> <tr> <td>MEDIUM</td><td>202</td><td>122</td><td>84</td> </tr> <tr> <td>QUARTILE</td><td>144</td><td>87</td><td>60</td> </tr> <tr> <td>HIGH</td><td>106</td><td>64</td><td>44</td> </tr> <tr> <td rowspan="4">6</td> <td rowspan="4">41 x 41</td> <td>LOW</td><td>322</td><td>195</td><td>134</td> </tr> <tr> <td>MEDIUM</td><td>255</td><td>154</td><td>106</td> </tr> <tr> <td>QUARTILE</td><td>178</td><td>108</td><td>74</td> </tr> <tr> <td>HIGH</td><td>139</td><td>84</td><td>58</td> </tr> <tr> <td rowspan="4">7</td> <td rowspan="4">45 x 45</td> <td>LOW</td><td>370</td><td>224</td><td>154</td> </tr> <tr> <td>MEDIUM</td><td>293</td><td>178</td><td>122</td> </tr> <tr> <td>QUARTILE</td><td>207</td><td>125</td><td>86</td> </tr> <tr> <td>HIGH</td><td>154</td><td>93</td><td>64</td> </tr> <tr> <td rowspan="4">8</td> <td rowspan="4">49 x 49</td> <td>LOW</td><td>461</td><td>279</td><td>192</td> </tr> <tr> <td>MEDIUM</td><td>365</td><td>221</td><td>152</td> </tr> <tr> <td>QUARTILE</td><td>259</td><td>157</td><td>108</td> </tr> <tr> <td>HIGH</td><td>202</td><td>122</td><td>84</td> </tr> <tr> <td rowspan="4">9</td> <td rowspan="4">53 x 53</td> <td>LOW</td><td>552</td><td>335</td><td>230</td> </tr> <tr> <td>MEDIUM</td><td>432</td><td>262</td><td>180</td> </tr> <tr> <td>QUARTILE</td><td>312</td><td>189</td><td>130</td> </tr> <tr> <td>HIGH</td><td>235</td><td>143</td><td>98</td> </tr> <tr> <td rowspan="4">10</td> <td rowspan="4">57 x 57</td> <td>LOW</td><td>652</td><td>395</td><td>271</td> </tr> <tr> <td>MEDIUM</td><td>513</td><td>311</td><td>213</td> </tr> <tr> <td>QUARTILE</td><td>364</td><td>221</td><td>151</td> </tr> <tr> <td>HIGH</td><td>288</td><td>174</td><td>119</td> </tr> <tr> <td rowspan="4">11</td> <td rowspan="4">61 x 61</td> <td>LOW</td><td>772</td><td>468</td><td>321</td> </tr> <tr> <td>MEDIUM</td><td>604</td><td>366</td><td>251</td> </tr> <tr> <td>QUARTILE</td><td>427</td><td>259</td><td>177</td> </tr> <tr> <td>HIGH</td><td>331</td><td>200</td><td>137</td> </tr> <tr> <td rowspan="4">12</td> <td rowspan="4">65 x 65</td> <td>LOW</td><td>883</td><td>535</td><td>367</td> </tr> <tr> <td>MEDIUM</td><td>691</td><td>419</td><td>287</td> </tr> <tr> <td>QUARTILE</td><td>489</td><td>296</td><td>203</td> </tr> <tr> <td>HIGH</td><td>374</td><td>227</td><td>155</td> </tr> <tr> <td rowspan="4">13</td> <td rowspan="4">69 x 69</td> <td>LOW</td><td>1022</td><td>619</td><td>425</td> </tr> <tr> <td>MEDIUM</td><td>796</td><td>483</td><td>331</td> </tr> <tr> <td>QUARTILE</td><td>580</td><td>352</td><td>241</td> </tr> <tr> <td>HIGH</td><td>427</td><td>259</td><td>177</td> </tr> <tr> <td rowspan="4">14</td> <td rowspan="4">73 x 73</td> <td>LOW</td><td>1101</td><td>667</td><td>458</td> </tr> <tr> <td>MEDIUM</td><td>871</td><td>528</td><td>362</td> </tr> <tr> <td>QUARTILE</td><td>621</td><td>376</td><td>258</td> </tr> <tr> <td>HIGH</td><td>468</td><td>283</td><td>194</td> </tr> <tr> <td rowspan="4">15</td> <td rowspan="4">77 x 77</td> <td>LOW</td><td>1250</td><td>758</td><td>520</td> </tr> <tr> <td>MEDIUM</td><td>991</td><td>600</td><td>412</td> </tr> <tr> <td>QUARTILE</td><td>703</td><td>426</td><td>292</td> </tr> <tr> <td>HIGH</td><td>530</td><td>321</td><td>220</td> </tr> <tr> <td rowspan="4">16</td> <td rowspan="4">81 x 81</td> <td>LOW</td><td>1408</td><td>854</td><td>586</td> </tr> <tr> <td>MEDIUM</td><td>1082</td><td>656</td><td>450</td> </tr> <tr> <td>QUARTILE</td><td>775</td><td>470</td><td>322</td> </tr> <tr> <td>HIGH</td><td>602</td><td>365</td><td>250</td> </tr> <tr> <td rowspan="4">17</td> <td rowspan="4">85 x 85</td> <td>LOW</td><td>1548</td><td>938</td><td>644</td> </tr> <tr> <td>MEDIUM</td><td>1212</td><td>734</td><td>504</td> </tr> <tr> <td>QUARTILE</td><td>876</td><td>531</td><td>364</td> </tr> <tr> <td>HIGH</td><td>674</td><td>408</td><td>280</td> </tr> <tr> <td rowspan="4">18</td> <td rowspan="4">89 x 89</td> <td>LOW</td><td>1725</td><td>1046</td><td>718</td> </tr> <tr> <td>MEDIUM</td><td>1346</td><td>816</td><td>560</td> </tr> <tr> <td>QUARTILE</td><td>948</td><td>574</td><td>394</td> </tr> <tr> <td>HIGH</td><td>746</td><td>452</td><td>310</td> </tr> <tr> <td rowspan="

Related Skills

View on GitHub
GitHub Stars798
CategoryDevelopment
Updated1d ago
Forks237

Languages

C++

Security Score

85/100

Audited on Mar 27, 2026

No findings