Первый опыт работы с 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>Включить<br><input type=radio name=Level value=0>Выключить<br><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>Включить<br><input type=radio name=Level value=0 CHECKED>Выключить<br><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В», то можно сделать удаленное управление, например, лампочкой освещения в квартире через интернет. 🙂


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

  1. Не работает пример!!!
    Виндовс 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’

  2. Добрый день.
    У меня почему то возникла ошибка: 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’

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

    • А сам разобрался, поменял название библиотеки и все заработало, странно:-)

  3. Доброго всем времени суток)
    спасибо за данный урок… очень интересна тема с управлением через интернет…
    все сделал… скетч загрузился, ошибок не выдает, воткнул его в роутер… на роутере светодиод горит о том что подключен, но в спииске клиентов не отображается, и при вбивании айпи в адрессной строке, долго думает и не заходит(… помогите, что может быть…

    • и еще я подгружал библиотеки немного другим способом
      #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();

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

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

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

  4. У меня все заработало по последнему коду от Luan. Вопрос к вам есть. При подключении Ethernet шилда к Arduino от внешнего блока питания (не USB) сильно ли греется стабилизатор на плате Arduino?

  5. Да, в 21 версии ардуино эти операторы были убраны… и плюс к этому в каких то условиях езернет шилд не работает с серийным портом… так что необходимо убрать все операторы Serial, а строки, вызывающие ошибки, надо заменить

    readString.append( c);

    на

    readString.concat( c);

    , а

    if(readString.contains("Level=1")) {

    на

    if(readString.indexOf("Level=1") >=0) {

    ,
    данный вариант у меня успешно работает в версии Ardino Ide 0022

  6. В 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; 
              }
    
  7. попытался воспроизвести и со всеми изменениями не хочет подключаться, хотя состальным проблем нет, все примеры работают.

    #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();
              }
            }
          }
        }
      }

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение