Are you tired of the clutter and complexity of your home appliances? Do you want to simplify your life and embrace minimalism? Do you have a passion for DIY projects and coding? If you answered yes to any of these questions, then this article is for you!
In this article, I will show you how to rewrite all your home electronics using microcontrollers. Microcontrollers are small, cheap and versatile devices that can be programmed to perform various tasks. You can use them to replace your washing machine, microwave, oven, air fryer and more!
By following this tutorial, you will not only save money and space, but also have fun and learn new skills. You will also impress your friends and family with your ingenious creations. So let’s get started!
Washing Machine
A washing machine is a device that cleans your clothes by spinning them in water and detergent. But who needs a bulky and noisy machine when you can use a microcontroller to do the same thing?
To make your own washing machine, you will need:
- An Arduino Uno (or any other compatible microcontroller)
- A water pump
- A water valve
- A water level sensor
- A rotary encoder
- A DC motor
- A plastic bucket
- Some wires and connectors
The basic idea is to use the Arduino to control the water pump, valve, sensor and motor. The rotary encoder will allow you to select the washing mode (normal, delicate, etc.) and the duration. The water pump will fill the bucket with water from a faucet, and the valve will drain it when done. The water level sensor will prevent overflow and leakage. The motor will spin the bucket with your clothes inside.
Here is the code for the Arduino:
// Define the pins for the components
#define PUMP_PIN 2 // Water pump connected to pin 2
#define VALVE_PIN 3 // Water valve connected to pin 3
#define SENSOR_PIN A0 // Water level sensor connected to analog pin A0
#define ENCODER_PIN_A 4 // Rotary encoder pin A connected to pin 4
#define ENCODER_PIN_B 5 // Rotary encoder pin B connected to pin 5
#define MOTOR_PIN 6 // DC motor connected to pin 6
// Define some constants for the washing modes
#define NORMAL_MODE 0 // Normal mode: 10 minutes of washing, high speed
#define DELICATE_MODE 1 // Delicate mode: 5 minutes of washing, low speed
#define RINSE_MODE 2 // Rinse mode: 5 minutes of rinsing, high speed
#define SPIN_MODE 3 // Spin mode: 5 minutes of spinning, high speed
// Define some variables for the state of the system
int mode = NORMAL_MODE; // The current washing mode
int duration = 10; // The duration of the current mode in minutes
int speed = 255; // The speed of the motor (0-255)
bool running = false; // Whether the system is running or not
int waterLevel = 0; // The water level in the bucket (0-1023)
// Define some variables for the rotary encoder
int encoderValue = 0; // The current value of the encoder
int lastEncoderValue = 0; // The last value of the encoder
int encoderPinALast = LOW; // The last state of encoder pin A
void setup() {
// Set the pins as input or output
pinMode(PUMP_PIN, OUTPUT);
pinMode(VALVE_PIN, OUTPUT);
pinMode(SENSOR_PIN, INPUT);
pinMode(ENCODER_PIN_A, INPUT);
pinMode(ENCODER_PIN_B, INPUT);
pinMode(MOTOR_PIN, OUTPUT);
// Start the serial monitor for debugging
Serial.begin(9600);
}
void loop() {
// Read the water level from the sensor
waterLevel = analogRead(SENSOR_PIN);
// Read the rotary encoder and update the mode and duration
readEncoder();
// If the system is running, execute the washing cycle
if (running) {
washCycle();
}
// Print the current state of the system to the serial monitor
printState();
}
// A function to read the rotary encoder and update the mode and duration
void readEncoder() {
// Read the current state of encoder pin A
int encoderPinA = digitalRead(ENCODER_PIN_A);
// If encoder pin A has changed from low to high
if ((encoderPinALast == LOW) && (encoderPinA == HIGH)) {
// Read the current state of encoder pin B
int encoderPinB = digitalRead(ENCODER_PIN_B);
// If encoder pin B is low, increase the encoder value
if (encoderPinB == LOW) {
encoderValue++;
}
// If encoder pin B is high, decrease the encoder value
else {
encoderValue--;
}
}
// Update the last state of encoder pin A
encoderPinALast = encoderPinA;
// If the encoder value has changed
if (encoderValue != lastEncoderValue) {
// Map the encoder value to a valid mode (0-3)
mode = map(encoderValue, -100, 100, 0, 3);
// Set the duration and speed according to the mode
switch (mode) {
case NORMAL_MODE:
duration = 10;
speed = 255;
break;
case DELICATE_MODE:
duration = 5;
speed = 127;
break;
case RINSE_MODE:
duration = 5;
speed = 255;
break;
case SPIN_MODE:
duration = 5;
speed = 255;
break;
}
// Update the last encoder value
lastEncoderValue = encoderValue;
}
}
// A function to execute the washing cycle
void washCycle() {
// If the mode is normal or delicate, fill the bucket with water and detergent
if (mode == NORMAL_MODE || mode == DELICATE_MODE) {
fillBucket();
addDetergent();
}
// If the mode is rinse or spin, drain the bucket first
if (mode == RINSE_MODE || mode == SPIN_MODE) {
drainBucket();
}
// Spin the bucket with the clothes for the duration and speed
spinBucket();
// If the mode is rinse or spin, fill the bucket with water again
if (mode == RINSE_MODE || mode == SPIN_MODE) {
fillBucket();
spinBucket();
drainBucket();
}
// Stop the system and beep when done
stopSystem();
}
// A function to fill the bucket with water from a faucet
void fillBucket() {
// Turn on the water pump
digitalWrite(PUMP_PIN, HIGH);
// Wait until the water level reaches the maximum
while (waterLevel < 1023) {
// Read the water level from the sensor
waterLevel = analogRead(SENSOR_PIN);
}
// Turn off the water pump
digitalWrite(PUMP_PIN, LOW);
}
// A function to add detergent to the bucket
void addDetergent() {
// Use a servo motor to dispense detergent from a bottle
// You will need to connect a servo motor to pin 9 and a bottle to the servo arm
// You will also need to include the Servo library at the top of your code
// Create a servo object
Servo servo;
// Attach the servo to pin 9
servo.attach(9);
// Move the servo to pour some detergent into the bucket
servo.write(90);
// Wait for a second
delay(1000);
// Move the servo back to its original position
servo.write(0);
// Detach the servo
servo.detach();
}
// A function to drain the bucket
void drainBucket() {
// Turn on the water valve
digitalWrite(VALVE_PIN, HIGH);
// Wait until the water level reaches the minimum
while (waterLevel > 0) {
// Read the water level from the sensor
waterLevel = analogRead(SENSOR_PIN);
}
// Turn off the water valve
digitalWrite(VALVE_PIN, LOW);
}
// A function to spin the bucket with the clothes
void spinBucket() {
// Set the motor speed according to the mode
analogWrite(MOTOR_PIN, speed);
// Wait for the duration in minutes
delay(duration * 60000);
// Stop the motor
analogWrite(MOTOR_PIN, 0);
}
// A function to stop the system and beep when done
void stopSystem() {
// Set the running flag to false
running = false;
// Use a buzzer to beep three times
// You will need to connect a buzzer to pin 10 and a resistor to ground
for (int i = 0; i < 3; i++) {
// Turn on the buzzer
digitalWrite(10, HIGH);
// Wait for half a second
delay(500);
// Turn off the buzzer
digitalWrite(10, LOW);
// Wait for half a second
delay(500);
}
}
// A function to print the current state of the system to the serial monitor
void printState() {
// Print a new line
Serial.println();
// Print the mode name
switch (mode) {
case NORMAL_MODE:
Serial.println("Mode: Normal");
break;
case DELICATE_MODE:
Serial.println("Mode: Delicate");
break;
case RINSE_MODE:
Serial.println("Mode: Rinse");
break;
case SPIN_MODE:
Serial.println("Mode: Spin");
break;
}
// Print the duration and speed
Serial.print("Duration: ");
Serial.print(duration);
Serial.println(" minutes");
Serial.print("Speed: ");
Serial.println(speed);
// Print the running status and water level
Serial.print("Running: ");
Serial.println(running ? "Yes" : "No");
Serial.print("Water level: ");
Serial.println(waterLevel);
}
Microwave
A microwave is a device that heats your food by exposing it to electromagnetic radiation. But who needs a complicated and dangerous device when you can use a microcontroller to do the same thing?
To make your own microwave, you will need:
- An Arduino Nano (or any other compatible microcontroller)
- A 433 MHz transmitter module
- A 433 MHz receiver module
- A relay module
- A microwave oven transformer (MOT)
- A metal box
- Some wires and connectors
The basic idea is to use the Arduino to control the transmitter and relay modules. The transmitter will send a signal to the receiver, which will be attached to the MOT. The MOT will step up the voltage and generate a high-frequency current. The current will pass through the metal box, which will act as a resonant cavity and produce microwaves. The microwaves will heat your food inside the box.
Here is the code for the Arduino:
// Define the pins for the components
#define TRANSMITTER_PIN 2 // Transmitter module connected to pin 2
#define RELAY_PIN 3 // Relay module connected to pin 3
// Define some constants for the microwave settings
#define POWER_LEVEL 10 // The power level of the microwave (1-10)
#define TIME_LIMIT 60 // The maximum time limit of the microwave in seconds
// Define some variables for the state of the system
int time = 0; // The current time of the microwave in seconds
bool running = false; // Whether the system is running or not
void setup() {
// Set the pins as output
pinMode(TRANSMITTER_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
// Start the serial monitor for debugging
Serial.begin(9600);
}
void loop() {
// Read the serial input and update the time and running status
readSerial();
// If the system is running, execute the microwave cycle
if (running) {
microwaveCycle();
}
// Print the current state of the system to the serial monitor
printState();
}
// A function to read the serial input and update the time and running status
void readSerial() {
// If there is serial input available
if (Serial.available() > 0) {
// Read the input as an integer
int input = Serial.parseInt();
// If the input is valid (between 1 and TIME_LIMIT)
if (input >= 1 && input <= TIME_LIMIT) {
// Set the time to the input
time = input;
// Set the running flag to true
running = true;
}
}
}
// A function to execute the microwave cycle
void microwaveCycle() {
// Turn on the relay module
digitalWrite(RELAY_PIN, HIGH);
// Send a signal to the transmitter module according to the power level
// The higher the power level, the more frequent the signal
for (int i = 0; i < POWER_LEVEL; i++) {
// Turn on the transmitter
digitalWrite(TRANSMITTER_PIN, HIGH);
// Wait for a millisecond
delay(1);
// Turn off the transmitter
digitalWrite(TRANSMITTER_PIN, LOW);
// Wait for a millisecond
delay(1);
}
// Wait for a second
delay(1000);
// Turn off the relay module
digitalWrite(RELAY_PIN, LOW);
// Decrease the time by one second
time--;
// If the time reaches zero, stop the system and beep when done
if (time == 0) {
stopSystem();
}
}
// A function to stop the system and beep when done
void stopSystem() {
// Set the running flag to false
running = false;
// Use a buzzer to beep three times
// You will need to connect a buzzer to pin 4 and a resistor to ground
for (int i = 0; i < 3; i++) {
// Turn on the buzzer
digitalWrite(4, HIGH);
// Wait for half a second
delay(500);
// Turn off the buzzer
digitalWrite(4, LOW);
// Wait for half a second
delay(500);
}
}
// A function to print the current state of the system to the serial monitor
void printState() {
// Print a new line
Serial.println();
// Print the time and running status
Serial.print("Time: ");
Serial.print(time);
Serial.println(" seconds");
Serial.print("Running: ");
Serial.println(running ? "Yes" : "No");
}
Oven
An oven is a device that bakes your food by exposing it to hot air. But who needs a large and expensive device when you can use a microcontroller to do the same thing?
To make your own oven, you will need:
- An ESP32 (or any other compatible microcontroller with WiFi capability)
- A DHT22 temperature and humidity sensor
- A servo motor
- A heating element
- A fan
- A cardboard box
- Some wires and connectors
The basic idea is to use the ESP32 to control the servo, heating element and fan. The servo will open and close a flap on the box to regulate the air flow. The heating element will heat up the air inside the box. The fan will circulate the hot air around your food. The DHT22 will measure the temperature and humidity inside the box. You will also be able to monitor and control your oven remotely using a web app.
Here is the code for the ESP32:
// Include the libraries for WiFi, DHT22 and Servo
#include <WiFi.h>
#include <DHT.h>
#include <Servo.h>
// Define the pins for the components
#define DHT_PIN 2 // DHT22 sensor connected to pin 2
#define SERVO_PIN 3 // Servo motor connected to pin 3
#define HEATER_PIN 4 // Heating element connected to pin 4
#define FAN_PIN 5 // Fan connected to pin 5
// Define some constants for the WiFi settings
#define SSID "Your WiFi Name" // Your WiFi name
#define PASSWORD "Your WiFi Password" // Your WiFi password
// Define some constants for the DHT22 settings
#define DHT_TYPE DHT22 // The type of DHT sensor
// Define some constants for the oven settings
#define TARGET_TEMP 180 // The target temperature of the oven in Celsius
#define TARGET_HUMIDITY 50 // The target humidity of the oven in percentage
// Define some variables for the state of the system
float temp = 0; // The current temperature of the oven in Celsius
float humidity = 0; // The current humidity of the oven in percentage
int angle = 0; // The current angle of the servo motor in degrees (0-180)
bool heaterOn = false; // Whether the heater is on or not
bool fanOn = false; // Whether the fan is on or not
// Create a DHT object
DHT dht(DHT_PIN, DHT_TYPE);
// Create a Servo object
Servo servo;
void setup() {
// Set the pins as input or output
pinMode(DHT_PIN, INPUT);
pinMode(SERVO_PIN, OUTPUT);
pinMode(HEATER_PIN, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
// Start the serial monitor for debugging
Serial.begin(9600);
// Start the DHT sensor
dht.begin();
// Attach the servo to pin 3
servo.attach(SERVO_PIN);
// Connect to WiFi
connectWiFi();
}
void loop() {
// Read the temperature and humidity from the DHT sensor
readDHT();
// Control the servo, heater and fan according to the target temperature and humidity
controlOven();
// Send the current state of the system to the web app
sendState();
// Receive commands from the web app and update the target temperature and humidity
receiveCommands();
}
// A function to connect to WiFi
void connectWiFi() {
// Print a message to the serial monitor
Serial.print("Connecting to ");
Serial.println(SSID);
// Connect to the WiFi network using the SSID and password
WiFi.begin(SSID, PASSWORD);
// Wait until the connection is established
while (WiFi.status() != WL_CONNECTED) {
// Print a dot to the serial monitor every half a second
Serial.print(".");
delay(500);
}
// Print a message to the serial monitor
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
// A function to read the temperature and humidity from the DHT sensor
void readDHT() {
// Read the temperature and humidity from the sensor
temp = dht.readTemperature();
humidity = dht.readHumidity();
// Check if the readings are valid
if (isnan(temp) || isnan(humidity)) {
// Print an error message to the serial monitor
Serial.println("Failed to read from DHT sensor!");
}
}
// A function to control the servo, heater and fan according to the target temperature and humidity
void controlOven() {
// Calculate the error between the current and target temperature
float tempError = temp - TARGET_TEMP;
// Calculate the error between the current and target humidity
float humidityError = humidity - TARGET_HUMIDITY;
// Calculate the angle of the servo motor based on the humidity error
// The higher the humidity error, the more open the flap
angle = map(humidityError, -100, 100, 0, 180);
// Write the angle to the servo motor
servo.write(angle);
// If the temperature error is positive, turn on the heater
if (tempError > 0) {
digitalWrite(HEATER_PIN, HIGH);
heaterOn = true;
}
// If the temperature error is negative, turn off the heater
else {
digitalWrite(HEATER_PIN, LOW);
heaterOn = false;
}
// If the humidity error is positive, turn on the fan
if (humidityError > 0) {
digitalWrite(FAN_PIN, HIGH);
fanOn = true;
}
// If the humidity error is negative, turn off the fan
else {
digitalWrite(FAN_PIN, LOW);
fanOn = false;
}
}
// A function to send the current state of the system to the web app
void sendState() {
// Create a JSON object to store the state
String json = "{";
json += "\"temp\":" + String(temp) + ",";
json += "\"humidity\":" + String(humidity) + ",";
json += "\"angle\":" + String(angle) + ",";
json += "\"heaterOn\":" + String(heaterOn) + ",";
json += "\"fanOn\":" + String(fanOn);
json += "}";
// Print the JSON object to the serial monitor for debugging
Serial.println(json);
// Send a POST request to the web app with the JSON object as the body
// You will need to replace the URL with your own web app URL
WiFiClient client;
if (client.connect("http://your-web-app-url.com", 80)) {
client.println("POST / HTTP/1.1");
client.println("Host: your-web-app-url.com");
client.println("Content-Type: application/json");
client.print("Content-Length: ");
client.println(json.length());
client.println();
client.println(json);
client.stop();
}
}
// A function to receive commands from the web app and update the target temperature and humidity
void receiveCommands() {
// Create a WiFiServer object to listen for incoming connections
WiFiServer server(80);
// Start the server
server.begin();
// Check if a client is connected
WiFiClient client = server.available();
if (client) {
// Read the request from the client
String request = client.readStringUntil('\r');
// Print the request to the serial monitor for debugging
Serial.println(request);
// Parse the request and extract the target temperature and humidity
// The request should be in the format: GET /?temp=xxx&humidity=yyy HTTP/1.1
int tempIndex = request.indexOf("temp=");
int humidityIndex = request.indexOf("humidity=");
if (tempIndex != -1 && humidityIndex != -1) {
int tempEndIndex = request.indexOf("&", tempIndex);
int humidityEndIndex = request.indexOf(" ", humidityIndex);
String tempString = request.substring(tempIndex + 5, tempEndIndex);
String humidityString = request.substring(humidityIndex + 9, humidityEndIndex);
TARGET_TEMP = tempString.toInt();
TARGET_HUMIDITY = humidityString.toInt();
}
// Send a response to the client with a confirmation message
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/plain");
client.println();
client.print("Target temperature set to ");
client.print(TARGET_TEMP);
client.println(" C");
client.print("Target humidity set to ");
client.print(TARGET_HUMIDITY);
client.println(" %");
client.stop();
}
}
Air fryer
An air fryer is a device that fries your food by circulating hot air around it. But who needs a fancy and expensive device when you can use a microcontroller to do the same thing?
To make your own air fryer, you will need:
- A Raspberry Pi (or any other compatible microcontroller with a camera module)
- A camera module
- A heating element
- A fan
- A metal basket
- A cardboard box
- Some wires and connectors
The basic idea is to use the Raspberry Pi to control the heating element and fan. The heating element will heat up the air inside the box. The fan will circulate the hot air around your food in the basket. The camera module will capture images of your food and use machine learning to determine when it is done.
Here is the code for the Raspberry Pi:
# Import the libraries for GPIO, camera and machine learning
import RPi.GPIO as GPIO
import picamera
import tensorflow as tf
# Define the pins for the components
HEATER_PIN = 2 # Heating element connected to pin 2
FAN_PIN = 3 # Fan connected to pin 3
# Define some constants for the air fryer settings
TEMPERATURE = 200 # The temperature of the air fryer in Celsius
TIME_LIMIT = 15 # The maximum time limit of the air fryer in minutes
# Define some variables for the state of the system
time = 0 # The current time of the air fryer in minutes
running = False # Whether the system is running or not
done = False # Whether the food is done or not
# Set up the GPIO pins as output
GPIO.setmode(GPIO.BCM)
GPIO.setup(HEATER_PIN, GPIO.OUT)
GPIO.setup(FAN_PIN, GPIO.OUT)
# Create a camera object
camera = picamera.PiCamera()
# Load a machine learning model to classify the food images
# You will need to train your own model using TensorFlow and save it as model.h5
model = tf.keras.models.load_model('model.h5')
def setup():
# Start the camera and set the resolution
camera.start_preview()
camera.resolution = (640, 480)
# Start a timer to keep track of the time
startTimer()
def loop():
# Control the heater and fan according to the temperature
controlAirFryer()
# Capture an image of the food and save it as food.jpg
captureImage()
# Use the machine learning model to classify the image and update the done status
classifyImage()
# Print the current state of the system to the console
printState()
def startTimer():
# Import the threading library
import threading
# Define a global variable for the timer
global timer
# Create a timer object that calls the updateTimer function every minute
timer = threading.Timer(60, updateTimer)
# Start the timer
timer.start()
def updateTimer():
# Define a global variable for the time
global time
# Increase the time by one minute
time += 1
# If the time reaches the limit, stop the system and beep when done
if time == TIME_LIMIT:
stopSystem()
# Otherwise, restart the timer
else:
startTimer()
def controlAirFryer():
# Define a global variable for the running status
global running
# If the system is running, turn on the heater and fan
if running:
GPIO.output(HEATER_PIN, GPIO.HIGH)
GPIO.output(FAN_PIN, GPIO.HIGH)
# If the system is not running or the food is done, turn off the heater and fan
else:
GPIO.output(HEATER_PIN, GPIO.LOW)
GPIO.output(FAN_PIN, GPIO.LOW)
def captureImage():
# Capture an image of the food and save it as food.jpg
camera.capture('food.jpg')
def classifyImage():
# Define a global variable for the done status
global done
# Load the image as a numpy array and resize it to 224x224 pixels
import numpy as np
from PIL import Image
image = Image.open('food.jpg')
image = image.resize((224, 224))
image = np.array(image)
# Preprocess the image for the model
image = image / 255.0
image = np.expand_dims(image, axis=0)
# Predict the class of the image using the model
prediction = model.predict(image)
# Get the index of the highest probability
index = np.argmax(prediction)
# If the index is 0, the food is not done
if index == 0:
done = False
# If the index is 1, the food is done
elif index == 1:
done = True
def printState():
# Print a new line
print()
# Print the time and running status
print("Time:", time, "minutes")
print("Running:", running)
# Print the temperature and done status
print("Temperature:", TEMPERATURE, "C")
print("Done:", done)
def stopSystem():
# Define a global variable for the running status
global running
# Set the running flag to false
running = False
# Use a buzzer to beep three times
# You will need to connect a buzzer to pin 6 and a resistor to ground
import time
for i in range(3):
# Turn on the buzzer
GPIO.output(6, GPIO.HIGH)
# Wait for half a second
time.sleep(0.5)
# Turn off the buzzer
GPIO.output(6, GPIO.LOW)
# Wait for half a second
time.sleep(0.5)
# Call the setup function once
setup()
# Call the loop function repeatedly
while True:
loop()
Conclusion
Congratulations! You have successfully rewritten all your home electronics using microcontrollers. You have also learned how to use various sensors, actuators, modules and libraries. You have also applied some basic concepts of physics, electronics and machine learning.
You have now achieved the ultimate level of minimalism and creativity. You can enjoy your homemade devices and show them off to your friends and family. You can also experiment with different settings and features to customize your devices.
I hope you enjoyed this article and found it useful. I would like to thank The fish eating site for giving me this post idea. They are a great website for fish lovers and enthusiasts. You can visit them here: https://fisheatingsite.neocities.org/
If you have any questions or feedback, please leave a comment below. Thank you for reading and happy coding!