Arduino:Примеры/Веб-сервер из платы Arduino и шилда Arduino Ethernet, управляющий реле
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
![]() |
Черновик |
Содержание
Веб-сервер из платы 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 вольтам
Необходимое оборудование
Ниже – полный список компонентов, необходимых для этого проекта:
- Плата Arduino Uno – на eBay
- Шилд Arduino Ethernet Shield – на eBay
- Реле-модуль – на eBay
- Шнур-соединитель для лампы – на eBay
- Макетная плата – на eBay
- Провода-перемычки – на eBay
Код
Скопируйте код, показанный ниже, в 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);
Схема
Соберите цепь, как показано на картинке ниже:
Демонстрация
Страница созданного вами веб-сервера будет выглядеть в браузере следующим образом:
А вот демонстрация того, как проект выглядит вживую:
См.также
Внешние ссылки