Управление на Релета през Bluetooth и Atmega328p

Bluetooth Controller

В днешно време автоматизацията и дистанционното управление на електрически устройства са от съществено значение за подобряване на ефективността и удобството в много приложения. Представяме ви компактно решение за управление на релета през Bluetooth и Atmega328p, базирано на микроконтролера ATmega328P. Това устройство е идеално за инсталиране в електрически табла, като може да се монтира на DIN шина и е лесно за интеграция в съществуващи системи.

Основни характеристики на устройството

  • Микроконтролер: ATmega328p (или алтернативен ATmega8).
  • Комуникация: Bluetooth модул HC-05.
  • Управление на релета: Четири релейни изхода.
  • Захранване: Вграден захранващ блок с регулатор на напрежение.
  • Монтаж: Подходящо за монтаж на DIN шина в табло.

Схемно решение

Устройството е проектирано така, че да е компактно и лесно за използване. Разделено е на няколко основни части: захранващ блок, контролен блок с микроконтролера, Bluetooth модул и релейни модули.

Захранващ блок

DIN-Rails-4-Relay-BT-Power-Supplay

Захранващият блок е отговорен за осигуряването на стабилно напрежение за всички компоненти в устройството. Основните елементи включват:

  • Трансформатор: Преобразува 220V AC към 9V AC.
  • Изправителен блок: Включва диоди 1N4007 за изправяне на напрежението, или в нашия сличай схема грец.
  • Регулатор на напрежение: LM7805, който осигурява стабилно 5V за микроконтролера и останалите компоненти.

Управляващото напрежение на релатата е 12v. Използваме трансформатор 220v-9v, защото след изправяне и филтрация на напрежението от 9v се получава около 12.69v. Формулата е:

Vout = Vin * 1.41

Където:

  • Vout е изходно напрежение
  • Vin е изходно напрежение след изправяне и филтрация 
  • 1.41 е приблизителната стойност на корен квадратен от 2 (√2), използвана за изчисляване на пиковото напрежение в изправени променливотокови вериги.

Контролен блок

DIN-Rails-4-Relay-BT-Atmega-Part

Контролният блок се базира на микроконтролера ATmega328P, който е широко използван заради своята достъпност и възможности. Може да се използва и ATmega8, тъй като pinout на двата чипа съвпада, но ATmega8 разполага с по-малко памет, което в случая на този проект не е проблем.

Основните връзки включват:

  • Пинове за управление на релетата: Пинове 2, 3, 4 и 5 на микроконтролера са свързани към релейните модули.
  • Bluetooth HC-05 модул: Свързан към пинове PD0 и PD1 на ATmega328P за сериен обмен на данни.

Релейни модули

DIN-Rails-4-Relay-BT-Relay-Part

Четирите релета са свързани към микроконтролера чрез транзистори 2N2222A, които действат като ключове за управление на релейните бобини. Всеки релеен модул има защита с диоди 1N4007, които предпазват транзисторите от обратни напрежения.

Платка (PCB) на устройството

DIN-Rails-4-Relay-BT-Relay-PCB

Софтуерна реализация

Софтуерът, управляващ устройството, е написан на C++ и се компилира и зарежда в микроконтролера чрез средата за разработка Arduino IDE. В следващите стъпки ще разгледаме основните функции на софтуера и начина, по който той управлява релетата в зависимост от получените команди през Bluetooth връзката. Реализирали сме част от този код в нашата страница: WEB и Bluetooth Контрол на Релета с Arduino UNO и Ethernet W5100.

int relay1 = 2;  // initialize pin 2
int relay2 = 3;  // initialize pin 3
int relay3 = 4;  // initialize pin 4
int relay4 = 5;  // initialize pin 5

int ledStatus = 6; // initialize pin 6 processorStatus

char f;

