kz ru
Каталог

Проект 33: Smart Home

thumb

 

 

 

 

 

 

 

 

 

 

 

/////////////////////////////////////////////////////////////////////////////////

// подключаем необходимые библиотеки
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Устанавливаем адрес I2C-соединения 0x27, отображаем 16 символов в каждой строке, всего две строки
LiquidCrystal_I2C mylcd(0x27, 16, 2);

// устанавливаем порты для двух сервоприводов на цифровые пины 9 и 10
Servo servo_10;
Servo servo_9;

volatile int btn1_num; // переменная btn1_num
volatile int btn2_num; // переменная btn2_num
volatile int button1; // переменная button1
volatile int button2; // переменная button2
String fans_char; // строковая переменная fans_char
volatile int fans_val; // переменная fans_val
volatile int flag; // переменная flag
volatile int flag2; // переменная flag2
volatile int flag3; // переменная flag3
volatile int gas; // переменная gas
volatile int infrar; // переменная infrar
String led2; // строковая переменная led2
volatile int light; // переменная light
String pass; // строковая переменная pass
String passwd; // строковая переменная passwd

String servo1; // строковая переменная servo1
volatile int servo1_angle; // переменная servo1_angle
String servo2; // строковая переменная servo2
volatile int servo2_angle; // переменная servo2_angle

volatile int soil; // переменная soil
volatile int val; // переменная val
volatile int value_led2; // переменная value_led2
volatile int water; // переменная water

int length;
int tonepin = 3; // устанавливаем сигнальный конец пассивного зуммера на цифровой пин 3
// определяем название каждой звуковой частоты
#define D0 -1
#define D1 262
#define D2 293
#define D3 329
#define D4 349
#define D5 392
#define D6 440
#define D7 494
#define M1 523
#define M2 586
#define M3 658
#define M4 697
#define M5 783
#define M6 879
#define M7 987
#define H1 1045
#define H2 1171
#define H3 1316
#define H4 1393
#define H5 1563
#define H6 1755
#define H7 1971

#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625

// устанавливаем частоту звучания мелодии
int tune[] =
{
  M3, M3, M4, M5,
  M5, M4, M3, M2,
  M1, M1, M2, M3,
  M3, M2, M2,
  M3, M3, M4, M5,
  M5, M4, M3, M2,
  M1, M1, M2, M3,
  M2, M1, M1,
  M2, M2, M3, M1,
  M2, M3, M4, M3, M1,
  M2, M3, M4, M3, M2,
  M1, M2, D5, D0,
  M3, M3, M4, M5,
  M5, M4, M3, M4, M2,
  M1, M1, M2, M3,
  M2, M1, M1
};

// устанавливаем ритм музыки
float durt[] =
{
  1, 1, 1, 1,
  1, 1, 1, 1,
  1, 1, 1, 1,
  1 + 0.5, 0.5, 1 + 1,
  1, 1, 1, 1,
  1, 1, 1, 1,
  1, 1, 1, 1,
  1 + 0.5, 0.5, 1 + 1,
  1, 1, 1, 1,
  1, 0.5, 0.5, 1, 1,
  1, 0.5, 0.5, 1, 1,
  1, 1, 1, 1,
  1, 1, 1, 1,
  1, 1, 1, 0.5, 0.5,
  1, 1, 1, 1,
  1 + 0.5, 0.5, 1 + 1,
};

// настройка
void setup() {
  Serial.begin(9600); // устанавливаем скорость передачи данных на 9600

  mylcd.init(); // инициализируем LCD
  mylcd.backlight(); // включаем подсветку LCD
  // LCD отображает "passcord:" в первой строке и первом столбце
  mylcd.setCursor(1 - 1, 1 - 1);
  mylcd.print("passcord:");

  servo_9.attach(9); // подключаем сервопривод к цифровому 9
  servo_10.attach(10); // подключаем сервопривод к цифровому 10
  servo_9.write(0); // устанавливаем угол сервопривода, подключенного к цифровому 9, в 0°
  servo_10.write(0); // устанавливаем угол сервопривода, подключенного к цифровому 10, в 0°
  delay(300);

  pinMode(7, OUTPUT); // устанавливаем цифровой пин 7 как выход
  pinMode(6, OUTPUT); // устанавливаем цифровой пин 6 как выход
  digitalWrite(7, HIGH); // устанавливаем цифровой пин 7 в высокий уровень
  digitalWrite(6, HIGH); // устанавливаем цифровой пин 6 в высокий уровень

  pinMode(4, INPUT); // устанавливаем цифровой пин 4 как вход
  pinMode(8, INPUT); // устанавливаем цифровой пин 8 как вход
  pinMode(2, INPUT); // устанавливаем цифровой пин 2 как вход
  pinMode(3, OUTPUT); // устанавливаем цифровой пин 3 как выход
  pinMode(A0, INPUT); // устанавливаем A0 как вход
  pinMode(A1, INPUT); // устанавливаем A1 как вход
  pinMode(13, OUTPUT); // устанавливаем цифровой пин 13 как выход
  pinMode(A3, INPUT); // устанавливаем A3 как вход
  pinMode(A2, INPUT); // устанавливаем A2 как вход

  pinMode(12, OUTPUT); // устанавливаем цифровой пин 12 как выход
  pinMode(5, OUTPUT); // устанавливаем цифровой пин 5 как выход
  pinMode(3, OUTPUT); // устанавливаем цифровой пин 3 как выход
  length = sizeof(tune) / sizeof(tune[0]); // устанавливаем значение длины
}

