Arduino кодовий замок з карткою sd. Автоматичний "розумний" замок та Arduino. Код представлений нижче

У цьому уроці ми навчимося робити просту систему, яка буде відмикати замок по електронного ключа(Мітці).

Надалі Ви можете доопрацювати та розширити функціонал. Наприклад, додати функцію "додавання нових ключів та видалення їх із пам'яті". У базовому випадку розглянемо простий приклад, коли унікальний ідентифікатор ключа задається в коді програми.

У цьому уроці нам знадобиться:

Для реалізації проекту нам необхідно встановити бібліотеки:

2) Тепер потрібно підключити Зумер, який подаватиме сигнал, якщо ключ спрацював і замок відкривається, а другий сигнал, коли замок закривається.

Зумер підключаємо в наступній послідовності:

Arduino Зумер
5V VCC
GND GND
pin 5 IO

3) У ролі механізму, що відмикає, буде використовуватися сервопривід. Сервопривід може бути обраний будь-який, залежно від необхідних розмірів і зусиль, який створює сервопривід. Сервопривод має 3 контакти:

Більше наочно Ви можете подивитися, як ми підключили всі модулі на малюнку нижче:

Тепер, якщо все підключено, можна переходити до програмування.

Скетч:

#include #include #include //Бібліотека "RFID". #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для зберігання номера мітки у десятковому форматі Servo servo; void setup() ( Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // ініціалізація SPI / Init SPI bus. mfrc522.PCD_Init(); // ініціалізація MFRC522 / Init MFRC522 card. servo.attach(6); ) // Вибір мітки if (! mfrc522.PICC_ReadCardSerial()) ( return; ) uidDec = 0; серійного номерамітки. for (byte i = 0; i< mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID: "); Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданому то серва открывает. { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие } servo.write(0); // устанавливаем серву в закрытое сосотояние }

Розберемо скетч детальніше:

Для того, щоб дізнатися UID картки (Мітки), необхідно записати цей скетч в arduino, зібрати схему, викладену вище, і відкрити Консоль (Моніторинг послідовного порту). Коли ви піднесете мітку до RFID, у консолі виведеться номер

Отриманий UID необхідно ввести в наступний рядок:

If (uidDec == 3763966293) // Порівнюємо Uid мітки, якщо він дорівнює заданому то сервопривід відкриває засувку.

У кожної картки цей ідентифікатор унікальний і не повторюється. Таким чином, коли ви піднесете картку, ідентифікатор якої ви задали в програмі, система відкриє доступ за допомогою сервоприводу.

Відео:

Прогрес не стоїть на місці і "Розумні замки" все частіше з'являються на дверях квартир, гаражів та будинків.

Відкривається подібний замок під час натискання на кнопку на смартфоні. Благо, смартфони та планшети вже увійшли до нашого побуту. У деяких випадках "розумні замки" підключають до "хмарних сервісів" на кшталт гугл диска і відкривають віддалено. Крім того, подібний варіант дає можливість надавати доступ до відкриття дверей іншим людям.

У цьому проекті буде реалізовано DIY версію розумного замку на Arduino, керувати яким можна віддалено з будь-якої точки Землі.

Крім того, до проекту додано можливість відкривати замок після впізнання відбитка пальця. Для цього буде інтегровано датчик відбитка пальця. Обидва варіанти відкриття дверей працюватимуть на базі Adafruit IO платформи.

Подібний замок може стати відмінним першим кроком у проекті вашого "Розумного дому".

Налаштування датчика відбитка пальця

Для роботи з датчиком відбитка пальців є чудова бібліотека для Arduino, яка значно полегшує процес налаштування датчика. У цьому проекті використається Arduino Uno. Для підключення до Інтернету використовується плата Adafruit CC3000.

Почнемо з підключення живлення:

  • Підключіть контакт 5V із плати Arduino до червоної рейки живлення;
  • Контакт GND з Arduino підключається до синьої рейки на безпайковій монтажній платі.

Переходимо до підключення датчика відбитка пальця:

  • Спочатку підключіть живлення. Для цього червоний провід з'єднується з рейкою +5 V, а чорний з рейкою GND;
  • Білий провіддатчика підключається до контакту 4 Arduino.
  • Зелений провідйде до контакту 3 мікроконтролера.