void executeWithInterval(unsigned long interval, void (*action)(), unsigned long &previousMillis) {
  unsigned long currentMillis = millis(); // Записваме текущото време

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis; // Записваме текущото време като време на последното изпълнение

    action();  // Изпълняваме предадената като параметър функция
  }
}

void led_status() {
  digitalWrite(ledStatus, !digitalRead(ledStatus));
}

void setup() {
  Serial.begin(9600);  // Отваряне на сериен комуникационен порт

  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
  digitalWrite(relay1 , LOW);
  digitalWrite(relay2 , LOW);
  digitalWrite(relay3 , LOW);
  digitalWrite(relay4 , LOW);
  
  pinMode(ledStatus, OUTPUT);
}

void loop() {

  // Управление чрез сериен порт през Bluetooth
  if (Serial.available() > 0) {
    f = Serial.read();
    if (f == '1') digitalWrite(relay1, HIGH);
    if (f == 'A') digitalWrite(relay1, LOW);
    if (f == '2') digitalWrite(relay2, HIGH);
    if (f == 'B') digitalWrite(relay2, LOW);
    if (f == '3') digitalWrite(relay3, HIGH);
    if (f == 'C') digitalWrite(relay3, LOW);
    if (f == '4') digitalWrite(relay4, HIGH);
    if (f == 'D') digitalWrite(relay4, LOW);
    if (f == '9') {
      digitalWrite(relay1, HIGH);
      digitalWrite(relay2, HIGH);
      digitalWrite(relay3, HIGH);
      digitalWrite(relay4, HIGH);
    }
    if (f == 'I') {
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      digitalWrite(relay3, LOW);
      digitalWrite(relay4, LOW);
    }
  }

  static unsigned long previousMillis1 = 0;  // За led-status
  executeWithInterval(1000, [](){ led_status(); }, previousMillis1); 
}

1. Деклариране на променливи

Първата стъпка е декларирането на променливите, които ще бъдат използвани за управление на релетата.

int relay1 = 2;  // Инициализиране на пин 2 за реле 1
int relay2 = 3;  // Инициализиране на пин 3 за реле 2
int relay3 = 4;  // Инициализиране на пин 4 за реле 3
int relay4 = 5;  // Инициализиране на пин 5 за реле 4

int ledStatus = 6; // initialize pin 6 processorStatus

char f;  // Променлива за съхранение на входящия символ от Bluetooth

В този блок от кода, променливите relay1, relay2, relay3, и relay4 са свързани с пиновете на микроконтролера, които ще управляват съответните релета. ledStatus е свързан с пин 6, който може да се използва за индикация на състоянието на устройството. Променливата f се използва за съхранение на символа (char), получен от Bluetooth модула.

Функция за мигане без закъснение (статус на контролера)

Функцията executeWithInterval() е за включване на таймера на Arduino и четене от него. В нея се задават три параметъра:

  • Време на активиране на функцията led_status() в милисекунди
  • Функция, която ще активираме
  • Записаниете предишни показания на таймера

Имаме посветена статия за тази част от кода: Arduino мигане без закъснение “Blink Without Delay”

void executeWithInterval(unsigned long interval, void (*action)(), unsigned long &previousMillis) {
  unsigned long currentMillis = millis(); // Записваме текущото време

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis; // Записваме текущото време като време на последното изпълнение

    action();  // Изпълняваме предадената като параметър функция
  }
}

void led_status() {
  digitalWrite(ledStatus, !digitalRead(ledStatus));
}

2. Инициализация на микроконтролера

Втората стъпка в програмата е да се конфигурират пиновете за управление на релетата като изходи и да се инициализира серийната комуникация, която ще бъде използвана за връзка с Bluetooth HC-05 модула.

void setup() {
  Serial.begin(9600);  // Отваряне на сериен комуникационен порт

  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
  digitalWrite(relay1 , LOW);
  digitalWrite(relay2 , LOW);
  digitalWrite(relay3 , LOW);
  digitalWrite(relay4 , LOW);
  
  pinMode(ledStatus, OUTPUT);
}