void loop() {
  auto_sensor();
  if (Serial.available() > 0) //Считываем значение с Serial
  {
    val = Serial.read();//записываем в val значение с Serial
    pwm_control();
  }
  switch (val) {
    case 'a': //если val равно символу 'a', программа выполняет следующий блок
      digitalWrite(13, HIGH); //устанавливаем высокий уровень на цифровом выводе 13, светодиод загорается
      break; //выходим из блока switch
    case 'b': //если val равно символу 'b', программа выполняет следующий блок
      digitalWrite(13, LOW); //устанавливаем низкий уровень на цифровом выводе 13, светодиод гаснет
      break; //выходим из блока switch
    case 'c': //если val равно символу 'c', программа выполняет следующий блок
      digitalWrite(12, HIGH); //устанавливаем высокий уровень на цифровом выводе 12, реле замыкается
      break; //выходим из блока switch
    case 'd': //если val равно символу 'd', программа выполняет следующий блок
      digitalWrite(12, LOW); //устанавливаем низкий уровень на цифровом выводе 12, реле размыкается
      break; //выходим из блока switch
    case 'e': //если val равно символу 'e', программа выполняет следующий блок
      music1(); //играем песню "День рождения"
      break; //выходим из блока switch
    case 'f': //если val равно символу 'f', программа выполняет следующий блок
      music2(); //играем песню "Ода к радости"
      break; //выходим из блока switch
    case 'g': //если val равно символу 'g', программа выполняет следующий блок
      noTone(3); //останавливаем воспроизведение музыки на цифровом выводе 3
      break; //выходим из блока switch
    case 'h': //если val равно символу 'h', программа выполняет следующий блок
      Serial.println(light); //выводим значение переменной light в новой строке
      delay(100); //задержка в 100 миллисекунд
      break; //выходим из блока switch
    case 'i': //если val равно символу 'i', программа выполняет следующий блок
      Serial.println(gas); //выводим значение переменной gas в новой строке
      delay(100); //задержка в 100 миллисекунд
      break; //выходим из блока switch
    case 'j': //если val равно символу 'j', программа выполняет следующий блок
      Serial.println(soil); //выводим значение переменной soil в новой строке
      delay(100); //задержка в 100 миллисекунд
      break; //выходим из блока switch
    case 'k': //если val равно символу 'k', программа выполняет следующий блок
      Serial.println(water); //выводим значение переменной water в новой строке
      delay(100); //задержка в 100 миллисекунд
      break; //выходим из блока switch
    case 'l': //если val равно символу 'l', программа выполняет следующий блок
      servo_9.write(180); //устанавливаем угол сервопривода, подключенного к цифровому выводу 9, в 180°
      delay(500); //задержка в 500 миллисекунд
      break; //выходим из блока switch
    case 'm': //если val равно символу 'm', программа выполняет следующий блок
      servo_9.write(0); //устанавливаем угол сервопривода, подключенного к цифровому выводу 9, в 0°
      delay(500); //задержка в 500 миллисекунд
      break; //выходим из блока switch
    case 'n': //если val равно символу 'n', программа выполняет следующий блок
      servo_10.write(180); //устанавливаем угол сервопривода, подключенного к цифровому выводу 10, в 180°
      delay(500); //задержка в 500 миллисекунд
      break; //выходим из блока switch
    case 'o': //если val равно символу 'o', программа выполняет следующий блок
      servo_10.write(0); //устанавливаем угол сервопривода, подключенного к цифровому выводу 10, в 0°
      delay(500); //задержка в 500 миллисекунд
      break; //выходим из блока switch
    case 'p': //если val равно символу 'p', программа выполняет следующий блок
      digitalWrite(5, HIGH); //устанавливаем высокий уровень на цифровом выводе 5, светодиод загорается
      break; //выходим из блока switch
    case 'q': //если val равно символу 'q', программа выполняет следующий блок
      digitalWrite(5, LOW); //устанавливаем низкий уровень на цифровом выводе 5, светодиод гаснет
      break; //выходим из блока switch
    case 'r': //если val равно символу 'r', программа выполняет следующий блок
      digitalWrite(7, LOW);
      digitalWrite(6, HIGH); //вентилятор вращается против часовой стрелки на максимальной скорости
      break; //выходим из блока switch
    case 's': //если val равно символу 's', программа выполняет следующий блок
      digitalWrite(7, LOW);
      digitalWrite(6, LOW); //вентилятор останавливается
      break; //выходим из блока switch
  }
}

