Посмотрим как передать данные GET запросом на web-сервер с помощью Ethernet W5100 Shield Network Expansion Board w/ Micro SD Card Slot. Для этого напишем простой скетч, который будет принимать по com-порту строку, выводить ее на экран 1602 вместе с количеством принятых строк, делать эхо этой строки в com-порт, и отсылать на веб-сервер ее с помощью GET запроса. В запросе так же передается переменная code, которая является как бы паролем для скрипта на сервере – если эта переменная не совпадет с той, которая записана в скрипте данные будут отброшены. В случае совпадения "пароля ", принятая строка будет записана в текстовый файл. Это простой пример. Но при желании можно подправить файл rwg.php, который на стороне сервере и обрабатывает принятый GET запрос так чтобы он записывал принятую переменную в базу данных MySQL. Обработка же принятых данных ограничивается только Вашим воображением Можно, например, каждую минуту передавать значение температуры, а потом строить красивые развернутые по времени графики.
Т.к. шилд использует 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-порт, переданные строки:
Тестовый файл на сервере - те же самые строки:
Файлы скрипта (rwg.php), который работает на стороне сервера: arduino__get.rar [1,06 Kb] (cкачиваний: 193)
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Чтобы Вам были доступны все функции Вам необходимо либо зарегистрироваться, либо зайти на сайт под своим именем.