Arduino Project

BitFriend

Course Introduction

In this project, you’ll use an Arduino R4 UNO, an OLED display, buttons, a buzzer, and EEPROM to create an interactive virtual pet game.

Navigate menus to feed, play, dress, or put your pet to sleep, with animations displayed on the OLED. Button inputs control actions, while the buzzer provides audio feedback. The pet’s stats (hunger, happiness, sleep) are saved in EEPROM for persistence between sessions.

Note

If this is your first time working with an Arduino project, we recommend downloading and reviewing the basic materials first.

1.1 Install Arduino IDE(Important)
1.2 Introduction of Arduino IDE

Required Components

In this project, we need the following components:

SN

COMPONENT INTRODUCTION

QUANTITY

PURCHASE LINK

1

Arduino UNO R4 Minima

1

2

USB Type-C cable

1

×

3

Breadboard

1

4

Wires

Several

5

Button

4

6

OLED Display Module

1

7

Active Buzzer

1

×

Wiring

BitFriend_bb.png__PID:f31789dd-2560-479a-a4be-1ca65e567a87

Common Connections:

OLED Display Module
SDA: Connect to A4 on the Arduino. SCK: Connect to A5 on the Arduino. GND: Connect to breadboard’s negative power bus. VCC: Connect to breadboard’s red power bus.

Button button1: Connect to the breadboard’s negative power bus, and the other end to 2 on the Arduino board. button2: Connect to the breadboard’s negative power bus, and the other end to 10 on the Arduino board. button3: Connect to the breadboard’s negative power bus, and the other end to 11 on the Arduino board. button4: Connect to the breadboard’s negative power bus, and the other end to 12 on the Arduino board.

Active Buzzer +: Connect to 3 on the Arduino. -: Connect to breadboard’s negative power bus.

Writing the Code

Note
You can copy this code into the Arduino IDE.
Use the C code BitFriend . You can click here BitFriend.zip to download it. To install the library, use the Arduino Library Manager and search for Adafruit SSD1306 and Adafruit GFX and EEPROM and install it. Don’t forget to select the board(Arduino UNO R4 Minima) and the correct port before clicking the Upload button.


#include 

Servo servo;

const int servoPin = 9;
const int motorIn1 = 5;  // TA6586 IN1 (FI)
const int motorIn2 = 6;  // TA6586 IN2 (BI)
const int buttonPin = 2;

bool isRunning = false;
bool lastButtonState = HIGH;

int servoPos = 0;    // Current servo position
int servoStep = 2;   // Servo movement step
unsigned long lastServoMove = 0;
const unsigned long servoInterval = 15; // Servo movement interval (ms)

void setup() {
  servo.attach(servoPin);
  pinMode(motorIn1, OUTPUT);
  pinMode(motorIn2, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP); // Use internal pull-up resistor
  stopSystem();
}

void loop() {
  bool buttonState = digitalRead(buttonPin);

  // Button toggle logic (falling edge detection)
  if (lastButtonState == HIGH && buttonState == LOW) {
    isRunning = !isRunning;
    delay(200); // Debounce
  }
  lastButtonState = buttonState;

  if (isRunning) {
    // Keep water pump running
    digitalWrite(motorIn1, HIGH);
    digitalWrite(motorIn2, LOW);

    // Non-blocking servo sweeping
    unsigned long currentMillis = millis();
    if (currentMillis - lastServoMove >= servoInterval) {
      lastServoMove = currentMillis;
      servoPos += servoStep;
      if (servoPos >= 180 || servoPos <= 0) {
        servoStep = -servoStep;
      }
      servo.write(servoPos);
    }

  } else {
    stopSystem();
  }
}

void stopSystem() {
  // Stop water pump
  digitalWrite(motorIn1, LOW);
  digitalWrite(motorIn2, LOW);

  // Stop servo at current position
  servo.write(servoPos);
}