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

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


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

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

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

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

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

Шилд Arduino Ethernet Shield

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

Ethernet-Shield 1.jpg

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

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

Ethernet-shield-pinout.jpg

Реле-модуль

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

Relay-module 2.jpg

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

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

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

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

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

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

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

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

Код

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

  1 /*
  2  * Руи Сантос (Rui Santos)
  3  * Более подробно о проекте здесь:
  4  * http://randomnerdtutorials.com
  5 */
  6 
  7 #include <SPI.h>
  8 #include <Ethernet.h>
  9 
 10 // введите ниже MAC-адрес и IP-адрес вашего контроллера;
 11 // IP-адрес будет зависеть от вашей локальной сети:
 12 byte mac[] = { 
 13   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
 14 IPAddress ip(192,168,1, 111);
 15 
 16 // инициализируем библиотеку Ethernet Server, указывая нужный порт 
 17 // (по умолчанию порт для HTTP – это «80»):
 18 EthernetServer server(80);
 19 
 20 // задаем контакт и начальное состояние для реле:
 21 String relay1State = "Off";
 22 const int relay = 7;
 23 
 24 // задаем переменные для клиента: 
 25 char linebuf[80];
 26 int charcount=0;
 27 
 28 void setup() { 
 29   // подготавливаем реле-модуль: 
 30   pinMode(relay, OUTPUT);
 31   digitalWrite(relay, HIGH);
 32   
 33   // открываем последовательную коммуникацию на скорости 9600 бод: 
 34   Serial.begin(9600);
 35   
 36   // запускаем Ethernet-коммуникацию и сервер: 
 37   Ethernet.begin(mac, ip);
 38   server.begin();
 39   Serial.print("server is at ");  //  "сервер на "
 40   Serial.println(Ethernet.localIP());
 41 }
 42 
 43 // Показываем веб-страницу с кнопкой «вкл/выкл» для реле: 
 44 void dashboardPage(EthernetClient &client) {
 45   client.println("<!DOCTYPE HTML><html><head>");
 46   client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head><body>");                                                             
 47   client.println("<h3>Arduino Web Server - <a href=\"/\">Refresh</a></h3>");
 48   // генерируем кнопку для управления реле:
 49   client.println("<h4>Relay 1 - State: " + relay1State + "</h4>");
 50   // если реле выключено, показываем кнопку «вкл»:          
 51   if(relay1State == "Off"){
 52     client.println("<a href=\"/relay1on\"><button>ON</button></a>");
 53   }
 54   // если реле включено, показываем кнопку «выкл»:
 55   else if(relay1State == "On"){
 56     client.println("<a href=\"/relay1off\"><button>OFF</button></a>");                                                                    
 57   }
 58   client.println("</body></html>"); 
 59 }
 60 
 61 
 62 void loop() {
 63   // прослушиваем входящих клиентов:
 64   EthernetClient client = server.available();
 65   if (client) {
 66     Serial.println("new client");  //  "новый клиент"
 67     memset(linebuf,0,sizeof(linebuf));
 68     charcount=0;
 69     // HTTP-запрос заканчивается пустой строкой:
 70     boolean currentLineIsBlank = true;
 71     while (client.connected()) {
 72       if (client.available()) {
 73        char c = client.read();
 74         // считываем HTTP-запрос, символ за символом: 
 75         linebuf[charcount]=c;
 76         if (charcount<sizeof(linebuf)-1) charcount++;
 77         // если вы дошли до конца строки (т.е. если получили 
 78         // символ новой строки), это значит, 
 79         // что HTTP-запрос завершен, и вы можете отправить ответ: 
 80         if (c == '\n' && currentLineIsBlank) {
 81           dashboardPage(client);
 82           break;
 83         }
 84         if (c == '\n') {
 85           if (strstr(linebuf,"GET /relay1off") > 0){
 86             digitalWrite(relay, HIGH);
 87             relay1State = "Off";
 88           }
 89           else if (strstr(linebuf,"GET /relay1on") > 0){
 90             digitalWrite(relay, LOW);
 91             relay1State = "On";
 92           }
 93           // если получили символ новой строки...
 94           currentLineIsBlank = true;
 95           memset(linebuf,0,sizeof(linebuf));
 96           charcount=0;          
 97         } 
 98         else if (c != '\r') {
 99           // если получили какой-то другой символ...
100           currentLineIsBlank = false;
101         }
102       }
103     }
104     // даем веб-браузеру время на получение данных: 
105     delay(1);
106     // закрываем соединение:
107     client.stop();
108     Serial.println("client disonnected");  //  "Клиент отключен"
109   }
110 }

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

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

1 byte mac[] = {
2 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
3 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);

Схема

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

Schematicsfinal 5.png

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

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

Arduino web server ethernet browser 6.png

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

Arduinowebserver-GIF 7.gif

См.также

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