www.crystalfontz.com Open in urlscan Pro
66.45.165.37  Public Scan

Submitted URL: http://crystalfontz.com/
Effective URL: https://www.crystalfontz.com/
Submission Tags: tranco_l324
Submission: On March 27 via api from DE — Scanned from DE

Form analysis 5 forms found in the DOM

GET /search.php

<form action="/search.php" method="get">
  <input type="hidden" name="search-category" id="search-category" value="">
  <div class="flex">
    <label for="search-dropdown" class="mb-2 text-sm font-medium text-gray-900 sr-only dark:text-white">Your Email</label>
    <button id="dropdown-button" data-dropdown-toggle="dropdown"
      class="flex-shrink-0 z-10 inline-flex items-center py-2.5 px-4 text-sm font-medium text-center text-gray-900 bg-gray-100 border border-gray-300 rounded-l-lg hover:bg-gray-200 focus:ring-4 focus:outline-none focus:ring-gray-100 dark:bg-gray-700 dark:hover:bg-gray-600 dark:focus:ring-gray-700 dark:text-white dark:border-gray-600"
      type="button">All categories <svg class="w-2.5 h-2.5 ml-2.5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 10 6">
        <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"></path>
      </svg></button>
    <div id="dropdown" class="z-10 hidden bg-white divide-y divide-gray-100 rounded-lg shadow w-44 dark:bg-gray-700" data-popper-placement="bottom"
      style="position: absolute; inset: 0px auto auto 0px; margin: 0px; transform: translate(495px, 106px);">
      <ul class="py-2 text-sm text-gray-700 dark:text-gray-200" aria-labelledby="dropdown-button">
        <li>
          <button type="button" value="2" class="category-search-option inline-flex w-full px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white">Graphic USB LCDs</button>
        </li>
        <li>
          <button type="button" value="5" class="category-search-option inline-flex w-full px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white">Character USB LCDs</button>
        </li>
        <li>
          <button type="button" value="25" class="category-search-option inline-flex w-full px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white">TFT LCDs</button>
        </li>
        <li>
          <button type="button" value="30" class="category-search-option inline-flex w-full px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white">Graphic OLEDs</button>
        </li>
        <li>
          <button type="button" value="34" class="category-search-option inline-flex w-full px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white">Character OLEDs</button>
        </li>
        <li>
          <button type="button" value="21" class="category-search-option inline-flex w-full px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white">Character LCDs</button>
        </li>
        <li>
          <button type="button" value="519" class="category-search-option inline-flex w-full px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white">ePaper</button>
        </li>
        <li>
          <button type="button" value="47" class="category-search-option inline-flex w-full px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white">Accessories</button>
        </li>
      </ul>
    </div>
    <div class="relative w-full">
      <input type="search" id="search-dropdown"
        class="block p-2.5 w-full z-20 text-sm text-gray-900 bg-gray-50 rounded-r-lg border-l-gray-50 border-l-2 border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-l-gray-700  dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:border-blue-500"
        placeholder="Search Part Numbers, Dimensions, Resolution..." required="" name="q">
      <button type="submit"
        class="absolute top-0 right-0 p-2.5 text-sm font-medium h-full text-red bg-gray-200 rounded-r-lg border border-gray-400 hover:bg-gray-800 focus:ring-4 focus:outline-none focus:ring-red-300 dark:bg-gray-600 dark:hover:bg-gray-700 dark:focus:ring-red-200">
        <svg class="w-4 h-4" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20">
          <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"></path>
        </svg>
        <span class="sr-only">Search</span>
      </button>
    </div>
    <a id="adv-search-link" href="/products/product-search.php">Advanced Search</a>
  </div>
</form>

GET /products/find-my-display.php

