Arduino Smart Home

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

  1. Ring the bell: The guest press door bell button, then we will hear buzzer ringing.
  2. 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.
  3. Stand by mode: During stand by mode, current room temperature will be displayed on the screen.

Materials Needed:

  1. Cardboard Box: This will serve as the structure of your smart home.
  2. Arduino Board: Uno, Nano, or any compatible board.
  3. Breadboard and Jumper Wires: For building and testing circuits.
  4. Sensors and Modules:
    • Temperature sensor
    • Ultrasonic Distance Sensor (4-pin)
    • Button
    • LEDs
    • Servo Motor (for door automation)
    • Display
  5. Power Supply: USB cable
  6. 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);
}