/////////////////////////////////////////////////////////////////////////////////
// подключаем необходимые библиотеки
#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; // выход из цикла
}
}
/////////////////////////////////////////////////////////////////////////////////