<form method="get" action="/products/find-my-display.php" id="display-finder">
  <input type="hidden" name="search" value="1">
  <input type="hidden" id="display_type" name="display_type" value="">
  <input type="hidden" name="cols" id="cols" val="">
  <input type="hidden" name="rows" id="rows" val="">
  <div class="center" style="width:fit-content; margin:0 auto;">
    <h5 class="getting-started">Need some help choosing the right display?</h5>
    <div class="left get-started-cta"><a href="javascript: void(0);" id="get-started" class="waves-effect waves-light red btn-small">Get Started</a></div>
  </div>
  <div id="command-set" style="display:none; text-align:center">
    <div style="width:fit-content; margin: 0 auto;">
      <h5>Built-in Command Set?</h5>
      <div style="width: 350px;">These intelligent displays include extra processing power between the system controller and display controller to simplify communication.</div>
      <input type="hidden" name="cmd-set-answer" id="cmd-set-answer">
      <a href="javascript: void(0)" id="cmd-set-yes" class="bubble-links">Yes</a>
      <a href="javascript: void(0)" id="cmd-set-no" class="bubble-links">No</a>
    </div>
  </div>
  <div id="text-only" style="display:none;">
    <h5>Text Only?</h5>
    <input type="hidden" name="text-only-answer" id="text-only-answer">
    <a href="javascript: void(0)" id="text-only-yes" class="bubble-links">Yes</a>
    <a href="javascript: void(0)" id="text-only-no" class="bubble-links">No</a>
  </div>
  <div id="char-by-rows" style="display:none;">
    <h5>Character X Rows</h5>
    <input type="hidden" name="char-count-answer" id="char-count-answer">
    <a href="javascript: void(0)" class="bubble-links standard char-count">8x1</a>
    <a href="javascript: void(0)" class="bubble-links standard char-count">8x2</a>
    <a href="javascript: void(0)" class="bubble-links standard char-count">12x2</a>
    <a href="javascript: void(0)" class="bubble-links standard value-add char-count">16x2</a>
    <a href="javascript: void(0)" class="bubble-links standard char-count">16x1</a>
    <a href="javascript: void(0)" class="bubble-links standard char-count">16x4</a>
    <a href="javascript: void(0)" class="bubble-links standard value-add char-count">20x2</a>
    <a href="javascript: void(0)" class="bubble-links standard char-count">20x1</a>
    <a href="javascript: void(0)" class="bubble-links standard value-add char-count">20x4</a>
    <a href="javascript: void(0)" class="bubble-links standard char-count">24x2</a>
    <a href="javascript: void(0)" class="bubble-links standard char-count">40x2</a>
    <a href="javascript: void(0)" class="bubble-links standard char-count">40x4</a>
    <a href="javascript: void(0)" class="bubble-links">Any</a>
  </div>
  <div id="full-color" style="display:none;">
    <h5>Full Color?</h5>
    <input type="hidden" name="full-color-answer" id="full-color-answer">
    <a href="javascript: void(0)" id="full-color-yes" class="bubble-links color-choice color">Yes / RGB</a>
    <a href="javascript: void(0)" id="full-color-no" class="bubble-links color-choice monochrome">No / Monochrome</a>
    <a href="javascript: void(0)" id="full-color-ns" class="bubble-links color-choice">Not Sure</a>
  </div>
  <div id="diagonal-size" style="display:none; width: 400px; margin: 0 auto; text-align:left;">
    <h5>Diagonal Size?</h5> Between <input id="diagonal_min" type="number" max="9" min="1" class="browser-default"> and <input id="diagonal_max" type="number" max="12" min="1" class="browser-default"> inches <br>
    <a href="javascript: void(0)" class="help-me-buttons" style="" id="diagonal-next">Next</a>
  </div>
  <div id="resolution" style="display:none; width:150px; margin:0 auto;">
    <h5>Resolution?</h5>
    <select name="resolution" id="resolution-choice" class="browser-default">
      <option>Choose</option>
      <option>80x160</option>
      <option>128x128</option>
      <option>128x160</option>
      <option>176x220</option>
      <option>240x240</option>
      <option>240x320</option>
      <option>240x400</option>
      <option>320x240</option>
      <option>320x480</option>
      <option>480x128</option>
      <option>480x272</option>
      <option>480x480</option>
      <option>480x640</option>
      <option>720x1280</option>
      <option>800x480</option>
      <option>1024x600</option>
      <option>1280x800</option>
    </select>
    <input name="coldots" type="hidden" id="coldots">
    <input name="rowdots" type="hidden" id="rowdots">
    <br><br>
  </div>
  <div id="touchscreen" style="display:none; width:250px; text-align:left; margin: 0 auto;">
    <h5>Touchscreen?</h5>
    <input type="hidden" name="touchscreen" value="" id="touchscreen-answer">
    <input type="checkbox" value="Resistive" name="touchscreen-choice[]" id="resistive"><label for="resistive">Resistive</label><br>
    <input type="checkbox" value="Capacitive" name="touchscreen-choice[]" id="capacitive"><label for="capacitive">Capacitive</label><br>
    <input type="checkbox" value="None" name="touchscreen-choice[]" id="no-touchscreen"><label for="no-touchscreen">No</label><br><br>
    <a href="javascript: void(0)" class="help-me-buttons" style="" id="touchscreen-next">Next</a>
  </div>
  <div id="text-colors" style="display:none;">
    <h5>Which Color?</h5>
    <input type="hidden" name="fgbg[]" id="color-answer" value="">
    <a href="javascript: void(0)" class="bubble-links text-color wh-on-bl">White on Blue</a>
    <a href="javascript: void(0)" class="bubble-links text-color dk-on-gy">Dark on Gray</a>
    <a href="javascript: void(0)" class="bubble-links text-color dk-on-lg">Dark on Light Gray</a>
    <a href="javascript: void(0)" class="bubble-links text-color dk-on-yg">Dark on Yellow-Green</a>
    <a href="javascript: void(0)" class="bubble-links text-color dk-on-gr">Dark on Green</a>
    <a href="javascript: void(0)" class="bubble-links text-color yw-on-dk">Yellow-Green on Dark</a>
    <a href="javascript: void(0)" class="bubble-links text-color rd-on-dk">Red on Dark</a>
  </div>
  <div id="sunlight-readable" style="display:none; text-align:left; width:250px; margin:0 auto;">
    <h5>Readability</h5>
    <input type="checkbox" value="yes" name="sunreadable" id="sunlight"><label for="sunlight">Sunlight Readable</label><br>
    <input type="checkbox" value="yes" name="darkreadable" id="night"><label for="night">Night Readable</label><br>
    <a href="javascript: void(0)" class="help-me-buttons" id="readability-next">Next</a>
    <br class="clear-all">
  </div>
  <div id="interfaces" style="display:none; text-align:left; width:250px; margin:0 auto;">
    <h5>Interface</h5>
    <input type="checkbox" value="8" name="interfaces[]" id="dot-clk"><label for="dot-clk">USB</label><br>
    <input type="checkbox" value="1024" name="interfaces[]" id="dot-clk"><label for="dot-clk">DOT-CLK / RGB</label><br>
    <input type="checkbox" value="1" name="interfaces[]" id="rs232"><label for="rs232">RS232</label><br>
    <input type="checkbox" value="2" name="interfaces[]" id="lls"><label for="lls">Logic-Level Serial</label><br>
    <input type="checkbox" value="4" name="interfaces[]" id="spi"><label for="spi">SPI</label><br>
    <input type="checkbox" value="64" name="interfaces[]" id="i2c"><label for="i2c">I2C</label><br>
    <input type="checkbox" value="16" name="interfaces[]" id="8-bit"><label for="8-bit">8-bit Parallel</label><br>
    <input type="checkbox" value="128" name="interfaces[]" id="9-bit"><label for="9-bit">9-bit Parallel</label><br>
    <input type="checkbox" value="256" name="interfaces[]" id="16-bit"><label for="16-bit">16-bit Parallel</label><br>
    <input type="checkbox" value="512" name="interfaces[]" id="18-bit"><label for="18-bit">18-bit Parallel</label><br>
    <input type="checkbox" value="16384" name="interfaces[]" id="hdmi"><label for="hdmi">HDMI</label><br>
    <input type="checkbox" value="32768" name="interfaces[]" id="mipi"><label for="mipi">MIPI</label><br><br>
    <a href="javascript: void(0)" class="help-me-buttons" id="interface-next">Next</a>
    <br class="clear-all">
  </div>
  <div id="size" style="display:none; width:250px; margin:0 auto;">
    <h5>Dimensions</h5>
    <label class="help-me-txt" for="height">Height:</label><input type="number" name="overall_h_mm" class="browser-default help-me-input" id="height">mm<br>
    <label class="help-me-txt" for="width">Width:</label><input type="number" name="overall_w_mm" class="browser-default help-me-input" id="width">mm<br><br>
    <a href="javascript: void(0)" class="help-me-buttons" id="dimensions-next">Next</a>
    <br class="clear-all">
  </div>
