Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Ambox content.png Черновик


Веб-сервер из платы 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

См.также

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

  1. randomnerdtutorials.com - Arduino Ethernet Web Server with Relay