////////////////////////установка песни "День рождения"//////////////////////////////////
void birthday()
{
  tone(3, 294); //Цифровой пин 3 выводит звук на чистоте 294HZ
  delay(250);   //ожидание 250ms
  tone(3, 440);
  delay(250);
  tone(3, 392);
  delay(250);
  tone(3, 532);
  delay(250);
  tone(3, 494);
  delay(500);
  tone(3, 392);
  delay(250);
  tone(3, 440);
  delay(250);
  tone(3, 392);
  delay(250);
  tone(3, 587);
  delay(250);
  tone(3, 532);
  delay(500);
  tone(3, 392);
  delay(250);
  tone(3, 784);
  delay(250);
  tone(3, 659);
  delay(250);
  tone(3, 532);
  delay(250);
  tone(3, 494);
  delay(250);
  tone(3, 440);
  delay(250);
  tone(3, 698);
  delay(375);
  tone(3, 659);
  delay(250);
  tone(3, 532);
  delay(250);
  tone(3, 587);
  delay(250);
  tone(3, 532);
  delay(500);
}

 

// Обнаружение газа
void auto_sensor() {
  gas = analogRead(A0); // Считываем аналоговое значение с A0 и присваиваем его переменной gas
  if (gas > 700) {
    // Если значение переменной gas больше 700
    flag = 1; // Устанавливаем переменную flag в 1
    while (flag == 1)
      // Пока flag равно 1, программа выполняется в цикле
    {
      Serial.println("danger"); // Выводим "danger" в новой строке
      tone(3, 440); // Воспроизводим звук на цифровом выводе 3 с частотой 440 Гц
      delay(125);
      delay(100);
      noTone(3); // Останавливаем воспроизведение звука на цифровом выводе 3
      delay(100);
      tone(3, 440); // Снова воспроизводим звук на цифровом выводе 3 с частотой 440 Гц
      delay(125);
      delay(100);
      noTone(3); // Останавливаем воспроизведение звука
      delay(300);
      gas = analogRead(A0); // Снова считываем аналоговое значение с A0 и присваиваем его переменной gas
      if (gas < 100)  // Если значение переменной gas меньше 100
      {
        flag = 0; // Устанавливаем переменную flag в 0
        break; // Выходим из цикла
      }
    }

  } else
    // В противном случае
  {
    noTone(3); // Останавливаем воспроизведение звука на цифровом выводе 3
  }
  light = analogRead(A1); // Считываем аналоговое значение с A1 и присваиваем его переменной light
  if (light < 300) // Если значение переменной light меньше 300
  {
    infrar = digitalRead(2); // Считываем цифровое значение с вывода 2 и присваиваем его переменной infrar
    Serial.println(infrar); // Выводим значение переменной infrar в новой строке
    if (infrar == 1)
      // Если значение переменной infrar равно 1
    {
      digitalWrite(13, HIGH); // Устанавливаем высокий уровень на цифровом выводе 13, светодиод загорается
    } else
      // В противном случае
    {
      digitalWrite(13, LOW); // Устанавливаем низкий уровень на цифровом выводе 13, светодиод гаснет
    }

  }
  water = analogRead(A3); // Считываем аналоговое значение с A3 и присваиваем его переменной water
  if (water > 800)
    // Если значение переменной water больше 800
  {
    flag2 = 1; // Устанавливаем переменную flag2 в 1
    while (flag2 == 1)
      // Пока flag2 равно 1, программа выполняется в цикле
    {
      Serial.println("rain"); // Выводим "rain" в новой строке
      servo_10.write(180); // Устанавливаем угол сервопривода, подключенного к цифровому выводу 10, в 180°
      delay(300);
      delay(100);
      water = analogRead(A3); // Снова считываем аналоговое значение с A3 и присваиваем его переменной water
      if (water < 30) // Если значение переменной water меньше 30
      {
        flag2 = 0; // Устанавливаем переменную flag2 в 0
        break; // Выходим из цикла
      }
    }

  } else
    // В противном случае
  {
    if (val != 'u' && val != 'n')
      // Если val не равно 'u' и не равно 'n'
    {
      servo_10.write(0); // Устанавливаем угол сервопривода, подключенного к цифровому выводу 10, в 0°
      delay(10);

    }

  }
  soil = analogRead(A2); // Считываем аналоговое значение с A2 и присваиваем его переменной soil
  if (soil > 50)
    // Если значение переменной soil больше 50
  {
    flag3 = 1; // Устанавливаем переменную flag3 в 1
    while (flag3 == 1)
      // Пока flag3 равно 1, программа выполняется в цикле
    {
      Serial.println("hydropenia "); // Выводим "hydropenia " в новой строке
      tone(3, 440); // Воспроизводим звук на цифровом выводе 3 с частотой 440 Гц
      delay(125);
      delay(100);
      noTone(3); // Останавливаем воспроизведение звука на цифровом выводе 3
      delay(100);
      tone(3, 440); // Снова воспроизводим звук на цифровом выводе 3 с частотой 440 Гц
      delay(125);
      delay(100);
      noTone(3); // Останавливаем воспроизведение звука
      delay(300);
      soil = analogRead(A2); // Снова считываем аналоговое значение с A2 и присваиваем его переменной soil
      if (soil < 10) // Если значение переменной soil меньше 10
      {
        flag3 = 0; // Устанавливаем переменную flag3 в 0
        break; // Выходим из цикла
      }
    }

  } else
    // В противном случае
  {
    noTone(3); // Останавливаем воспроизведение звука на цифровом выводе 3
  }
  door(); // Вызываем подпрограмму door
}