</form>

Name: mc-embedded-subscribe-formPOST https://crystalfontz.us17.list-manage.com/subscribe/post?u=8a880dec17face7992ae6ef10&id=7268847031

<form action="https://crystalfontz.us17.list-manage.com/subscribe/post?u=8a880dec17face7992ae6ef10&amp;id=7268847031" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate="">
  <div id="mc_embed_signup_scroll">
    <label for="mce-EMAIL">Subscribe to our Newsletter</label>
    <input type="email" value="" name="EMAIL" class="email" id="mce-EMAIL" placeholder="email address" required="">
    <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
    <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_8a880dec17face7992ae6ef10_7268847031" tabindex="-1" value=""></div>
    <div class="clear"><input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" class="button"></div>
  </div>
</form>

Name: mc-embedded-subscribe-formPOST https://crystalfontz.us17.list-manage.com/subscribe/post?u=8a880dec17face7992ae6ef10&id=7268847031

<form action="https://crystalfontz.us17.list-manage.com/subscribe/post?u=8a880dec17face7992ae6ef10&amp;id=7268847031" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate="">
  <div id="mc_embed_signup_scroll">
    <label for="mce-EMAIL">Subscribe to our Newsletter</label>
    <input type="email" value="" name="EMAIL" class="email" id="mce-EMAIL" placeholder="email address" required="">
    <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
    <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_8a880dec17face7992ae6ef10_7268847031" tabindex="-1" value=""></div>
    <div class="clear"><input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" class="button"></div>
  </div>
</form>

Name: mc-embedded-subscribe-formPOST https://crystalfontz.us17.list-manage.com/subscribe/post?u=8a880dec17face7992ae6ef10&id=7268847031

<form action="https://crystalfontz.us17.list-manage.com/subscribe/post?u=8a880dec17face7992ae6ef10&amp;id=7268847031" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate="">
  <div id="mc_embed_signup_scroll">
    <label for="mce-EMAIL">Subscribe to our Newsletter</label>
    <input type="email" value="" name="EMAIL" class="email" id="mce-EMAIL" placeholder="email address" required="">
    <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
    <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_8a880dec17face7992ae6ef10_7268847031" tabindex="-1" value=""></div>
    <div class="clear"><input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" class="button"></div>
  </div>
</form>

Text Content

schedule Open M-T 8:30-4:30pm F 8:30-12pm PST
call 888.206.9720
speed Quick Order
lockSign In
shopping_cart Cart 0
Your Email All categories
 * Graphic USB LCDs
 * Character USB LCDs
 * TFT LCDs
 * Graphic OLEDs
 * Character OLEDs
 * Character LCDs
 * ePaper
 * Accessories

Search
Advanced Search

