CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Первый опыт работы с FreeDuino :: Управляем светодиодом через локальную сеть

Всем известен пример — мигаем светодиодом на 13 порту. С этого начинали все, кто работал с Arduino. Сегодня мы рассмотрим пример немного посложнее. Мы будем управлять светодиодом через локальную сеть, используя Ethernet shield. Идея очень проста — с помощью Arduino в браузере пользователя мы выводим форму с элементами управления, которые позволяют или включать или отключать светодиод.
Что нам понадобится:
1. Arduino, или другой аналог.
2. Ethernet shield.
3. Библиотеки для работы скрипта. Библиотека Ethernet — входит в состав arduino-0018 и библиотека WString.
4. Светодиод и резистор с рассчитанным сопротивлением.

Библиотека Ethernet — отвечает за работу нашего Ethernet shield. С помощью этой библиотеки мы присвоим нашей плате IP адрес и создадим web-сервер для управления.

Библиотека WString — отвечает за извлечения данных из запроса HTTP по которому передаются данные формы управления.

Внимание! Arduino использует цифровые порты 10, 11, 12 и 13 для обмена информацией с модулем Ethernet shield, и они не могут использоваться для других целей. Подключать светодиод без ограничивающего резистора не рекомендуется. Весь монтаж проводить на обесточенной плате.

Приступаем к работе:
1. По характеристикам светодиода рассчитываем резистор для включения светодиода в схему. Для расчета я использовал следующий ресурс — Калькулятор расчета сопротивления резистора.
2. Подключаем к Arduino модуль Ethernet shield, устанавливаем светодиод в 4 пин, подключаем USB и Ethernet кабель к плате.
3. Загружаем скетч в Arduino.
4. Тестируем. После запуска в браузере по адресу http://192.168.88.25/ (ip адрес можно менять) будет доступна следующая страница:


Ниже представлен скетч для управления светодиодом через локальную сеть.
#include <WString.h>
#include <Ethernet.h>
/*Управление светодиодом через Ethernet */
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //mac - адрес ethernet shielda
byte ip[] = { 192, 168, 88, 25 };	 // ip адрес ethernet shielda
byte subnet[] = { 255, 255, 255, 0 }; //маска подсети
Server server(80); //порт сервера
int ledPin = 4; // указываем что светодиод будет управляться через 4 Pin 
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //изначальный статус светодиода - выключен

void setup(){
  //запускаем Ethernet
  Ethernet.begin(mac, ip, subnet);
  //устанавливаем pin 4 на выход
  pinMode(ledPin, OUTPUT);
  //enable serial datada print
  Serial.begin(9600); 
}
void loop(){
  // Создаем клиентское соединение
  Client client = server.available();
  if (client) {
    while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      //read char by char HTTP request
      if (readString.length() < 30) {
        //store characters to string
        readString.append( c); }
        //output chars to serial port
        Serial.print( c);
        //if HTTP request has ended
        if (c == '\n') {
        //Проверяем включили ли светодиод?
        //Level=1 - включен
        //Level=0 - выключен
          if(readString.contains("Level=1")) {
            //Включаем светодиод
            digitalWrite(ledPin, HIGH); // set the LED on
            LEDON = true;
          }else{
            //Выключаем светодиод
            digitalWrite(ledPin, LOW); // set the LED OFF
            LEDON = false; 
          }
          // Формируем HTML
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<head> ");
          client.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ");
          client.println("<title> Arduino :: Управление V0.1</title>");
          client.println("</head> ");
          client.println("<body");
          //controlling led via radio elements
          client.println("<h1>Управление светодиодом 4pin</h1>");
          if (LEDON){
            client.println("<form method=get name=LED><input type=radio name=Level value=1 CHECKED>Включить
<input type=radio name=Level value=0>Выключить
<input type=submit value=Применить></form>");
            client.println("<font size=’5′>LED-статус: ");
            client.println("<font size=’5′>Вкл.");
          }else{
            client.println("<form method=get name=LED><input type=radio name=Level value=1>Включить
<input type=radio name=Level value=0 CHECKED>Выключить
<input type=submit value=Применить></form>");
            client.println("<font size=’5′>LED-статус: ");
            client.println("<font size=’5′>Выкл");
          }
            client.println("<hr />");
            client.println("</body></html>");
            //clearing string for next read
            readString="";
            //останавливаем web-client
            client.stop();
          }
        }
      }
    }
  }


