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
Wiring

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);
}
