Главная > Arduino > Arduino + w5100 + GET

Arduino + w5100 + GET


2 мая 2013. Разместил: dimon
Посмотрим как передать данные GET запросом на web-сервер с помощью Ethernet W5100 Shield Network Expansion Board w/ Micro SD Card Slot.
Для этого напишем простой скетч, который будет принимать по com-порту строку, выводить ее на экран 1602 вместе с количеством принятых строк, делать эхо этой строки в com-порт, и отсылать на веб-сервер ее с помощью GET запроса. В запросе так же передается переменная code, которая является как бы паролем для скрипта на сервере – если эта переменная не совпадет с той, которая записана в скрипте данные будут отброшены. В случае совпадения "пароля ", принятая строка будет записана в текстовый файл.
Это простой пример. Но при желании можно подправить файл rwg.php, который на стороне сервере и обрабатывает принятый GET запрос так чтобы он записывал принятую переменную в базу данных MySQL. Обработка же принятых данных ограничивается только Вашим воображением fellow
Можно, например, каждую минуту передавать значение температуры, а потом строить красивые развернутые по времени графики.

Т.к. шилд использует digital пины 4 (низкий уровень – выбор картридера на шилде), 10 (низкий уровень – выбор ethernet на шилде), 11 (SPI bus – MOSI), 12 (SPI bus – MISO), 13 (SPI bus – CLK), а в наших ранних примерах эти пины использовал дисплей, то придется переподключить дисплей на другие цифровые выходы.

Скетч с кучей комментариев, надеюсь, не требует дополнительных пояснений:

/*
Баловство с w5100 и com-портом
Будем принимать по com-порту строку, выводим ее на экран и передавать ее POST на web-сервер

Оборудование:
- дисплей 1602, потенциометр для подсветки дисплея
- Ethernet W5100 Shield Network Expansion Board w/ Micro SD Card Slot
- web server

Подключение дисплея 1602:
Контакт дисплея  	Контакт Arduino	             Значение
  1	                       GND                   Vss
  2                            5V                    Vdd
  3                            GND	             Vo (контрастность)
  4	                       digital 9	     RS
  5	                       digital 8             R/W
  6	                       digital 7             ENABLE
  11	                       digital 6	     DB4
  12	                       digital 5	     DB5
  13	                       digital 3	     DB6
  14                           digital 2	     DB7
  15	                       5V	             LED+
  16                           GND	             LED-

Подключение W5100:
Обмен данными между Ардуиной и Шилдом происходит по SPI.
Низким уровнем на digital выводе выбирает ведомое устройство на шине SPI:
выбор SD - digital 4
выбор ethernet - digital 10

 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

 */
 
 
 
 // подключаем библиотеки
 #include <LiquidCrystal.h>    // для работы с LCD
 #include <SPI.h>              // для работы с SPI
// #include <SD.h>             // для работы с SD
 #include <Ethernet.h>         // для работы с Ethernet
 

 // инициализируем LCD, указывая контакты данных
 LiquidCrystal lcd(9, 8, 7, 6, 5, 3, 2);


// задаем переменные
boolean receiveFlag = false;      // флаг что было что-то принято через com-порт
String myString;                  // строка
int Count = 1;                    // счетчик
int selectEthernet = 10;          // выбор ведомого на шилде - Ethernet
int selectSd = 4;                 // выбор ведомого на шилде - SD

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};   // mac адрес
byte ip[] = {192, 168, 1, 200};                      // ip если не получим из DHCP
byte gateway[] = {192, 168, 1, 1};                   // gateway
byte subnet[] = {255, 255, 255, 0};                  // маска сети
byte remote_ip[] = {192, 168, 1, 104};               // адрес сервера

// включим Ethernet
#define SWITCH_TO_W5100 digitalWrite(selectSd,HIGH); digitalWrite(selectEthernet,LOW);
// включим SD
#define SWITCH_TO_SD digitalWrite(selectEthernet,HIGH); digitalWrite(selectSd,LOW);
// выключим и SD и Ethernet
#define ALL_OFF digitalWrite(selectEthernet,HIGH); digitalWrite(selectSd,HIGH);


// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP)
EthernetClient client;


 
 void setup() {
   
   
   // красивая "загрузка" программы при старте :)
    lcd.begin(16, 2);
    lcd.print("Loading");
    delay(500);                // ждем 0.5 секунды
    lcd.print(".");
    delay(500);                // ждем 0.5 секунды
    lcd.print(".");
    delay(1000);               // ждем 1 секунду
    lcd.clear();               //очистка экрана
  
 
    Serial.begin(9600); // инициализируем передачу данных по COM-порту
    Serial.println("Start "); //   

    // Задаем режим работы портов  
    pinMode(selectEthernet, OUTPUT);
    pinMode(selectSd, OUTPUT);
    // высокий уровень на обоих - не выбран ведомый на SPI
    digitalWrite(selectEthernet, HIGH);
    digitalWrite(selectSd, HIGH);

 
    // старт Ethernet подключения
    Serial.println("Trying to get an IP address using DHCP");
    if (Ethernet.begin(mac) == 0) 
      {
       Serial.println("Failed to configure Ethernet using DHCP");
       // инициализируем без использования DHCP
       Ethernet.begin(mac, ip, gateway, subnet);
       // пауза 1 секунда - чтобы shield успел инициализироваться
       delay(1000);
       }
      // выведем локальны IP адрес
      Serial.print("My IP address: ");
      for (byte thisByte = 0; thisByte < 4; thisByte++)  
        {
        // печатаем каждый байт IP адреса
        Serial.print(Ethernet.localIP()[thisByte], DEC);
        Serial.print("."); 
        }
      Serial.println(""); 
     
     
}
 
 void loop() {

        
     
    // проверяем буфер com-порта - было ли что-то принято
    if (Serial.available() > 0)     //если есть доступные данные считываем строку
        {  
            
        while (Serial.available() > 0) 
          {
          int inChar = Serial.read();  // считываем символ
          myString += (char)inChar;    // формируем строку
          }  
          
 
        // устанавливаем флаг что нужно обработать принятые данные
        receiveFlag = true; 
     
        // Serial.flush(); // очистим буфер
       
        }




    // если флаг receiveFlag установлен - значит что-то приняли. Обработаем 
    if (receiveFlag == true)
      {
      
      // выводим принятую переменную на экран
      lcd.clear();              //очистка экрана
      
      lcd.setCursor(13, 0);     // устанавливаем курсор в 12-ом столбце, 1 строке
      lcd.print(Count);         // выводим кол-во итераций

      lcd.setCursor(0, 1);      // устанавливаем курсор в 0-ом столбце, 2 строке
      lcd.print(myString);      // выводим myString на экран

      // эхо в com-порт
      Serial.print("String: "); // 
      Serial.println(myString); // эхо myString в com-порт
	 

      // отправим на сервер remote_ip GET запрос 

        // выберем ведомого SPI = включим ethernet        
        SWITCH_TO_W5100;
        
        // если удалось подключиться
        if (client.connect(remote_ip, 80)) 
          {
          Serial.println("connected. Send GET");
          
          // отправка GET
          client.print("GET /arduino/rwg.php?q=");
          client.print(myString);
          client.print("&code=Std3fOry1GfizfT309Hytcklt31"); // защитный код
          client.println(" HTTP/1.1");
          client.println("Host: tudimon.com"); // почему то без этой строки сервер игнорит
                                               // хотя во всех примерах этой строки нет
          client.println("Connection: close");
          client.println();

          // рвем соединение
          client.stop();
          } 
        else 
          {
          // почему то не удалось подключиться к серверу
          Serial.println("connection failed");
          }   
     

        
        // отключим шилд от шины SPI (отключим все)
        ALL_OFF; 


      // подотрем за собой :)
      receiveFlag = false;      // сбрасываем флаг
      myString = "";            // очистка строки
      
      Count++;         // инкремент счетчика 
      
      
      }
	 
	 
     delay(1000);     // задержка перед повторением 


 }


Com-порт, переданные строки:
com-порт, переданные строки


Тестовый файл на сервере - те же самые строки:
Принятые веб-сервером строки


Файлы скрипта (rwg.php), который работает на стороне сервера:
arduino__get.rar [1,06 Kb] (cкачиваний: 190)

Вернуться назад