Open main menu
 * Home
 * Products
 * Solutions
 * Videos
 * Support
 * Blog
 * About Us
 * Contact

 * USB LCDs
   Crystalfontz USB LCDs are a perfect turn-key solution.
 * Character LCDs
   From 8x1 characters to 40x4 we have a large selection of Character LCD
   Displays
 * Graphic LCDs
   Standard Monochrome Graphic LCD Displays including 128x64 pixel, 320x240 and
   many more
 * Drive Bay LCDs
   Drive bay kits for our CFA835 Graphic LCD and All of our CFA Character LCDs
 * Discounted Products
   Reduced priced inventory. Highly discounted for quick sale

 * TFT Displays
   Full-Color, ranging in size from less than an inch to 10 inches.
 * ePaper Displays
   Ultra-low power, perfect for tags or labels.
 * OLED Displays
   Darker darks, brighter colors, as well as higher contrast ratios.
 * Development Kits & Accessories
   LCD Dev Kits, ePaper Dev Kits, EVE Kits, OLED Kits, Screws and Breakout
   Boards.
 * All LCD Products
   View our entire LCD product line. ePaper, OLEDs, TFTs and more.

 * LCD Software
   Download LCD Software, USB LCD Drivers, Test Software, Linux Example code
 * Development Kits & Accessories
   LCD Dev Kits, ePaper Dev Kits, EVE Kits, OLED Kits, Screws and Breakout
   Boards.
 * EVE Accelerated TFT Modules
   Combine all the power of the FTDI FT81x Embedded Video Engine (aka EVE) with
   beautiful, brilliant TFT Displays.
 * Custom Display Request Form
   Need a custom electronic display solution? Let us quote your next project.

 * Full-Color TFT Displays for Arduino
   Looking for a sharp full-color display that integrates and works optimally
   with an Arduino?
 * Low Power Displays
   Provide visual feedback or messaging while using as little electricity as
   possible.
 * Raspberry Pi Screens
   Want a display that easily integrates with rPi?


THE BEST EPAPER DISPLAYS FOR ANY PROJECT

We carry a large selection of USB LCDs, graphic LCDs, character LCDs, OLED
Displays, TFT Display Modules, ePaper Displays and EVE Accelerated TFT Displays.
If you're looking for something we don't have, please let us know and we'll do
our best to find it.

USB LCD Displays
Graphic LCD Displays
Character LCD Displays
TFT LCD Screens
OLED Displays
ePaper Displays

NEED SOME HELP CHOOSING THE RIGHT DISPLAY?

Get Started

BUILT-IN COMMAND SET?

These intelligent displays include extra processing power between the system
controller and display controller to simplify communication.
Yes No

TEXT ONLY?

Yes No

CHARACTER X ROWS

8x1 8x2 12x2 16x2 16x1 16x4 20x2 20x1 20x4 24x2 40x2 40x4 Any

FULL COLOR?

Yes / RGB No / Monochrome Not Sure

DIAGONAL SIZE?

Between and inches
Next

RESOLUTION?

Choose 80x160 128x128 128x160 176x220 240x240 240x320 240x400 320x240 320x480
480x128 480x272 480x480 480x640 720x1280 800x480 1024x600 1280x800



TOUCHSCREEN?

Resistive
Capacitive
No

Next

WHICH COLOR?

White on Blue Dark on Gray Dark on Light Gray Dark on Yellow-Green Dark on Green
Yellow-Green on Dark Red on Dark

READABILITY

Sunlight Readable
Night Readable
Next


INTERFACE

USB
DOT-CLK / RGB
RS232
Logic-Level Serial
SPI
I2C
8-bit Parallel
9-bit Parallel
16-bit Parallel
18-bit Parallel
HDMI
MIPI

Next


DIMENSIONS

Height:mm
Width:mm

Next



WHY CHOOSE CRYSTALFONTZ AMERICA FOR LCD DISPLAYS?

Crystalfontz America is the leading supplier of LCD, TFT, OLED and ePaper
display modules and accessories. We specialize in providing our customers the
very best in display products, cables and connectors.

As an ISO 9001:2015 certified company, we know the importance of quality. No
matter what type of display, or LCD module, we can help you get the best display
solution for your product or project.

Crystalfontz has been an LCD supplier since 1998 and has supplied innovative
display solutions to everyone from small do-it-yourself hobbyists and builders
to many top-tier companies. Our facility is located in Washington State and we
ship LCD display modules around the world.

EXCEPTIONAL QUALITY & SUPPORT

SHORT LEAD TIMES

GREAT PRICING AND OPTIONS

WHY HOBBYISTS & CREATORS
CHOOSE CRYSTALFONTZ

SINGLE & SMALL QUANTITY ORDERS

EXCELLENT RESOURCES & SUPPORT

VARIETY OF KITS AVAILABLE

Learn More

WHY ENGINEERS & MANUFACTURERS
CHOOSE CRYSTALFONTZ

DETAILED SPECIFICATIONS & RENDERINGS

RELIABLE MANUFACTURING & SUPPLY CHAIN

QUANTITY DISCOUNTS

Learn More

THE LATEST FROM OUR LCD BLOG


IN THE WILD: NETFLIX OPEN CONNECT – CFA635

In The Wild / By Kelsey

Recently, a Reddit post came to our attention in which someone had an old
Netflix server, and on the face of that server was an awfully familiar keypad.
Commenters confirmed in the thread that it is a CFA635.

We had to look into it more and find out if there was more information about
these servers! On the Open Connect home page, there was a photo of a whole rack
full of servers with CFA635s!

Have you spotted our keypads in the wild? Send us a photo, we’d love to see it!


INTELLIGENT LCDS IN SERVERS

We offer many great LCD options that are easy to integrate into servers. The
CFA635 (as used in the above servers) is a great choice – it uses a packet based
communication system to make sure no information is lost between it and the host
device.

Check out our comparison chart if you’re not sure which intelligent display to
use.


CONTACT US

If you have any questions, we can be reached at support@crystalfontz.com, we
also provide chat and telephone support Monday through Friday during our open
hours.

We love to hear about your projects! Find us around the web
(YouTube, Facebook, Instagram, LinkedIn,  Twitter, Forum) and let us know what
you’re working on.

Subscribe to our Newsletter