В тази функция, Serial.begin(9600) задава скорост на серийната комуникация от 9600 baud, която е стандартната за HC-05 модула. За да разберете как може да смените името, паролата както и скоростта на серийната комуникация на HC-05 модула, може да разгледате тази статия.

Пиновете за четирите релета (relay1, relay2, relay3, relay4) са конфигурирани като изходи с pinMode(), а техните начални стойности се задават на ниско ниво (LOW), което означава, че релетата са изключени при стартиране на устройството.

3. Основен цикъл за управление

Основният цикъл на програмата (loop() функцията) е отговорен за постоянното следене на входящите данни от Bluetooth модула и управление на релетата в зависимост от получените команди.

void loop() {

  // Управление чрез сериен порт през Bluetooth
  if (Serial.available() > 0) {
    f = Serial.read();
    if (f == '1') digitalWrite(relay1, HIGH);
    if (f == 'A') digitalWrite(relay1, LOW);
    if (f == '2') digitalWrite(relay2, HIGH);
    if (f == 'B') digitalWrite(relay2, LOW);
    if (f == '3') digitalWrite(relay3, HIGH);
    if (f == 'C') digitalWrite(relay3, LOW);
    if (f == '4') digitalWrite(relay4, HIGH);
    if (f == 'D') digitalWrite(relay4, LOW);
    if (f == '9') {
      digitalWrite(relay1, HIGH);
      digitalWrite(relay2, HIGH);
      digitalWrite(relay3, HIGH);
      digitalWrite(relay4, HIGH);
    }
    if (f == 'I') {
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      digitalWrite(relay3, LOW);
      digitalWrite(relay4, LOW);
    }
  }

  static unsigned long previousMillis1 = 0;  // За led-status
  executeWithInterval(1000, [](){ led_status(); }, previousMillis1); 
}

В този блок от кода, програмата постоянно проверява дали има налични данни в серийния порт чрез Serial.available(). Ако има, тя прочита първия наличен символ с Serial.read() и го съхранява в променливата (char) f. В зависимост от стойността на този символ, програмата включва или изключва съответното реле:

  • Символите ‘1‘, ‘2‘, ‘3‘, и ‘4‘ включват съответно първото, второто, третото и четвъртото реле.
  • Символите ‘A‘, ‘B‘, ‘C‘, и ‘D‘ изключват съответно първото, второто, третото и четвъртото реле.
  • Символът ‘9‘ включва всички релета едновременно.
  • Символът ‘I‘ изключва всички релета едновременно.

Този вид комуникация позволява лесно и ефективно управление на релетата от разстояние, използвайки стандартни Bluetooth команди. Използвали сме приложението “Arduino Bluetooth CH4”, свалено от “Play Store” за Android телефоните. За съжаление не е обновено и не може да си инсталира на Android 14. За управление може да използвате всяко приложение на което може да зададете ръчно стойност (char),  която ще изпрати през Bluetooth.

Последната час от кода е инициализация на previousMillis1, и извикване на функцията executeWithInterval(), която отговаря за мигането на светодиод по който можем да се ориентираме за състоянието на контролера Atmega328p. Когато мига на всяка секунда, това означава, че контролера работи добре, но ако свети постоянно или е угаснал означава, че контролера е “забил“.

Заключение

Устройството за управление на релета през Bluetooth и Atmega328p предоставя компактно и ефективно решение за дистанционно управление на релейни модули посредством Bluetooth. Проектирано на базата на микроконтролера ATmega328P или ATmega8, то предлага надеждност и лесна интеграция в домашни автоматизационни системи. Благодарение на стандартния си дизайн и възможността за монтаж на DIN шина, устройството е подходящо за широк спектър от приложения, като същевременно остава гъвкаво и лесно за адаптиране към конкретни нужди с помощта на прости софтуерни модификации.