// Функция управления дверью
void door() {
  button1 = digitalRead(4); // Присваиваем переменной button1 значение с цифрового входа 4
  button2 = digitalRead(8); // Присваиваем переменной button2 значение с цифрового входа 8

  if (button1 == 0) // Если button1 равно 0
  {
    delay(10); // Задержка 10 мс
    while (button1 == 0) // Пока button1 равно 0, выполняется цикл
    {
      button1 = digitalRead(4); // Снова считываем значение с цифрового входа 4 в button1
      btn1_num = btn1_num + 1; // Увеличиваем btn1_num на 1
      delay(100); // Задержка 100 мс
    }
  }
  if (btn1_num >= 1 && btn1_num < 5) // Если btn1_num от 1 до 4
  {
    Serial.print(".");
    passwd = String(passwd) + String("."); // Добавляем точку к строке passwd
    pass = String(pass) + String("."); // Добавляем точку к строке pass
    // На ЖК-дисплее отображаем pass в первой строке
    mylcd.setCursor(1 - 1, 2 - 1);
    mylcd.print(pass);
  }
  if (btn1_num >= 5) // Если btn1_num больше или равно 5
  {
    Serial.print("-");
    passwd = String(passwd) + String("-"); // Добавляем дефис к строке passwd
    pass = String(pass) + String("-"); // Добавляем дефис к строке pass
    // На ЖК-дисплее отображаем pass в первой строке
    mylcd.setCursor(1 - 1, 2 - 1);
    mylcd.print(pass);
  }
  if (button2 == 0) // Если button2 равно 0
  {
    delay(10);
    if (button2 == 0) // Если button2 все еще равно 0
    {
      if (passwd == ".--.-.") // Если passwd равно ".--.-."
      {
        mylcd.clear(); // Очищаем ЖК-дисплей
        // На ЖК-дисплее отображаем "open!" во второй строке
        mylcd.setCursor(1 - 1, 2 - 1);
        mylcd.print("open!");
        servo_9.write(100); // Устанавливаем угол сервопривода, подключенного к цифровому выводу 9, в 100°
        delay(300);
        delay(5000);
        passwd = ""; // Сбрасываем passwd
        pass = ""; // Сбрасываем pass
        mylcd.clear(); // Очищаем ЖК-дисплей
        // На ЖК-дисплее отображаем "password:" в первой строке
        mylcd.setCursor(1 - 1, 1 - 1);
        mylcd.print("password:");
      } else // В противном случае
      {
        mylcd.clear(); // Очищаем ЖК-дисплей
        // На ЖК-дисплее отображаем "error!" в первой строке
        mylcd.setCursor(1 - 1, 1 - 1);
        mylcd.print("error!");
        passwd = ""; // Сбрасываем passwd
        pass = ""; // Сбрасываем pass
        delay(2000);
        // На ЖК-дисплее отображаем "again" в первой строке
        mylcd.setCursor(1 - 1, 1 - 1);
        mylcd.print("again");
      }
    }
  }
  infrar = digitalRead(2); // Считываем значение с цифрового входа 2 в infrar
  if (infrar == 0 && (val != 'l' && val != 't')) // Если infrar равно 0 и val не равно 'l' и не равно 't'
  {
    servo_9.write(0); // Устанавливаем угол сервопривода, подключенного к цифровому выводу 9, в 0°
    delay(50);
  }
  if (button2 == 0) // Если button2 равно 0
  {
    delay(10);
    while (button2 == 0) // Пока button2 равно 0, выполняется цикл
    {
      button2 = digitalRead(8); // Считываем значение с цифрового входа 8 в button2
      btn2_num = btn2_num + 1; // Увеличиваем btn2_num на 1
      delay(100);
      if (btn2_num >= 15) // Если btn2_num больше или равно 15
      {
        tone(3, 532); // Воспроизводим звук на цифровом выводе 3 с частотой 532 Гц
        delay(125);
        mylcd.clear(); // Очищаем ЖК-дисплей
        // На ЖК-дисплее отображаем "password:" в первой строке
        mylcd.setCursor(1 - 1, 1 - 1);
        mylcd.print("password:");
        // На ЖК-дисплее отображаем "wait" в первой строке
        mylcd.setCursor(1 - 1, 1 - 1);
        mylcd.print("wait");
      } else // В противном случае
      {
        noTone(3); // Останавливаем воспроизведение звука на цифровом выводе 3
      }
    }
  }
  btn1_num = 0; // Сбрасываем btn1_num в 0
  btn2_num = 0; // Сбрасываем btn2_num в 0
}