Kelsey

Kelsey is an engineer at Crystalfontz. She graduated from Gonzaga University
with a BS in Electrical Engineering. Kelsey’s roles at Crystalfontz include
customer support, documentation, product demonstrations, and design.

What our customers say about Kelsey:

“As a new user to the world of LCD electronics, Kelsey has been a Godsend in
providing the hand-holding I needed to get my project up and running despite my
own efforts at fouling things up! :-)” – Owen M

“Kelsey got me through changing code for a new LCD in only two short emails.” –
Phillip V

“The agent that I talked with (Kelsey), is technically sound and she knows what
she is doing. The support is what made my job easier to get started with the
different display technologies. Thank you!” – Vatsal S




CFA632 AND CFA634 CUSTOM CHARACTERS

Frequently Asked Questions, LCDs / By Kelsey

We recently received a question about setting custom characters on our CFA632
and CFA634 modules.

The datasheet includes an example of using custom characters which looks like
this:

\012\001\128\129\130\131\017\000\001\132\133\134\135
\025\000\000\000\001\003\000\031\031\031
\025\001\028\054\032\001\003\051\051\051
\025\002\014\027\049\032\032\047\032\047
\025\003\000\000\032\048\000\062\000\062
\025\004\031\031\031\000\003\001\000\000
\025\005\051\051\051\003\001\032\054\028
\025\006\047\032\047\032\032\049\027\014
\025\007\062\000\062\000\048\032\000\000

The customer wanted to know what was going on and what would the custom
characters look like.

HERE IS HOW OUR SUPPORT ENGINEER ANSWERED:

1. The example is in decimal rather than hexadecimal, so the lines that start
with \025 are the custom character setting lines.

2.  I’m not sure why the first line was put first rather than last, but it’s
showing the custom characters in action. If you have a CFA632 with the default
programming, it will show the Crystalfontz logo.

\012 clears the display

\001 sets the cursor location to the top left

\0128-\131 send that custom character to the screen

\017\000\001\ sets the cursor location to the 0th column and the 1st (after 0,
aka the 2nd) row

\0132-\135 send that custom character to the screen

We recommend using CFTest for getting a feeling for these modules and how the
commands work. It can be found
here: https://www.crystalfontz.com/product/cfautilities-cfa-lcd-utilities

3. Then the next 8 lines are setting up custom characters. Those custom
characters are the ones that make the Crystalfontz logo. 

The format of those lines is the command number (\025) then the character number
(e.g., \001), then the character bit map.
4. I copied the example from the datasheet and sent it using CFTest, the below
photo shows the result:


FOLLOW UP QUESTIONS

HOW DO I MAKE THE BITMAPS?

As described in the datasheet “data0-data7 are the bitmap information for this
character. Any value is valid between 0 and 63. The MSB is at the left of the
character cell of the row and the LSB is at the right of the character cell.
data0 is at the top of the cell, data7 is at the bottom of the cell.”

Each individual character space on these modules is 6 pixels x 8 pixels (though
the included font is 5×7 with a line to separate characters). data0 controls the
top row of pixels, through to data7 controlling the bottom row of pixels. The
values of data0–data7 describe which pixels are on and which are off. Because
there are 6 pixels, each with two possible states we have 2^6 = 64 possible
values for each of the data bits (but remember that 0 is included, so 63 is the
maximum value). If you send a 0, the entire row will be blank. Sending a 63
means all 6 pixels will be dark. This might be easier to think about in binary
rather than decimal.

\b00111111 = \063 = a fully dark row (all 6 pixels in the 1 or on state)
\b00101010 = \042 = every other pixel on (first pixel on)
\b00010101 = \021 = every other pixel on (first pixel off)
\b00000000 = \000 = all pixels off



CONTACT US

If you have any questions, we can be reached at support@crystalfontz.com, we
also provide chat and telephone support Monday through Friday during our open
hours.

We love to hear about your projects! Find us around the web
(YouTube, Facebook, Instagram, LinkedIn,  Twitter, Forum) and let us know what
you’re working on.

Subscribe to our Newsletter


Kelsey

Kelsey is an engineer at Crystalfontz. She graduated from Gonzaga University
with a BS in Electrical Engineering. Kelsey’s roles at Crystalfontz include
customer support, documentation, product demonstrations, and design.

What our customers say about Kelsey:

“As a new user to the world of LCD electronics, Kelsey has been a Godsend in
providing the hand-holding I needed to get my project up and running despite my
own efforts at fouling things up! :-)” – Owen M

“Kelsey got me through changing code for a new LCD in only two short emails.” –
Phillip V

“The agent that I talked with (Kelsey), is technically sound and she knows what
she is doing. The support is what made my job easier to get started with the
different display technologies. Thank you!” – Vatsal S




DUAL VOLTMETER FOR RV ELECTRICAL SYSTEMS

Arduino, In The Wild, LCDs, Tutorial / By Kelsey

This post was written by Brent, one of Crystalfontz’s engineers.


BRENT’S VOLTMETER BUILD

I have an RV that has both a vehicle electrical system and a camper electrical
system. I wanted a way to see the voltages of both systems at a glance while
driving.

I tried some cheesey voltmeters from e-bay and some other cheesey voltmeters
from Amazon but I was not happy with the accuracy or stability. I was not able
to find a meter that would work well in a vehicle, show two voltages, and have
good accuracy.

Time to make my own:

