DeskBot — Aitewinrobot Esp32C3 Supermini simulation

An interactive Aitewinrobot Esp32C3 Supermini circuit simulation you can run free in your browser on Velxio, by vichu-er.

Components

Sketch code

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// =====================================================
// DISPLAY CONFIGURATION
// =====================================================

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

// =====================================================
// HARDWARE PINS
// =====================================================

#define OLED_SDA 6
#define OLED_SCL 7
#define TOUCH_PIN 3

// =====================================================
// DISPLAY STATE
// =====================================================

Adafruit_SSD1306 display(
  SCREEN_WIDTH,
  SCREEN_HEIGHT,
  &Wire,
  -1
);

// =====================================================
// MOOD STATE
// =====================================================

enum Mood {
  NORMAL,
  HAPPY,
  LOVE,
  CURIOUS,
  DIZZY,
  ANGRY,
  SLEEPING
};

Mood currentMood = NORMAL;

// =====================================================
// RUNTIME STATE
// =====================================================

int lastTouchState = LOW;
unsigned long lastActivity = 0;

bool isSleeping = false;
unsigned long sleepStartTime = 0;
bool screenOff = false;

unsigned long nextIdleAction = 5000;
unsigned long nextBlink = 3000;

int tapCount = 0;
unsigned long lastTapTime = 0;
bool waitingForTapReaction = false;

unsigned long touchStartTime = 0;
bool angryTriggered = false;

// =====================================================
// SMOOTH ANIMATION EASING
// =====================================================

float easeInOut(float progress) {

  // Keep progress safe
  progress = constrain(progress, 0.0, 1.0);

  return progress * progress *
         (3.0 - 2.0 * progress);
}

void printMood() {
  Serial.print("Mood: ");

  switch (currentMood) {
    case NORMAL:
      Serial.println("NORMAL");
      break;

    case HAPPY:
      Serial.println("HAPPY");
      break;

    case LOVE:
      Serial.println("LOVE");
      break;

    case CURIOUS:
      Serial.println("CURIOUS");
      break;

    case DIZZY:
      Serial.println("DIZZY");
      break;

    case ANGRY:
      Serial.println("ANGRY");
      break;

    case SLEEPING:
      Serial.println("SLEEPING");
      break;
  }
}

// Draw the eyes
// =====================================================
// MOCHI EYES
// Master eye shape used by all open-eye expressions
// =====================================================

void drawMochiEyes(int eyeOffsetX = 0, int eyeOffsetY = 0) {

  // LEFT EYE
  display.fillRoundRect(
    24 + eyeOffsetX,
    15 + eyeOffsetY,
    24,
    35,
    9,
    SSD1306_WHITE
  );

  // RIGHT EYE
  display.fillRoundRect(
    80 + eyeOffsetX,
    15 + eyeOffsetY,
    24,
    35,
    9,
    SSD1306_WHITE
  );
}

// =====================================================
// MOCHI PUPILS
// Master pupil shape used by all expressions
// =====================================================

void drawMochiPupil(
  int centerX,
  int centerY,
  int offsetX = 0,
  int

More projects by vichu-er