Проект Система Умного дома (Smart Home) на arduino

Nik_Frol
Offline
Зарегистрирован: 28.10.2020

Кхм. Так вот. Тут вообще зарегистрировался год назад для поиска решения одного вопроса (Вроде бы решение проблемы с питанием чего-то там но не важно) Недавно решил начать новый проект и тут преподаватель подсказал начать типа свой "блог" как на ютубе ваши АлексГайверы и так далее. Но так как тут новичок то немного познакомлюсь с вами.

Меня звать Николай, 14 лет. Живу на Сахалине, Корсаков, разглашать подробности, тобишь улица, квартира не буду :)

 Вообще, проектами ардуино познакомился от того же АлексГайвера, и досих пор заел на его канале. Тогда лет мне было 12. В школе начали преподавание "робототехники" с помощью конструктора  ЛЕГО. Тут начались мои азы в робототехники. Узнал, что такое блочное программирование...

Далее в нашей залу... в нашем городе появился центр по робототехнике, лодостроению, автостроению, аэростроению и робототехнике как Техносфера. Туда я и пошёл, где обитаю по сей день.

Теперь ближе к тематике моего проекта. Мой умный дом реализован на одной пока что ардуино нано. (Есть идея подключить ардуино уно как вспомогательную ну или вторую в выполнении каких-либо целей, например освещение или ещё что либо что скорее всего будет реализовано из-за малого кол-ва портов на нано если не найду шилд, увеличивающий кол-во портов)

Система умного дома будет состоять из: 

Сигнализация:
-Ключ доступа
-Лог файл каждого кто заходил через карту доступа
-Открытие двери и окон
-Датчик движения
-Сигналирование светом(Красный) и Звуковой (Зуммер)
-Полное отключение срабатывании других систем(Кроме пожарки), когда сигнализация заблокирована, включение когда сигнализация дала "Добро"
-Освещение
-Освещение в коридоре при срабатывании датчика движения, но при одобрении сигнализацией
-Освещение при посылании сигнала от кнопки
-Освещение туалета при срабатывании датчика движения
-Датчики Углекислого газа, температуры.
-Опрос датчиков каждые 2 минуты
-Срабатывание сигнализационной системы при критических отметках температуры или углекислого газа.
-Уведомление пользователя о критических отметках с датчиков.
-Аварийное отключение всех систем, кроме сигнализации, всё освещение сразу включать.
-Пожарная сигнализация
-Срабатывание системы сигнализировании о пожаре
-Уведомление пользователя о пожареe
-Аварийное отключение света, датчики на постоянный опрос (Каждую секунду)
-Посылка сообщений (Скорее всего через интернет, т.к. GSM модуля на руках нема)
 
Примерно вот такой план дальнейшей работы. Занятия у меня почти все рабочие дни кроме среды, субботы и воскресенья.
 
P.S. Надеюсь вы примите меня так сказать в свою "семью", и укажите на мои ошибки (Как и в блоге так и в проекте) которые я обязательно приму и буду исправлять.
 
День 1-8
Первые два дня заняли на подбор материалов и остальной макулатуры.
 
