Community project

Rabbit Drawing Display

ESP32
Photo of Rabbit Drawing Display
Generated with AI

jordannaidoo1

Published September 21, 2026

This project displays an animated eagle soaring across a scenic sky on a K10 display connected to an ESP32. The bird's wings flap smoothly between raised and lowered positions while clouds drift overhead and grass grounds the scene below.

Builders will receive a complete wiring diagram for connecting the K10 display to the ESP32, a full parts list, the Arduino firmware with animation logic, and step-by-step assembly instructions to get the drawing display running.

Wiring diagram

Assemble it in 1 step

1. Power the K10

Place the UNIHIKER K10 where you can see its built-in screen, then connect it to your computer with a USB cable. The animated eagle uses only the screen already built into the board, so no extra wires or parts are needed.

  • Keep the board still while watching so the moving wings are easy to see.
  • Do not force the USB plug; forcing it can damage the board connector.

Deploy the firmware

#include <Arduino.h>
#include "unihiker_k10.h"


// Forward declarations
void drawCloudsAndGround();
void drawEagle(int wingTipY, int wingMiddleY);
void drawFrame();

UNIHIKER_K10 k10;

const uint32_t SKY_BLUE = 0xBFE9FF;
const uint32_t CLOUD_WHITE = 0xFFFFFF;
const uint32_t DARK_BROWN = 0x4A2C2A;
const uint32_t FEATHER_BROWN = 0x7B4A2E;
const uint32_t LIGHT_BROWN = 0xB8794E;
const uint32_t GOLD = 0xF4BC36;
const uint32_t GRASS_GREEN = 0x66B85C;
const uint32_t BLACK = 0x1D1D1D;

unsigned long lastFrameMs = 0;
int frameNumber = 0;

void drawCloudsAndGround() {
  k10.canvas->canvasRectangle(0, 270, 240, 50, GRASS_GREEN, GRASS_GREEN, true);
  k10.canvas->canvasCircle(36, 48, 12, CLOUD_WHITE, CLOUD_WHITE, true);
  k10.canvas->canvasCircle(51, 43, 16, CLOUD_WHITE, CLOUD_WHITE, true);
  k10.canvas->canvasCircle(67, 49, 11, CLOUD_WHITE, CLOUD_WHITE, true);
  k10.canvas->canvasCircle(177, 62, 11, CLOUD_WHITE, CLOUD_WHITE, true);
  k10.canvas->canvasCircle(191, 56, 15, CLOUD_WHITE, CLOUD_WHITE, true);
  k10.canvas->canvasCircle(206, 62, 10, CLOUD_WHITE, CLOUD_WHITE, true);
}

void drawEagle(int wingTipY, int wingMiddleY) {
  drawCloudsAndGround();

  // The wings move between a raised and lowered position.
  k10.canvas->canvasSetLineWidth(18);
  k10.canvas->canvasLine(108, 155, 48, wingMiddleY, FEATHER_BROWN);
  k10.canvas->canvasLine(48, wingMiddleY, 22, wingTipY, FEATHER_BROWN);
  k10.canvas->canvasLine(132, 155, 192, wingMiddleY, FEATHER_BROWN);
  k10.canvas->canvasLine(192, wingMiddleY, 218, wingTipY, FEATHER_BROWN);
  k10.canvas->canvasSetLineWidth(2);
  k10.canvas->canvasLine(96, 146, 40, wingMiddleY + 10, LIGHT_BROWN);
  k10.canvas->canvasLine(144, 146, 200, wingMiddleY + 10, LIGHT_BROWN);

  k10.canvas->canvasCircle(120, 190, 48, FEATHER_BROWN, FEATHER_BROWN, true);
  k10.canvas->canvasCircle(120, 132, 38, CLOUD_WHITE, CLOUD_WHITE, true);
  k10.canvas->canvasCircle(120, 211, 30, LIGHT_BROWN, LIGHT_BROWN, true);

  k10.canvas->canvasSetLineWidth(11);
  k10.canvas->canvasLine(108, 226, 96, 261, CLOUD_WHITE);
  k10.canvas->canvasLine(120, 229, 120, 266, CLOUD_WHITE);
  k10.canvas->canvasLine(132, 226, 144, 261, CLOUD_WHITE);
  k10.canvas->canvasSetLineWidth(2);

  k10.canvas->canvasCircle(106, 128, 6, BLACK, BLACK, true);
  k10.canvas->canvasCircle(134, 128, 6, BLACK, BLACK, true);
  k10.canvas->canvasCircle(104, 126, 2, CLOUD_WHITE, CLOUD_WHITE, true);
  k10.canvas->canvasCircle(132, 126, 2, CLOUD_WHITE, CLOUD_WHITE, true);
  k10.canvas->canvasLine(98, 116, 111, 112, DARK_BROWN);
  k10.canvas->canvasLine(129, 112, 142, 116, DARK_BROWN);
  k10.canvas->canvasCircle(120, 144, 14, GOLD, GOLD, true);
  k10.canvas->canvasCircle(126, 148, 8, GOLD, GOLD, true);
  k10.canvas->canvasLine(119, 152, 128, 152, DARK_BROWN);

  k10.canvas->canvasSetLineWidth(5);
  k10.canvas->canvasLine(105, 239, 101, 253, GOLD);
  k10.canvas->canvasLine(101, 253, 92, 257, GOLD);
  k10.canvas->canvasLine(101, 253, 108, 258, GOLD);
  k10.canvas->canvasLine(135, 239, 139, 253, GOLD);
  k10.canvas->canvasLine(139, 253, 132, 258, GOLD);
  k10.canvas->canvasLine(139, 253, 148, 257, GOLD);
  k10.canvas->canvasSetLineWidth(2);

  k10.canvas->canvasText("Hello, Eagle!", 1, DARK_BROWN);
}

void drawFrame() {
  k10.canvas->canvasClear();
  const int tipHeights[] = {86, 112, 143, 112};
  const int middleHeights[] = {104, 116, 130, 116};
  const int phase = frameNumber % 4;
  drawEagle(tipHeights[phase], middleHeights[phase]);
  k10.canvas->updateCanvas();
  frameNumber++;
}

void setup() {
  k10.begin();
  k10.initScreen(2);
  k10.creatCanvas();
  k10.setScreenBackground(SKY_BLUE);
  drawFrame();
}

void loop() {
  const unsigned long now = millis();
  if (now - lastFrameMs >= 50) {
    lastFrameMs = now;
    drawFrame();
  }
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik