Arduino:Примеры/Веб-сервер из платы Arduino и шилда Arduino Ethernet, управляющий реле

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



Веб-сервер из платы Arduino и шилда Arduino Ethernet, управляющий реле[1]

Это руководство рассказывает, как при помощи платы Arduino и шилда Arduino Ethernet создать веб-сервер, управляющий реле, к которому подключена к лампе.

Доступ к веб-серверу можно получить с любого устройства, на котором установлен браузер и которое подключено к той же сети.

СОБЛЮДАЙТЕ ТЕХНИКУ БЕЗОПАСНОСТИ! При работе с проектами, использующими сетевое напряжение, вы должны действительно разбираться в том, что делаете. В противном случае можно получить удар электрическим током. Это очень серьезно, и я не хочу, чтобы работа над этим проектом принесла вред вашему здоровью. Если вы не на 100% уверены в том, что делаете, сделайте себе одолжение и ничего не трогайте. Попросите того, кто знает!

Примечание: Если вам не хочется иметь дело с сетевым напряжением, но вы по-прежнему хотите поработать над проектом, то реле-модуль можно заменить, к примеру, на светодиод. Для этого придется изменить код и схему, но эти изменения будут незначительными.

Шилд Arduino Ethernet Shield

Сначала подключите шилд к плате Arduino, а затем подсоедините его к сети при помощи кабеля RJ45. Ethernet-кабель, идущий от роутера к шилду Ethernet, должен быть подключен следующим образом:

Использование контактов

Когда шилд Ethernet подключен к плате Arduino, вы не можете использовать цифровые контакты 10, 11, 12 и 13, потому что они используются для коммуникации между платой и шилдом.

Реле-модуль

Реле – это переключатель с электрическим приводом. Это значит, что его можно включать и выключать, управляя тем, может ли проходить через него электрический ток. Как выглядит реле-модуль, показано на картинке ниже:

В частности, модуль на картинке выше состоит из двух реле (это синие кубы).

Что касается сетевого напряжения, то у каждого реле для работы с ним имеется три выходных контакта.

  • COM (от «common») – общий контакт.
  • NO (от «normally open») – нормально разомкнутый контакт. Общий контакт и нормально разомкнутый контакт между собой не соединены. Но когда вы включаете реле, эти контакты замыкаются и потребитель (в нашем случае – лампа) начинает получать питание.
  • NC (от «normally closed») – нормально замкнутый контакт. Общий контакт и нормально замкнутый контакт соединены друг с другом, даже если реле выключено. Но если включить реле, цепь размыкается и питание перестает идти потребителю.

Хотя это зависит от проекта, но в нашем случае лучше использовать нормально разомкнутый контакт, потому что мы будем включать лампу время от времени. Более подробно об использовании реле-модуля с платой Arduino можно почитать тут.

Реле и плата Arduino подключаются друг к другу очень просто:

  • GND – к «земле»
  • IN1 – к цифровому контакту Arduino (используется для управления первым реле)
  • IN2 – к цифровому контакту Arduino (используется для управления вторым реле)
  • VCC – к 5 вольтам

Необходимое оборудование

Ниже – полный список компонентов, необходимых для этого проекта:

Код

Скопируйте код, показанный ниже, в IDE Arduino, но перед тем, как загружать его на плату Arduino, прочитайте раздел «Настройка сети», расположенный еще ниже.

/*
 * Руи Сантос (Rui Santos)
 * Более подробно о проекте здесь:
 * http://randomnerdtutorials.com
*/

#include <SPI.h>
#include <Ethernet.h>

// введите ниже MAC-адрес и IP-адрес вашего контроллера;
// IP-адрес будет зависеть от вашей локальной сети:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 111);

// инициализируем библиотеку Ethernet Server, указывая нужный порт 
// (по умолчанию порт для HTTP – это «80»):
EthernetServer server(80);

// задаем контакт и начальное состояние для реле:
String relay1State = "Off";
const int relay = 7;

// задаем переменные для клиента: 
char linebuf[80];
int charcount=0;

void setup() { 
  // подготавливаем реле-модуль: 
  pinMode(relay, OUTPUT);
  digitalWrite(relay, HIGH);
  
  // открываем последовательную коммуникацию на скорости 9600 бод: 
  Serial.begin(9600);
  
  // запускаем Ethernet-коммуникацию и сервер: 
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");  //  "сервер на "
  Serial.println(Ethernet.localIP());
}

// Показываем веб-страницу с кнопкой «вкл/выкл» для реле: 
void dashboardPage(EthernetClient &client) {
  client.println("<!DOCTYPE HTML><html><head>");
  client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head><body>");                                                             
  client.println("<h3>Arduino Web Server - <a href=\"/\">Refresh</a></h3>");
  // генерируем кнопку для управления реле:
  client.println("<h4>Relay 1 - State: " + relay1State + "</h4>");
  // если реле выключено, показываем кнопку «вкл»:          
  if(relay1State == "Off"){
    client.println("<a href=\"/relay1on\"><button>ON</button></a>");
  }
  // если реле включено, показываем кнопку «выкл»:
  else if(relay1State == "On"){
    client.println("<a href=\"/relay1off\"><button>OFF</button></a>");                                                                    
  }
  client.println("</body></html>"); 
}


void loop() {
  // прослушиваем входящих клиентов:
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");  //  "новый клиент"
    memset(linebuf,0,sizeof(linebuf));
    charcount=0;
    // HTTP-запрос заканчивается пустой строкой:
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
       char c = client.read();
        // считываем HTTP-запрос, символ за символом: 
        linebuf[charcount]=c;
        if (charcount<sizeof(linebuf)-1) charcount++;
        // если вы дошли до конца строки (т.е. если получили 
        // символ новой строки), это значит, 
        // что HTTP-запрос завершен, и вы можете отправить ответ: 
        if (c == '\n' && currentLineIsBlank) {
          dashboardPage(client);
          break;
        }
        if (c == '\n') {
          if (strstr(linebuf,"GET /relay1off") > 0){
            digitalWrite(relay, HIGH);
            relay1State = "Off";
          }
          else if (strstr(linebuf,"GET /relay1on") > 0){
            digitalWrite(relay, LOW);
            relay1State = "On";
          }
          // если получили символ новой строки...
          currentLineIsBlank = true;
          memset(linebuf,0,sizeof(linebuf));
          charcount=0;          
        } 
        else if (c != '\r') {
          // если получили какой-то другой символ...
          currentLineIsBlank = false;
        }
      }
    }
    // даем веб-браузеру время на получение данных: 
    delay(1);
    // закрываем соединение:
    client.stop();
    Serial.println("client disonnected");  //  "Клиент отключен"
  }
}

Настройка сети

Обратите внимание на фрагмент в коде выше, где находятся данные для подключения к сети:

byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,XXX);

Важно: Возможно, понадобится заменить переменную XXX в конце этого кода на значение, соответствующее вашей сети. В противном случае Arduino не сможет установить соединение с сетью.

Кроме того, возможно, придется заменить все значения в строчке для IP-адреса:

IPAddress ip(X, X, X, X);

В моем случае IP-адрес был в диапазоне «192.168.1.X», и при помощи программы Angry IP Scanner я узнал, что в моей сети доступен IP-адрес «192.168.1.111». То есть в моей сети не было активных устройств, использующих тот же самый адрес.

IPAddress ip(192, 168, 1, 111);

Схема

Соберите цепь, как показано на картинке ниже:

Демонстрация

Страница созданного вами веб-сервера будет выглядеть в браузере следующим образом:

А вот демонстрация того, как проект выглядит вживую:

См.также

Внешние ссылки