https://www.youtube.com/watch?v=lGkzsqYgikEVideo can’t be loaded because
JavaScript is disabled: Dual Voltmeter
(https://www.youtube.com/watch?v=lGkzsqYgikE)

RATIONALE

Why go to the trouble of making my own meter?

 * Visibility: I assembled all the van electrics (solar, B2B charger, 400AH
   LiFePo battery bank, inverter, etc), and while they seem to work fine, it is
   comforting to be able to keep an eye on them.
 * Trust: I wanted a meter that would read really close to my Fluke DMM. This
   meter does. The various cheesey off-the-shelf meters I got from the usual
   suspects on eBay and Amazon did not even agree with each other, let alone a
   DMM.
 * History: I love to see the time history of what has been happening in the
   last few minutes.
 * Fun: It sounded like a fun project.

DIFFICULTY

If you have access to a 3d printer and a soldering iron you can build this
project. The hardware is pretty straight forward. The firmware is a bit more
involved, but you can use the unmodified Arduino source code to get it running.


HARDWARE

First off, I needed a good ADC. After searching around on Digi-Key, I came
across the Texas Instruments ADS1115 series, which is a 16-bit ADC with good
reference built in. The built-in reference is important – your ADC system will
never be better than the reference it measures against. Digi-Key did not have
any bare chips in stock so I kept looking. It turns out that AdaFruit and
DFRobot make breakout boards for the ADS1115. The breakout board is even better
for this application since that would allow me to skip sourcing a board and
small SMT soldering. At the time, the DFRobot had stock so that is what I went
with.

For the display, I wanted something low power, and also able to be read in the
dark. As an employee of Crystalfontz, I was aware of the CFAG12864T3/U3, which
has super low power consumption, can be read in sunlight, and has a backlight
that makes it readable in the dark.

For a controller I chose the Adafruit Metro Mini 328 – Arduino-Compatible – 5V
16MHz. It is compact, emulates an UNO and is available. Plus, it can be
converted to 3.3v logic level which avoids additional voltage changes for the
display.

Some short jumper wires.

For the power supply I chose a CUI VX7805-500-W which has a large input voltage
range (compatible with automotive supplies, which is not trivial), has high
efficiency and a low standby draw, and puts out a nice, clean 5v.

To scale the “12v” automotive (typically 9v ~ 14v) analog inputs to the 5v ADC
range, I used 15K + 5K resistors to make a 4:1 divider. This means that a
voltage up to 16v can be read. Larger voltages will not damage the ADC input
since the 15K resistor limits the current. I used 0.1% tolerance resistors,
which to the limit of my ability to measure, are exact.  15K: Vishay / Dale
RN55C1502BRE6 . 5K:  Vishay / Dale RN55C5001BB14 .

There is also a 5K pot that I used in series with the backlight current limiting
resistor so the backlight can be dimmed, which is nice for night driving.

PARTS LIST

 * DFRobot DFR0553 ADS1115 ADC breakout board
 * AdaFruit Metro Mini 328
 * Wide range in, 5v out power converter
 * Precision 15K resistor (4x)
 * Precision 5K resistor (4x)
 * Backlight limiting resistor (typical)
 * Backlight dimming potentiometer (typical)
 * 128×64 backlit LCD with breakout board (provided by Crystalfontz)
 * Short jumper wires (provided by Crystalfontz)
 * 3d printed case
 * Various solder, heat shrink tubing, etc.

The total cost of the parts was ~$US60 at the time I ordered. All parts used in
this build were purchased or supplied free of charge by Crystalfontz for the
purpose of creating this tutorial.

WIRING

Note: While Brent didn’t do this, we would recommend reducing the I/O voltages
from the Metro Mini to the display from 5v down to 3.3v. This can be done by
opening the 5v jumper on the back of the Metro Mini and closing the 3.3v jumper.
The LCD and the ADC both expect 3.3v logic. Want more information about logic
level? Read our post: On the Level: Arduino and Displays

DIFFERENTIAL MODE

Since I only wanted two channels and the four-channel ADS1115 has a differential
mode, I ran separate wires to the positive and negative terminals of the vehicle
and camper batteries. If your grounds are perfect and there were no noise
sources differential mode would make no difference. Using differential mode will
ignore any voltage drop on the ground cable and will also help to minimize
common mode noise. We are going to try to display millivolts and the automotive
environment is plenty noisy, so we want to stack the deck as far in our favor as
we can.

CONSTRUCTION

I mounted the Metro directly to the back of the LCD, alongside the LCD’s
interface board:

I soldered the voltage divider resistors directly to the ADC board:

Then used heat shrink to make sure there were no shorts:

The parts fit together in a compact package:

CASE

I made the case in OpenSCAD — which is both fun and frustrating:

The source and STL files are available here:
https://baxsie.com/images/CFA/Dual_Voltmeter/Dual_Voltmeter_Case.zip

Also on Thingiverse: https://www.thingiverse.com/thing:5476060

Then it was just a matter of some 3D Tetris to place all the components into the
case. The case front and back are sized so that the ridges of the 3D printing
kind of snap it together:

Here is a picture of the completed hardware, mounted in the package tray above
the driver seat:


FIRMWARE

As much fun as assembling the hardware is, the real star of this show is the
firmware. Here is the full source, which can be opened with the Arduino IDE:
https://github.com/crystalfontz/DualVoltmeter

Of course, you can wade through my code and try to figure out what I did, but I
will break it into sections and try to describe each section in words that can
be understood.

SETTING UP THE ADC

We are using “GAIN_ONE” setting of the ADS1115. This means that each bit
represents 1/8 of a millivolt (0.125mV = 125µV). The ADC is 16-bit signed so
that gives us a range of -32768 to +32767 ADC ticks which corresponds to -4.096v
to +4.096v differential input voltage. Keep in mind that we have a 4:1 divider
in front of the ADC so the actual voltage range we can read is -16.384v to
+16.384v, which makes each ADC tick is 0.125mV * 4 = 0.5mV.

The basic unit that we will use and store is “half_mv”. As an example, one volt
will be 2000 ADC ticks. Each reading can fit in a 16-bit signed integer.

GETTING THE DATA FROM THE ADS1115 ADC

We are using the ADS1115 setting “RATE_ADS1115_64SPS”. Each conversion will be
complete after 17.5mS.

To keep the code simple and make sure we sample the ADC channels at even
intervals, the ADC is read in a timer ISR. The ISR gets hit 40 times a second –
every 25mS. The ISR takes about 2mS, so approximately 8% of the processor time
is devoted to reading the ADC.

The ISR first reads the ADC’s completed previous conversion, then tells the ADC
to start a conversion on the other channel then exits. The ISR reads the vehicle
channel, starts the camper channel then exits. Next time it reads the camper
channel (which is by now guaranteed to be complete) and starts the vehicle
channel. Repeat.

After it has read both channels – which takes two passes through the ISR — 50ms
— it lets the foreground know that both channels have new data available.

PROCESSING THE DATA FOR THE NUMERIC READOUT

I want to display the current reading in 5 digits: VV.mmm I’m not using any
floating point, so we want to have a number that represents millivolts. Our base
data is in half_mv, so we can just divide it by two. However, a straight shift
always loses the least significant bit. If we add 1 before the shift then we can
get rounding instead of truncation.

One of the problems with a digital display is bobble in the last digit. No
matter how perfect the signal, the analog circuit, the ADC, and any amount of
averaging, there will be voltage values that switch randomly between two
readings. The way to solve it is by implementing hysteresis. You do not allow
the new reading to change unless it is a certain number of ticks from the
previous reading. By changing that number of ticks, you can settle the display
digits.

Here is the code:

int16_t Hysteresis(int16_t &current,
                   int16_t &previous,
                   int16_t dead_zone_ticks)
  {
  if(current < previous)
    {
    //Going down. Is it big enough to make us change?
    if(dead_zone_ticks <= (previous-current))
      {
      //Larger change, move but at the top of the dead band
      current+=dead_zone_ticks;
      //remember our new base line
      previous=current;
      }
    else
      {
      //Small change, do not move.
      current=previous;
      }
    }
  else
    {
    //Going up. Is it big enough to make us change?
    if(dead_zone_ticks <= (current-previous))
      {
      //Larger change, move but at the bottom of the dead band
      current-=dead_zone_ticks;
      //remember our new base line
      previous=current;
      }
    else
      {
      //Small change, do not move.
      current=previous;
      }
    }
  }


I use dead_zone_ticks of 6 so any change within 3mV of the previous reading will
not change the display reading. This makes a much more stable and readable
display for slowly changing or static readings.

PROCESSING THE DATA FOR THE STRIP CHART

Part of the challenge is to display the data in a way that a quick glance can
give me a lot of information about what is going on. To make that work I keep a
history that is 47 entries long – this matches the 47 pixel width of the strip
chart. Each history entry keeps track of the maximum and minimum readings that
have occurred within the sampling period. After the sampling period is complete,
the history is shifted one notch and the process repeats.

For my purposes, I like each pixel to represent 2 seconds of data, which gives 1
minute, 34 seconds of history on the graph. This can be changed in the code.
Since our sample rate is 50ms, then 2S/50mS = 40 ADC max and min samples get
stored in each history entry. Each history entry is represented by one
horizontal pixel bar, with the length of the bar being determined by the maximum
and the minimum readings observed within those 40 samples.

AUTOMATICALLY SCALING THE GRAPH AREA

At first glance, we could make the graph area represent 0v to 17v, which would
map nicely to out 0v to 16.384v range. Each of the 39 vertical pixels would
represent 17/39 ≅ 0.43 volts. The problem is that the voltage would have to
change almost a half of a volt to move one pixel. Most readings would be a
straight line.

For screen space reasons, I decided to make the top and bottom scales of the
graph area integer volts. I scan the 47 bins in the history and find the global
max and global min. Then I take the next larger integer for the top limit, and
the next smaller integer from the bottom limit. As an example, if all the
readings are above 13 and below 14 then each of the 39 vertical pixels would
represent 1/39 ≅ 0.025 volts.

CALCULATING THE BAR GRAPH HEIGHT – NO FLOATING POINT

I never want to use floating point on a tiny processor like the AVR. For most
calculations you really do not need to. The trick is to use ratios and use
parentheses to force the multiply before the divide. Use 32-bit operations for
the intermediate results to make sure you do not overflow:

//Convert from (data_max-data_min) in half_mV land to (y2-y1) land in pixels
min_position_in_pixels=
  ((int32_t)min_half_delta*(int32_t)(y2-y1))/((int32_t)(data_max-data_min));


This gives the pixel coordinate from the half_mv ADC reading in one step without
any floating point. The Metro Mini can do this twice, once for the max and again
for the min in ~875uS.

DRAWING THE DATA ON THE LCD

To keep drawing simple and fast I use a section of the AVR’s memory as a screen
buffer (uint8_t framebuffer[FRAME_HEIGHT_PIXELS][FRAME_WIDTH_BYTES];). Each
64-pixel wide line is stored horizontally in 8 bytes. There are 128 lines. 8*128
= 1024 bytes overall.

I created the background in Photoshop as a BMP:

and converted it to an array by using Image2Code (
https://www.crystalfontz.com/product/image2code ). This is stored in the
processor’s flash  (images.h):

const uint8_t Background_Bitmap[1024] PROGMEM =
  {
  0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x80,0x00,
  . . .
  0x3C,0x00,0x00,0x00,0x00,0x00,0x82,0x00,
  };


At the beginning of every frame, the first thing is to copy the bitmap from
flash to the RAM framebuffer:

void logo_to_framebuffer(void)
  {
  // ~ 583uS. Bytes configured correctly using Image2Code -- refer to
  // Image2Code_Settings.png
  memcpy_P(framebuffer,Background_Bitmap,sizeof(framebuffer));
  }


Then I draw in the other elements: the two voltages, two strip charts, and the
scales.

To draw the voltages in the large font, first I convert the binary value to a
string (Voltage_To_Strings()) then I use put_big_number()to print the string to
the RAM framebuffer. The chart scales are similar, except using
Scale_To_String() and put_string().

The strip chart is plotted using Strip_Chart().

Once everything is rendered in the RAM framebuffer,
Send_Framebuffer_To_Display() copies the framebuffer to the physical LCD
(~2.7mS).


CONCLUSION

I have used this meter on a few trips, and I really like it for keeping an eye
on the state of the camper’s electrical system. If you want to read more about
other builds, check out vanmargrit.com


CONTACT US

If you have any questions, we can be reached at support@crystalfontz.com, we
also provide chat and telephone support Monday through Friday during our open
hours.

We love to hear about your projects! Find us around the web
(YouTube, Facebook, Instagram, LinkedIn,  Twitter, Forum) and let us know what
you’re working on.

Subscribe to our Newsletter


Kelsey

Kelsey is an engineer at Crystalfontz. She graduated from Gonzaga University
with a BS in Electrical Engineering. Kelsey’s roles at Crystalfontz include
customer support, documentation, product demonstrations, and design.

What our customers say about Kelsey:

“As a new user to the world of LCD electronics, Kelsey has been a Godsend in
providing the hand-holding I needed to get my project up and running despite my
own efforts at fouling things up! :-)” – Owen M

“Kelsey got me through changing code for a new LCD in only two short emails.” –
Phillip V

“The agent that I talked with (Kelsey), is technically sound and she knows what
she is doing. The support is what made my job easier to get started with the
different display technologies. Thank you!” – Vatsal S




BUY EVERYTHING YOU NEED TO GET UP AND RUNNING

Browse our catalog of LCD development kits, breakout boards, cables, ZIF
connectors and all of the LCD software and drivers you need to develop your
product or project. We are located in the U.S. so we can get product to you
fast!

LCD Development Kits

Breakout Boards

Cables & Wiring

ZIF Connectors

LCD Software

USB LCD Drivers

Shop LCD Accessories Now


WHAT OUR CUSTOMERS ARE SAYING

Robert Howell

Quick response and answer completely answered my resquest!
aydin karatas

quick ! thanks
Christian Griffin

Very responsive and helpful support - I received a response that related
directly to my question and offered contextual advice, not some canned
copy-paste response like you receive from so many other online support channels.
Spike kito

Had issues with ePaper display but support stuck with me and helped me resolve
the issue.
Read All Our Google Reviews
Finding the LCD you need?

Need some help?

 * Search by Tech Spec
   Search by size, controller, interface, etc
 * Ask our product support team
   We're here to help! 8:30-4:30 PST 888.206.9720
 * Product Notices
   Sign-up for part change or update notices
 * Newest products!
   We're adding new displays all the time.

Purchasing Resources
 * Quick Order
   Know your part number? Checkout fast!
 * Request a Quote
   Get pricing and lead time info!
 * Our ISO 9001:2015 Certificate
   Of course we're ISO 9001:2015 certified
 * Conflict Mineral Reporting Template
   Download our latest CMRT
 * California Prop 65
   Proposition 65 Information
 * Payment Information
   We accept many payment methods

Builder Resources
 * Crystalfontz Blog
 * LCD Glossary
 * LCD Support Forum
 * LCD Controller Datasheets

Popular LCD Searches
 * Smallest LCD Displays
 * Arduino ePaper Kits
 * Raspberry PI Screens
 * Transparent OLED
 * EVE Accelerated TFTs
 * Arduino LCD Displays
 * Low Power Displays
 * Custom Digital Displays

LCD SOFTWARE

Download LCD Drivers & utilities for our hardware.

TECH FORUM

Get information and support from our user community.

TECH SUPPORT

Contact us for free product technical support

Crystalfontz America, Inc.
12412 East Saltese Avenue,
Spokane Valley, WA 99216-0357
Hours: M-T, 8:30am - 4:30pm F: 8-12 pm PST
Tel: (509) 892-1200
Fax: (509) 892-1203
Toll Free: (888) 206-9720
sales@crystalfontz.com
© 1999-2024 Crystalfontz. All rights reserved.

 * Home
 * Products
 * Tech Support
 * News
 * About
 * Contact
 * Policies

speed Quick Order
lockSign In
shopping_cart Cart 0