Тепер займемося модулем CC3000:

  • Контакт IRQ з плати CC3000 підключаємо до піну 2 на Arduino.
  • VBAT – до контакту 5.
  • CS – до контакту 10.
  • Після цього треба підключити SPI контакти Arduino: MOSI, MISO і CLK - до контактів 11, 12 і 13 відповідно.

Ну і в кінці треба забезпечити харчування: Vin – до Arduino 5V (червона рейка на вашій монтажній платі), а GND – до GND (синя рейка на макетці).

Фотографію повністю зібраного проекту показано нижче:

Перед розробкою скетчу, який підвантажуватиме дані на Adafruit IO, треба передати дані про ваш відбиток пальця сенсору. Інакше надалі він вас не впізнає;). Рекомендуємо відкалібрувати датчик відбитка пальця, використовуючи Arduino окремо. Якщо ви працюєте з цим сенсором вперше, рекомендуємо ознайомитися з процесом калібрування та детальною інструкцією щодо роботи з датчиком відбитка пальця.

Якщо ви ще не зробили цього, заведіть обліковий запис на Adafruit IO .

Після цього можемо перейти до наступного етапурозробки "розумного замку" на Arduino: а саме, розробка скетчу, який передаватиме дані на Adafruit IO. Так як програма досить об'ємна, у статті ми виділимо та розглянемо тільки її основні частини, а потім дамо посилання на GitHub, де ви зможете завантажити повний скетч.

Скетч починається з підвантаження всіх необхідних бібліотек:

#include

#include

#include

#include "Adafruit_MQTT.h"

#include "Adafruit_MQTT_CC3000.h"

#include

#include >

Після цього треба трохи підкоригувати скетч, вставивши параметри вашої WiFi мережі, вказавши SSID та пароль (password):

#define WLAN_SECURITY WLAN_SEC_WPA2>

Крім цього, необхідно ввести ім'я та AIO ключ (key) для входу до вашого облікового запису Adafruit IO:

#define AIO_SERVERPORT 1883

#define AIO_USERNAME "adafruit_io_ім'я"

#define AIO_KEY "adafruit_io_ключ">

Наступні рядки відповідають за взаємодію та обробку даних із датчика відбитка пальця. Якщо датчик був активований (відбиток збігся), буде "1":

const char FINGERPRINT_FEED PROGMEM = AIO_USERNAME "/feeds/fingerprint";

Adafruit_MQTT_Publish fingerprint = Adafruit_MQTT_Publish(&mqtt, FINGERPRINT_FEED);

Крім того, потрібно створити екземпляр об'єкта SoftwareSerial для нашого сенсора:

SoftwareSerial mySerial(3, 4);

Після цього ми можемо створити об'єкт для нашого сенсора:

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

Усередині скетчу ми вказуємо який fingerID повинен активувати замок надалі. У цьому прикладі використовується 0, який відповідає ID першого відбитка пальців, який використовується датчиком:

int fingerID = 0;

Після цього ініціалізуємо лічильник та затримку (delay) у нашому проекті. По суті, ми хочемо, щоб замок автоматично спрацьовував після відкриття. У цьому прикладі використовується затримка в 10 секунд, але ви можете підлаштувати це значення під власні потреби:

int activationCounter = 0;

int lastActivation = 0;

int activationTime = 10*1000;

У тілі функції setup() ми ініціалізуємо датчик відбитка пальців та забезпечуємо підключення чіпа CC3000 до вашої мережі WiFi.

У тілі функції loop() підключаємось до Adafruit IO. За це відповідає наступний рядок:

Після підключення до платформи Adafruit IO перевіряємо останній відбиток пальця. Якщо він збігається, а замок не активований, ми надсилаємо "1" для обробки Adafruit IO:

