
Creating an Arduino-based smart home model in a cardboard box is a fun and educational project. Our project with Oleksii Rudenko will be based on door bell and door opening/closing automation.
How It Works
- Ring the bell: The guest press door bell button, then we will hear buzzer ringing.
- Opening the door: If the ultra sonic sensor detects a waving hand, the servo motor will open and then close the door for our guest.
- Stand by mode: During stand by mode, current room temperature will be displayed on the screen.
Materials Needed:
- Cardboard Box: This will serve as the structure of your smart home.
- Arduino Board: Uno, Nano, or any compatible board.
- Breadboard and Jumper Wires: For building and testing circuits.
- Sensors and Modules:
- Temperature sensor
- Ultrasonic Distance Sensor (4-pin)
- Button
- LEDs
- Servo Motor (for door automation)
- Display
- Power Supply: USB cable
- Miscellaneous: Resistors, transistors, and other basic electronic components.
Building
Arduino code
#include <LiquidCrystal.h>
#include <Servo.h> // Подключаем библиотеку для работы с сервоприводом
// Определение музыкальных нот в герцах
#define NOTE_C4 262
#define NOTE_G3 196
#define NOTE_A3 220
#define NOTE_B3 247
byte housechar1[8] = {B00000, B00001, B00011, B00011, B00111, B01111, B01111, B11111};
byte housechar2[8] = {B11111, B11111, B11100, B11100, B11100, B11100, B11100, B11100};
byte housechar3[8] = {B00000, B10010, B11010, B11010, B11110, B11110, B11110, B11111};
byte housechar4[8] = {B11111, B11111, B11111, B10001, B10001, B10001, B11111, B11111};
byte tempchar1[8] = {B00000, B00001, B00010, B00100, B00100, B00100, B00100, B00111};
byte tempchar2[8] = {B00111, B00111, B00111, B01111, B11111, B11111, B01111, B00011};
byte tempchar3[8] = {B00000, B10000, B01011, B00100, B00111, B00100, B00111, B11100};
byte tempchar4[8] = {B11111, B11100, B11100, B11110, B11111, B11111, B11110, B11000};
float readTemperature() {
// Read the analog value from the temperature sensor
int sensorValue = analogRead(A0);
// Convert the analog value to temperature in Celsius
float voltage = sensorValue * (5.0 / 1023.0); // Convert the sensor value to voltage
float temperatureC = (voltage - 0.5) * 100; // Convert the voltage to temperature in Celsius
return temperatureC;
}
// Инициализация библиотеки для работы с ЖК-дисплеем
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Servo jarDoor; // Создание объекта для управления сервоприводом
const int trigger = 8; // Пин триггера
const int echo = 7; // Пин эха
const int redLed = 9; // Пин красного светодиода
const int greenLed = 10; // Пин зеленого светодиода
const int servoPin = 13; // Пин сервопривода
const int buttonPin = 6; // Пин для кнопки
const int buzzerPin = 1; // Пин для пищалки
float distance;
float duration;
int coinCount = 0;
bool isDoorbellPlaying = false; // Флаг для отслеживания проигрывания мелодии
// Пользовательский символ для значка монеты
byte Heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};
// Пользовательский символ для смайлика
byte smileyFace[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b10001,
0b01110,
0b00000
};
// Мелодия для звонка дверного звонка
int doorbellMelody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
int doorbellDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
void playDoorbell() {
// Итерация по нотам мелодии
for (int thisNote = 0; thisNote < 8; thisNote++) {
// Вычисление длительности ноты
int noteDuration = 1000 / doorbellDurations[thisNote];
tone(buzzerPin, doorbellMelody[thisNote], noteDuration);
// Пауза между нотами
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// Остановка воспроизведения звука
noTone(buzzerPin);
}
}
void setup() {
// Настройка ЖК-дисплея
lcd.begin(16, 2);
// Создание пользовательских символов
lcd.createChar(0, Heart);
lcd.createChar(1, smileyFace);
lcd.createChar(1, tempchar1);
lcd.createChar(2, tempchar2);
lcd.createChar(3, tempchar3);
lcd.createChar(4, tempchar4);
lcd.createChar(5, housechar1);
lcd.createChar(6, housechar2);
lcd.createChar(7, housechar3);
lcd.createChar(8, housechar4);
// Настройка пина триггера как выходного
pinMode(trigger, OUTPUT);
// Настройка пина эха как входного
pinMode(echo, INPUT);
// Настройка пинов светодиодов как выходных
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
// Настройка сервопривода
jarDoor.attach(servoPin);
jarDoor.write(0); // Убедимся, что дверь изначально закрыта
// Настройка пина кнопки как входного
pinMode(buttonPin, INPUT);
// Первоначальное отображение температуры
displayTemperature();
}
void displayTemperature() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(1);
lcd.setCursor(0, 1);
lcd.write(2);
lcd.setCursor(1, 0);
lcd.write(3);
lcd.setCursor(1, 1);
lcd.write(4);
lcd.setCursor(3, 0);
lcd.print("Temperature:");
lcd.setCursor(3, 1);
lcd.print(readTemperature()); // Display the current temperature
lcd.print(" C");
}
void loop() {
// Отправка короткого LOW импульса для очистки HIGH импульса
digitalWrite(trigger, LOW);
delayMicroseconds(5);
// Отправка HIGH импульса длительностью 10 микросекунд для активации датчика
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
// Установка триггера обратно в LOW
digitalWrite(trigger, LOW);
// Измерение длительности эхо-импульса
duration = pulseIn(echo, HIGH);
// Расчет расстояния на основе длительности
distance = duration * 0.034 / 2;
// Проверка, если расстояние меньше 12 см
if (distance < 12) {
lcd.clear();
// Отключение красного светодиода и включение зеленого
digitalWrite(redLed, LOW);
digitalWrite(greenLed, HIGH);
// Открытие двери
jarDoor.write(90); // Здесь укажите угол для открытия двери
lcd.setCursor(0, 1);
lcd.print("Welcome Home");
// Закрытие двери через 2 секунды
delay(2000);
jarDoor.write(0); // Здесь укажите угол для закрытия двери
// После 2 секунд снова отображаем температуру
delay(2000);
displayTemperature();
}
// Проверяем, была ли нажата кнопка
if (digitalRead(buttonPin) == HIGH && !isDoorbellPlaying) {
lcd.clear();
// Проигрываем мелодию дверного звонка
playDoorbell();
lcd.setCursor(0, 0);
lcd.write(5);
lcd.setCursor(0, 1);
lcd.write(6);
lcd.setCursor(1, 0);
lcd.write(7);
lcd.setCursor(1, 1);
lcd.write(8);
lcd.setCursor(3, 0);
lcd.print("Twinkle");
lcd.setCursor(3, 1);
lcd.print(" Twinkle");
delay(2000);
// Устанавливаем флаг, что мелодия воспроизводится
isDoorbellPlaying = true;
// После 2 секунд снова отображаем температуру
delay(2000);
displayTemperature();
} else if (digitalRead(buttonPin) == LOW && isDoorbellPlaying) {
// Если кнопка отпущена и мелодия проигрывается, сбрасываем флаг
isDoorbellPlaying = false;
}
// Задержка перед следующим измерением
delay(100);
}