Третий день ушёл на изучение модуля RFID RF-522, который будет выполнять роль считывателя карт, и его библиотеки MRFC522.
Четвёртый день  ушёл на написание логики и первой версии программы. По логики, первая версия программы будет мигать Зелёным светодиодом при правильной поднесённой карте, а красным когда карты в памяти нет. 
Код: 

 
#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // создаем экземпляр MFRC522 instance.
int CODE = "92 7A 20 37";
const int SVET_RED = 5;
const int SVET_GREEN = 7;
const int BUZZER = 6;
void setup() 
{
  Serial.begin(9600);   // запускаем последовательную коммуникацию
  SPI.begin();          // инициализируем шину SPI
  mfrc522.PCD_Init();   // инициализируем MFRC522
  
  pinMode(SVET_RED, OUTPUT);
  pinMode(SVET_GREEN, OUTPUT);
  pinMode(BUZZER, OUTPUT);
 
        for(int b=0; b < 20; b++) { //Будущая эмуляция. Хочу сделать условие, если связь с считывателем есть, то выскакивает надпись об успешной загрузке. Если нет то ошибка
        digitalWrite(SVET_RED, HIGH);
        digitalWrite(SVET_GREEN, HIGH);
        delay(100);
        digitalWrite(SVET_GREEN, LOW);
        digitalWrite(SVET_RED, LOW);
        Serial.println("LOADING...");
        delay(100);
      }
      
      delay(1000);
      digitalWrite(BUZZER, HIGH);
      Serial.println("LOADING COMPLETED");
      delay(550);
       digitalWrite(SVET_RED, HIGH);
       digitalWrite(BUZZER, LOW);
       
  Serial.println("Поднесите карту к считывателю");

}
void loop() 
{
  // ищем новые карты:
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  // выбираем одну из карт:
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  // показываем UID на мониторе порта: 
  Serial.print("UID tag :");  //  "UID тега: "
  String content= "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  //Закончили показ UID
  Serial.println();
  Serial.print("Message : ");  //  "Сообщение: "
  content.toUpperCase();
  if (content.substring(1) == CODE)
  //  впишите здесь UID тега, которому вы хотите дать доступ 
  {
    Serial.println("Authorized access");  //  "Доступ открыт"
    Serial.println();
    
         for(int b=0; b < 20; b++) {
        digitalWrite(SVET_RED, LOW);
        digitalWrite(SVET_GREEN, HIGH);
        digitalWrite(BUZZER, HIGH);
        delay(100);
        digitalWrite(SVET_GREEN, LOW);
        digitalWrite(BUZZER, LOW);
        delay(100);
        }
        digitalWrite(SVET_RED, HIGH);
      delay(5000);
      Serial.println("Поднесите карту к считывателю");
      digitalWrite(SVET_GREEN, HIGH);
       delay(100);
       digitalWrite(SVET_GREEN, LOW);
            for(int j=0; j < 10; j++) {
            digitalWrite(SVET_GREEN, HIGH);
            delay(100);
            digitalWrite(SVET_GREEN, LOW);
            delay(100);
      }
      return;
    }
 
 else   {
    Serial.println(" Access denied");  //  "Запрос на доступ отклонен"
    Serial.println();
      digitalWrite(BUZZER, HIGH);
        delay(5000);
        digitalWrite(BUZZER, LOW);
      for(int b=0; b < 20; b++) {
    
        digitalWrite(SVET_GREEN, LOW);
        digitalWrite(SVET_RED, HIGH);
        delay(100);
        digitalWrite(SVET_RED, LOW);
        delay(100);
      }
      digitalWrite(SVET_RED, HIGH);

    delay(5000);
    Serial.println("Поднесите карту к считывателю");
      for(int j=0; j < 10; j++) {
    digitalWrite(SVET_GREEN, HIGH);
    delay(100);
    digitalWrite(SVET_GREEN, LOW);
    delay(100);
      }
 }
}

 

Продолжение будет в следующем сообщении, так как работа всё ещё идёт, а фоток мало. Всем спасибо, пишите свои предложения по улучшению проекта и блога) Всем Добра)
rkit
Offline
Зарегистрирован: 23.11.2016

Сделать весь список на одном контроллере не получится. Разделяй на 3-4 независимых блока. Например, нет нужды управлять светом в туалете той же системой, что управляет пожарной сигнализацией.

Nik_Frol
Offline
Зарегистрирован: 28.10.2020

rkit пишет:

Сделать весь список на одном контроллере не получится. Разделяй на 3-4 независимых блока. Например, нет нужды управлять светом в туалете той же системой, что управляет пожарной сигнализацией.

Разумеется, жду 3 новых контроллера ардуино зеро, самое главное что они 32 битные и поддерживают одну библиотеку о которой сейчас сказать не могу, забыл название, но библиотека на многозадачность

Nik_Frol
Offline
Зарегистрирован: 28.10.2020

Продолжение:

Где-то 10 и 11 октября занимался подготовкой считывателя, ну там проводки паял и тд. Проверку прошёл успешно, сделал отдельную плату с двумя индикаторами и пищалкой.  (Фото сделать не успел, телефон сел, завтра сделаю фотки и принесу вам))

Поправил логику и пошёл пилить корпус... из фанеры... У этого человека явно шизофрения

Делал я делал, получилось как у рукожопа, делал до сегодняшнего дня. Сегодня подхожу к директору насчёт сломанного станка. Он мне говорит про лазерный станок. Я такой (Что?)