if (fingerprintID == fingerID && lockState == false) (

Serial.println(F("Access granted!"));

lockState = true;

Serial.println(F("Failed"));

Serial.println(F("OK!"));

lastActivation = millis();

Якщо ж у межах функції loop() замок активовано і ми досягли значення затримки, яке вказували вище, надсилаємо "0":

if ((activationCounter - lastActivation > activationTime) && lockState == true) (

lockState = false;

if (! fingerprint.publish(state)) (

Serial.println(F("Failed"));

Serial.println(F("OK!"));

Останню версію коду ви можете завантажити на GitHub.

Настав час тестувати наш проект! Не забудьте скачати та встановити всі необхідні бібліотеки для Arduino!

Переконайтеся, що ви внесли все необхідні зміниу скетч і завантажте його на ваш Arduino. Після цього відкрийте вікно серійного монітора.

Коли Arduino підключиться до мережі WiFi, сенсор відбитка пальця почне блимати червоним. Притуліть палець до датчика. У вікні серійного монітора повинен відображатися номер ID. Якщо він збігається, з'явиться повідомлення "OK!". Це означає, що дані були надіслані на сервер Adafruit IO.

Схема та скетч для подальшого налаштування замка на прикладі світлодіода

Тепер займемося частиною проекту, яка безпосередньо відповідає за управління дверним замком. Для підключення до бездротової мережі та активації/деактивації замка знадобиться додатковий модуль Adafruit ESP8266 (модуль ESP8266 не обов'язково має бути від Adafruit). На прикладі, який розглянемо нижче, ви зможете оцінити, наскільки легко забезпечити обмін даними між двома платформами (Arduino і ESP8266) з використанням Adafruit IO.

У цьому розділі ми не працюватимемо безпосередньо із замком. Натомість ми просто підключимо світлодіод до контакту, на якому надалі буде підключено замок. Це дозволить протестувати наш код, не заглиблюючись особливо конструкції замка.

Схема досить проста: спочатку встановіть ESP8266 на breadboard. Після цього встановіть світлодіод. Не забувайте, що довга нога світлодіода підключається через резистор. Друга нога резистора підключається до контакту 5 на модулі ESP8266. Другий (катод) світлодіода підключаємо до піна GND на ESP8266.

Повністю зібрана схемапоказано на фото нижче.


Тепер розберемося зі скетчем, який використовуємо для цього проекту. Знову ж таки, код досить об'ємний і складний, тому ми розглянемо лише його основні частини:

Починаємо з підключення необхідних бібліотек:

#include

#include "Adafruit_MQTT.h"

#include "Adafruit_MQTT_Client.h"

Налаштовуємо параметри WiFi:

#define WLAN_SSID "ваш_wifi_ssid"

#define WLAN_PASS "ваш_wifi_пароль"

#define WLAN_SECURITY WLAN_SEC_WPA2

Також налаштовуємо параметри Adafruit IO. Так само, як і в попередньому розділі:

#define AIO_SERVER "io.adafruit.com"

#define AIO_SERVERPORT 1883

#define AIO_USERNAME "adafruit_io_ім'я_користувача"

#define AIO_KEY "adafruit_io_ключ"

Вказуємо, до якого піну ми підключили світлодіод (надалі це буде наш замок чи реле):

int relayPin = 5;

Взаємодія з датчиком відбитка пальців, як і в попередньому розділі:

const char LOCK_FEED PROGMEM = AIO_USERNAME "/feeds/lock";

Adafruit_MQTT_Subscribe lock = Adafruit_MQTT_Subscribe(&mqtt, LOCK_FEED);

У тілі функції setup() вказуємо, що пін, до якого підключено світлодіод, має працювати у режимі OUTPUT:

pinMode(relayPin, OUTPUT);

У межах циклу loop() спочатку перевіряємо, чи ми підключилися до Adafruit IO:

Після цього перевіряємо, який сигнал надходить. Якщо передається "1", активуємо контакт, який ми оголосили раніше, до якого підключено світлодіод. Якщо ми отримали "0", переводимо контакт у стан "low":

Adafruit_MQTT_Subscribe *subscription;

while ((subscription = mqtt.readSubscription(1000))) (

if (subscription == &lock) (

Serial.print(F("Got: "));

Serial.println((char *)lock.lastread);

// Зберігаємо команду в дані типу рядок

String command = String((char*)lock.lastread);

if (command == "0") (

digitalWrite(relayPin, LOW);

if (command == "1") (

digitalWrite(relayPin, HIGH);

Знайти останню версіюскетчу ви можете на GitHub.

Настав час тестувати наш проект. Не забудьте завантажити всі необхідні бібліотеки для Arduino і перевірте, чи вірно ви внесли зміни в скетч.

Для програмування чипа ESP8266 можна використовувати простий USB-FTDI конвертер.

Завантажте скетч на Arduino та відкрийте вікно серійного монітора. На даному етапі ми просто перевірили, чи вдалося підключитись до Adafruit IO: доступний функціонал ми розглянемо далі.

Тестуємо проект

Тепер приступаємо до тестування! Перейдіть до меню користувача вашого Adafruit IO, у меню Feeds. Перевірте, чи створені канали для відбитка пальців і замка (на принт-скрині нижче це рядки fingerprint і lock):


Якщо їх немає, доведеться створити вручну.

Тепер нам треба забезпечити обмін даними між каналами fingerprint і lock. Канал lock повинен приймати значення "1", коли канал fingerprint приймає значення "1" і навпаки.

Для цього використовуємо дуже потужний інструмент Adafruit IO: тригери. Тригери - це по суті умови, які ви можете застосовувати до налаштованих каналів. Тобто їх можна використовувати для взаємозв'язку двох каналів.

Створюємо новий reactive trigger з розділу Triggers Adafruit IO. Це забезпечить можливість обмінюватися даними між каналами датчика відбитка пальців та замка:


Ось як це має виглядати, коли обидва тригери налаштовані:

Всі! Тепер ми справді можемо тестувати наш проект! Прикладаємо палець до сенсора і бачимо, як Arduino почав підморгувати світлодіодом, який відповідає передачі даних. Після цього повинен блимати світлодіод на модулі ESP8266. Це означає, що він почав одержувати дані через MQTT. Світлодіод на монтажній платі в цей момент повинен також увімкнутися.

Після затримки, яку ви встановили у скетчі (за замовчуванням це значення дорівнює 10 секунд), світлодіод вимкнеться. Вітаємо! Ви можете керувати світлодіодом за допомогою відбитка пальця, перебуваючи у будь-якій точці світу!

Налаштовуємо електронний замок

Ми дісталися останньої частини проекту: безпосереднє підключення та управління електронним замкомза допомогою Arduino та датчика відбитка пальця. Проект непростий, ви можете використовувати всі вихідні джерела в тому вигляді, в якому вони викладені вище, але замість світлодіода підключити реле.

Для безпосереднього підключення замку вам знадобляться додаткові компоненти: джерело живлення на 12 В, джек для підключення живлення, транзистор даному прикладівикористовується IRLB8721PbF MOSFET, але можна використовувати й інший, наприклад, біполярний транзистор TIP102. Якщо ви використовуєте біполярний транзистор, вам доведеться додати резистор.

Нижче показано електрична схемапідключення всіх компонентів до модуля ESP8266:


Зверніть увагу, що якщо ви використовуєте транзистор MOSFET, вам не знадобиться резистор між піном 5 модуля ESP8266 і транзистором.

Цілком зібраний проект показаний на фото нижче:


Запитайте модуль ESP8266 за допомогою FTDI модуля та підключіть джерело живлення 12 В до джека. Якщо ви використовували рекомендовані вище піни для підключення, у скетчі нічого міняти не доведеться.

Тепер можете притулити палець до сенсора: замок повинен спрацювати, відреагувавши на ваш відбиток пальця. На відео нижче показаний проект автоматичного "розумного" замку в дії:

Подальший розвиток проекту «Розумний замок»

У нашому проекті релізовано дистанційне керуваннядверний замок за допомогою відбитка пальця.

Можете сміливо експериментувати, модифікувати скетч та обв'язування. Наприклад, можна замінити дверний електронний замок на реле для керування живленням вашого 3D принтера, маніпулятора або квадрокоптера.

Можна розвивати ваше " розумний будинокНаприклад, віддалено активувати систему поливу на Arduino або вмикати світло в кімнаті... При цьому не забувайте, що ви одночасно можете активувати практично необмежену кількість пристроїв, використовуючи Adafruit IO.

Залишайте Ваші коментарі, питання та ділитесь особистим досвідомнижче. У дискусії часто народжуються нові ідеї та проекти!

Arduino є найкращою системоюдля копіювання будь-якого обладнання. Більшість ідей не змогли б втілитись без неї. Давно існує така думка: створити спеціальний кодовий замок на Ардуїно. Для його відкриття необхідно затиснути певну клавішу. При цьому замок не повинен відкриватися, навіть якщо знати потрібну кнопку. Щоб його відкрити необхідно витримати певні інтервали, використовуючи м'язову пам'ять. Таке злочинець не зможе вчинити. Але це лише теорія.

Щоб його зібрати потрібно скористатися спеціальним приладомпрямокутних імпульсів, а також кілька лічильників і купу. Але готовий пристріймало б великі габаритні розмірита його незручно було б використати. Як правило, такі думки не дають спокою. Першим етапом при втіленні мрій стало створення програми під Arduino. Саме вона служитиме кодовим замком. Для того, щоб відкрити його, потрібно натиснути не одну клавішу, а кілька, причому робити це одночасно. Готова схемавиглядає таким чином:

Якість зображення не краща, але підключення виконується до землі, D3, D5, D7, D9 та D11.

Код представлений нижче:

Const int ina = 3; const int inb = 5; const int inc = 9; const int ledPin = 13; int i = 1000; byte a = 0; byte b = 0; byte c = 0; byte d = 0; unsigned long time = 0; //не забувайте все, що набуває значення millis() unsigned long temp = 0; //зберігати в unsigned long byte keya = (0, 0, 0, 0, 0, 0, 0, 0); //Коди власне byte keyb = (1, 1, 1, 1, 0, 1, 0, 0); byte keyc = (1, 0, 1, 0, 1, 1, 1, 0); byte k = 0; void setup() ( pinMode(ina, INPUT_PULLUP); //3 входи, що підключаються до кнопок pinMode(inb, INPUT_PULLUP); pinMode(inc, INPUT_PULLUP); pinMode(ledPin, OUTPUT); //вбудований світлодіод на 13-му піні pinMode(7, OUTPUT); pinMode(11, OUTPUT); //подвійне миготіння digitalWrite(ledPin, LOW); 200); ) void loop() ( if(k==0) ( blinktwice(); //запрошення ввести код ) if (k == 8) ( digitalWrite(ledPin, HIGH); delay(3000); k = 0 ; a = digitalRead(ina); можна не використовувати if((digitalRead(ina) == a)&&(digitalRead(inb) ==b)&&(digitalRead(inc)==c)) ( if (a == keya[k]) ( if (b == keyb[k]) ( if (c == keyc[k]) ( k++; ) ) ) ) if (k==1) ( if (d ==0) ( time = millis (); d++; ) ) temp = millis(); temp = temp – time; if (temp > 10000) ( k = 0; d = 0; time = millis (); ) )

Щоб не виникало зайвих питань щодо коду, слід пояснити деякі моменти. Функція setup використовується призначення портів. Наступна функція– Input_Pullup, яка потрібна для збільшення напруги піна на 5 В. Це здійснюється за допомогою резистора. Завдяки цьому не виникатимуть різні короткі замикання. Для більшої зручності рекомендується застосовувати функцію blinktwice. Взагалі під час створення різних програмНеобхідно пробувати інші функції.

Після призначення функцій зчитування сигналу з портів. Якщо кнопка натиснута, це позначатиметься цифрою 1, і якщо ні – 2. Далі, відбувається аналіз всіх значень. Наприклад, виникла така комбінація, як 0,1,1. Це означає, що перша клавіша натиснута, а решта дві немає. Якщо всі значення виконуються правильно, то умова 8 також є правильною. Про це свідчить світлодіод, що загорівся, на передній панелі. Далі необхідно вписати певний код, який буде служити для відчинення дверей.

Останні елементи коду служать скидання значень лічильника. Така функція виконується, якщо після останнього натискання кнопки пройшло більше 10 секунд. Без цього коду можна було перебрати все можливі варіанти, хоч їх чимало. Після створення пристрою необхідно його протестувати. Ще

Так сталося, що вирішили ми на роботі встановити кодовий замок на свої двері, тому, як постійно вбігаємо - вибігаємо з кабінету, двері в який повинні бути зачинені постійно без мешканців. Ключі часто виявляються забутими всередині. Втім, вирішили, що кодовий замок це чудовий вихід.

Порившись на китайських барахолках і ebay, я нічого дешевого і більш-менш серйозного не знайшов і вирішив зробити його своїми руками. Обмовлюся відразу, що платформа Arduino була обрана за свою простоту, оскільки досвіду спілкування з мікроконтролерами не було взагалі.

Ідея

На дверях із зовнішнього боку дверей повинна розташовуватися клавіатура, на якій вводиться пароль, внутрішньої сторонизакріплено решту конструкції. Для контролю повного закриття дверей використовується геркон. Виходячи з кабінету людина натискає на клавіатурі «*» і не чекаючи, поки двері зачиняться доводчиком іде у своїх справах, коли двері будуть повністю зачинені, геркон замкнеться і замок буде закритий. Відчиняються двері за допомогою введення 4х значного пароля та натисканням на «#».

Комплектуючі

Arduino UNO = $18
Arduino protoshield + breadboard = $6
L293D = $1
Пучок дротів 30шт для бредборда = $4
2 розетки RJ45 = $4
2 вилки RJ45 = $0.5
актуатор центрального замку = 250 руб.
Геркон = безкоштовно відірвано від старого вікна.
Шпінгалет металевий гігантських розмірів = безкоштовно
Корпус від старого хаба D-LINK із півтораміліметрового заліза = безкоштовно
Блок живлення від того ж хаба D-LINK на 12 та 5в = теж безкоштовно
Купа гвинтів та гайок для кріплення всього цього добра до корпусу = 100руб.
Пульт керування від охоронної сигналізації= безкоштовно.

Разом:$33,5 і 350руб.

Не так вже й мало, скажете ви, і будете, безперечно, мають рацію, але ж за задоволення треба платити! А зібрати щось своїми руками завжди приємно. До того ж конструкцію можна здешевити, якщо використовувати голий МК без Arduino.

Підготовка до збирання

Хочеться кілька слів сказати про покупку ключового елементаконструкції актуатора У місцевому авто-магазині мені запропонували актуатори двох видів: «з двома проводами та з п'ятьма». За словами продавщиці, вони були абсолютно однаковими і різниця в кількості проводів не означала абсолютно нічого. Однак, як виявилось пізніше, це не так! Я вибрав девайс із двома проводами, він харчувався від 12в. У конструкції з п'ятьма проводами встановлені кінцеві вимикачі, що дозволяє контролювати рух важеля. Зрозумів, що купив не той я, тільки коли розібрав його і міняти його було пізно. Хід важеля виявився занадто коротким, щоб нормально засунути клямку, тому необхідно було трохи його доопрацювати, а саме видалити дві гумові шайби, що вкорочують хід важеля актуатора. Для цього корпус довелося розпиляти вздовж звичайної ножівки, тому що друга шайба знаходилася всередині. Синя ізолента нам, як завжди, допомогла нам у подальшому при складанні його назад.
Для керування мотором актуатора був використаний драйвер моторів L293D, який витримує пікове навантаження до 1200 мА, у нас при зупинці двигуна актуатора пікова навантаження зростала лише до 600 мА.
З пульта управління від охоронної сигналізації було виведено контакти з клавіатури, динаміка та двох світлодіодів. Пульт і основний пристрій передбачалося з'єднати за допомогою кручений пари і RJ45 роз'ємів

Програмування.

Так як досвіду програмування Arduino у мене не було досі. Я скористався чужими доробками та статтями з сайту arduino.cc. Кому цікаво, може подивитися цей потворний код :)

Фото і відео



Ардуїно та актуатор


Блок живлення


Клавіатурка


Шпінгалет (з'єднаний з актуатором металевою спицею і на яку надіта термоусадка для краси)

Відео процесу роботи пристрою:



Схожі статті

2024 parki48.ru. Будуємо каркасний будинок. Ландшафтний дизайн. Будівництво. Фундамент.