// Песня на день рождения
void music1() {
  birthday(); // Вызываем функцию birthday
}
// Ода радости
void music2() {
  Ode_to_Joy(); // Вызываем функцию Ode_to_Joy
}
void Ode_to_Joy() // Функция для воспроизведения Оды радости
{
  for (int x = 0; x < length; x++) // Цикл по всей длине мелодии
  {
    tone(tonepin, tune[x]); // Воспроизводим ноту из мелодии на пине tonepin
    delay(300 * durt[x]); // Задержка для длительности ноты
  }
}

// Управление ШИМ
void pwm_control() {
  switch (val) // Выбор действия в зависимости от значения val
  {
    case 't': // Если val равно 't'
      servo1 = Serial.readStringUntil('#'); // Считываем строку до символа '#'
      servo1_angle = String(servo1).toInt(); // Преобразуем строку в число и присваиваем servo1_angle
      servo_9.write(servo1_angle); // Устанавливаем угол сервопривода, подключенного к цифровому выводу 9
      delay(300); // Задержка 300 мс
      break; // Выход из switch
    case 'u': // Если val равно 'u'
      servo2 = Serial.readStringUntil('#'); // Считываем строку до символа '#'
      servo2_angle = String(servo2).toInt(); // Преобразуем строку в число и присваиваем servo2_angle
      servo_10.write(servo2_angle); // Устанавливаем угол сервопривода, подключенного к цифровому выводу 10
      delay(300); // Задержка 300 мс
      break; // Выход из switch
    case 'v': // Если val равно 'v'
      led2 = Serial.readStringUntil('#'); // Считываем строку до символа '#'
      value_led2 = String(led2).toInt(); // Преобразуем строку в число и присваиваем value_led2
      analogWrite(5, value_led2); // Устанавливаем


      analogWrite(5, value_led2); // Значение ШИМ цифрового выхода 5 равно value_led2
      break; // выход из цикла
    case 'w': // если значение val равно 'w', программа будет выполняться
      fans_char = Serial.readStringUntil('#');
      fans_val = String(fans_char).toInt();
      digitalWrite(7, LOW);
      analogWrite(6, fans_val); // установить значение ШИМ цифрового 6 равное fans_val, чем больше значение, тем быстрее вращается вентилятор
      break; // выход из цикла
  }
}

/////////////////////////////////////////////////////////////////////////////////

Комментарии
Отзывов еще никто не оставлял
Предзаказ
Предзаказ успешно отправлен!
Имя *
Телефон *
Добавить в корзину
Название товара
100 тг
1 шт.
Перейти в корзину
Обратный звонок
Запрос успешно отправлен!
Имя *
Телефон *
Заказ в один клик
С помощью уведомлений о заказе можно не только получать актуальную информацию по заказу, но и иметь быстрый канал связи с магазином