Оказывается на этом станке можно вырезать отдельно запчасти из фанеры, а я как полный просто дебил делал всё вручную... 3 дня...

Пока шли в его кабинет чтобы он показал как делать программу для этого сея чуда, он задал мне вопрос "Почему не сделал на 3D принтере?" И таким вопросом я сам задался...

За 5 минут он сделал мне примерную схему корпуса для считывателя, коробка с отверстиями под винты и т.п. И я был приятно удивлён, что пол коллектива училось по роликом Гайвера, и он сказал что я могу посмотреть его тутор по Чего-то там фьюжн. 

Я реально был удивлён, что весь коллектив центра смотрит гайвера, даже наш ### ##### который успел побывать и дальнобоем, программистом в 3-ёх областях. (Да, он дедуля, но весёлый))

Так вот...

Сегодня ночь с кружкой вкусного чая и с тарелкой маминых пирожков с капустой буду смотреть туториал и тренироваться "пахать" в Автодеск Фьюжн (Во, вспомнил)

Всем спасибо за чтение этих каракулей с куча ошибок, поливайте в меня грязью в виде объяснений что я не так делаю, всем удачи, добра и позитива)

P.S. Фото буду делать завтра, и выложу их сюда, скорее всего провода, идущие к считывателю буду менять. И да, зелёный светодиод ###но

bwn
Offline
Зарегистрирован: 25.08.2014

То ТС, пока перенес в "Общие", когда и если наполните конкретикой, вернем в "Проекты".

MaksVV
Offline
Зарегистрирован: 06.08.2015

правильно говорят разбить функционал на несколько МК, так как в коде при не совсем умелом программировании и множестве функционала на единственном МК одно может мешать другому. Проводов опять же будет меньше. Зеро совсем не обязательно. 328я мега спокойно это потянет ну или 2560. Связывать контроллеры, имхо, лучше проводами по CAN или RS485. 

Рекомендую посмотреть это и это 

5N62V
Offline
Зарегистрирован: 25.02.2016

MaksVV пишет:

 Зеро совсем не обязательно. 328я мега спокойно это потянет ну или 2560. 

Почему не привыкать к хорошим контроллерам, тем более , что они есть?

nik182
Онлайн
Зарегистрирован: 04.05.2015

Обычно сначала составляют ТЗ  на систему, потом подбирают контроллер под необходимые ресурсы. Если вопрос цены не стоит, то можно и хороший взять. Я б на stm32f411 или esp32 нацелился. Последний и WiFi BT имеет. Сейчас это  оптимальное из того, что среде ардуино программируется с поставленными задачами справится. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

5N62V пишет:
Почему не привыкать к хорошим контроллерам, тем более , что они есть?

"хорошим" это что значит? хороший МК это тот, который наиболее подходит под задачу. В ваших хотелках МК в основном будет дрыгать ногами, или опрашивать эти ноги. Тут важнее количество ног, а у зеро их маловато. 

Имхо, мега_мини - это наилучшее решение для домашней автоматики. Крепить и подключать ее удобнее классических уно- и мега- подобных. Более компактна, что может пригодится, если идти путём разделения системы на сеть контроллеров по помещениям. 

Хотя если не брезговать радиоканалом, то есп тут однозначно рулит. 

5N62V
Offline
Зарегистрирован: 25.02.2016

MaksVV пишет:

"хорошим" это что значит? 

Если попутно с реализацией проекта вы осваиваете проц, который намного превосходит заезженный 328Р, расширяя тем самым свои горизонты, то по-Вашему этот проц не хорош? Или Вы хотите поспорить на тему Зеро не лучше Наны? 

Ничего против Мега-мини не имею, у самого есть достаточно сложные пректы, реализованные на нем. Но больше к нему я не вернусь, потому что есть ATSAM3x8e.  А теперь хочу перейти на SAMD51. И так далее, от хорошего к еще лучшему.   Прогресс, однако. ;)

Не хватает ног - есть расширители ай2сишные. Если бы у меня стоял выбор делать на Меге или на зеро с расширителем - выбрал бы второе.  И даже отсутствие ЕЕПРОМА меня не остановило бы. Но на вкус и цвет все фломастеры разные, так что все вышесказанное сугубо имхо.