Upd.№1 Корректно работает в IE8. В Google chrome светодиод при включении почему-то включается и сразу выключается.
Upd.№2 Если заменить наш светодиод на схему управления высоковольтной нагрузкой из статьи «Как с помощью Arduino/CraftDuino можно управлять устройствами на 220В», то можно сделать удаленное управление, например, лампочкой освещения в квартире через интернет. :)

Комментарии (14)

RSS свернуть / развернуть
+
0
отличная работа!
avatar

noonv

  • 20 мая 2010, 19:21
+
0
Не работает пример!!!
Виндовс 7 32 бит, ардуино иде 0022
Мега2560 и шилд w5100
Ошибка и у меня и у других вот:
ethernet.cpp: In function 'void loop()':
ethernet:29: error: 'class String' has no member named 'append'
ethernet:37: error: 'class String' has no member named 'contains'
avatar

nimbus2k

  • 6 августа 2011, 12:59
+
0
Да, в 21 версии ардуино эти операторы были убраны… и плюс к этому в каких то условиях езернет шилд не работает с серийным портом… так что необходимо убрать все операторы Serial, а строки, вызывающие ошибки, надо заменить
readString.append( c);
на
readString.concat( c);
, а
if(readString.contains("Level=1")) {
на
if(readString.indexOf("Level=1") >=0) {
,
данный вариант у меня успешно работает в версии Ardino Ide 0022
avatar

leo

  • 6 августа 2011, 20:57
+
0
В Google chrome светодиод при включении почему-то включается и сразу выключается.


по коду видно что любои запрос на ваш сервер в котором нет «level=1» отключит светодиод…
поэтому скорее всего он отключается сразу же оттого, что этот браузер делает еще какои то запрос на ваш сервер, например каждый раз ищет favicon.ico которого у вас нет, но он видимо надеется его наити… (чтобы узнать какои точно запрос делает этот браузер нужно смотреть результат
Serial.print( c);
в консоли )

соответственно код должен быть

          if(readString.contains("Level=1")) {
            //Включаем светодиод
            digitalWrite(ledPin, HIGH); // set the LED on
            LEDON = true;
          }else if(readString.contains("Level=0")){
            //Выключаем светодиод
            digitalWrite(ledPin, LOW); // set the LED OFF
            LEDON = false; 
          }
avatar

rik

  • 9 августа 2011, 13:54
+
0
Добрый день.
У меня почему то возникла ошибка: Error compiling. Ругается на библиотеку WSting, скачал от автора библиотеку:-(

C:\Documents and Settings\...\arduino-0022\libraries\String\WString.cpp:34: error: prototype for 'String::String(int)' does not match any in class 'String'

Подскажите пожалуйста, кто-нибудь сталкивался с такой проблемой?
avatar

Kirill

  • 31 августа 2011, 14:05
+
0
А сам разобрался, поменял название библиотеки и все заработало, странно:-)
avatar

Kirill

  • 1 сентября 2011, 16:35
+
0
Доброго всем времени суток)
спасибо за данный урок… очень интересна тема с управлением через интернет…
все сделал… скетч загрузился, ошибок не выдает, воткнул его в роутер… на роутере светодиод горит о том что подключен, но в спииске клиентов не отображается, и при вбивании айпи в адрессной строке, долго думает и не заходит(… помогите, что может быть…
avatar

Rash923

  • 9 апреля 2012, 11:52
+
0
и еще я подгружал библиотеки немного другим способом
#include <String.h>
#include <EthernetClient.h>
#include <Ethernet.h>
#include <EthernetServer.h>

библиотеку String пришлось переименовать…

и еще заменил

Server server(80);

на
EthernetServer server(80);


и
Client client = server.available();

на
EthernetClient client = server.available();


побывал на прямую через витую подключить к буку, думал дело в роутере… но и там тоже не удалось зайти на ардуинку…
avatar

Rash923

  • 9 апреля 2012, 12:10
+
0
По поводу прямого подключения к буку:
Вам известно, что патчкорд для подключения к роутеру для подключения к буку напрямую не подойдёт?
Для этого нужен другой кусок витухи с по-другому обжатыми концами, там зелёная и оранжевая пары меняются местами (на одном конце).
avatar

able

  • 9 апреля 2012, 13:40
+
0
Не совсем понял, можно по подробнее на этом месте пожалуйста)
т.е. Я загрузил скетч и что бы мне достучаться до шилда с бука, мне нужна витуха с поменеными местами парами оранж->зеленый?
avatar

Rash923

  • 9 апреля 2012, 15:50
+
0
попытался воспроизвести и со всеми изменениями не хочет подключаться, хотя состальным проблем нет, все примеры работают.
#include <SPI.h>
#include <String.h>
#include <Ethernet.h>
/*Управление светодиодом через Ethernet */
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //mac - адрес ethernet shielda
byte ip[] = { 192, 168, 88, 25 };        // ip адрес ethernet shielda
byte subnet[] = { 255, 255, 255, 0 }; //маска подсети
EthernetServer server(80); //порт сервера
int ledPin = 4; // указываем что светодиод будет управляться через 4 Pin 
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //изначальный статус светодиода - выключен

void setup(){
  //запускаем Ethernet
  Ethernet.begin(mac, ip, subnet);
  //устанавливаем pin 4 на выход
  pinMode(ledPin, OUTPUT);
  //enable serial datada print
  Serial.begin(9600); 
}
void loop(){
  // Создаем клиентское соединение
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      //read char by char HTTP request
      if (readString.length() < 30) {
        //store characters to string
        readString.concat( c); }
        //output chars to serial port
        Serial.print( c);
        //if HTTP request has ended
        if (c == '\n') {
        //Проверяем включили ли светодиод?
        //Level=1 - включен
        //Level=0 - выключен
          if(readString.indexOf("Level=1") >=0) {
            //Включаем светодиод
            digitalWrite(ledPin, HIGH); // set the LED on
            LEDON = true;
          }else{
            //Выключаем светодиод
            digitalWrite(ledPin, LOW); // set the LED OFF
            LEDON = false; 
          }
          // Формируем HTML
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<head> ");
          client.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ");
          client.println("<title> Arduino :: Управление V0.1</title>");
          client.println("</head> ");
          client.println("<body");
          //controlling led via radio elements
          client.println("<h1>Управление светодиодом 4pin</h1>");
          if (LEDON){
            client.println("<form method=get name=LED><input type=radio name=Level value=1 CHECKED>Включить<input type=radio name=Level value=0>Выключить<input type=submit value=Применить></form>");
            client.println("<font size=’5′>LED-статус: ");
            client.println("<font size=’5′>Вкл.");
          }else{
            client.println("<form method=get name=LED><input type=radio name=Level value=1>Включить<input type=radio name=Level value=0 CHECKED>Выключить<input type=submit value=Применить></form>");
            client.println("<font size=’5′>LED-статус: ");
            client.println("<font size=’5′>Выкл");
          }
            client.println("<hr />");
            client.println("</body></html>");
            //clearing string for next read
            readString="";
            //останавливаем web-client
            client.stop();
          }
        }
      }
    }
  }
avatar

Luan

  • 23 мая 2012, 23:29
+
0
У меня все заработало по последнему коду от Luan. Вопрос к вам есть. При подключении Ethernet шилда к Arduino от внешнего блока питания (не USB) сильно ли греется стабилизатор на плате Arduino?
avatar

raefa

  • 28 августа 2012, 19:58

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.