Работа с Ethernet Shield W5100 на примере метеостанции

КУПИТЬ СО СКИДКОЙ

Это статья для тех, у кого давненько пылится этот шилд. Как оказалось, в русском сегменте пример работы найти сложно. Моргать светодиодами уже не всем интересно. Каждому бы хотелось положить начало системе умного дома либо просто сделать страницу с различными датчиками и тем же включением светодиодов.

Нашей командой разработчиков была разработана и протестирована за несколько вечеров и одну бессонную ночь прошивка, с который вы сейчас ознакомитесь на примере Arduino метеостанции.
Здесь мы разберемся, как вывести значения с датчиков, добавить картинки на страницу загрузив их из карты памяти.
Назовем это все Arduino метеостанция.
Ethernet Shield представляется из себя «ломтик сыра для батона», где батон это будет у нас Arduino Uno. Ведь способ их подключения похож на бутерброд=)

Теперь открываем Arduino IDE и открываем Файл — Образцы — Ethernet — WebServer либо копируем отсюда.

byte mac[] = <
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
>;
IPAddress ip(192, 168, 0, 20);

void setup() <
// Open serial communications and wait for port to open:
Serial.begin(9600);

// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print(«server is at «);
Serial.println(Ethernet.localIP());
>

void loop() <
// listen for incoming clients
EthernetClient client = server.available();
if (client) <
Serial.println(«new client»);
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) <
if (client.available()) <
char c = client.read();
Serial.write©;
// if you’ve gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == ‘\n’ && currentLineIsBlank) <
// send a standard http response header
client.println(«HTTP/1.1 200 OK»);
client.println(«Content-Type: text/html»);
client.println(«Connection: close»); // the connection will be closed after completion of the response
client.println(«Refresh: 5»); // refresh the page automatically every 5 sec
client.println();
client.println(» «);
client.println(» «);
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel «);
break;
>
if (c == ‘\n’) <
// you’re starting a new line
currentLineIsBlank = true;
>
else if (c != ‘\r’) <
// you’ve gotten a character on the current line
currentLineIsBlank = false;
>
>
>
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println(«client disconnected»);
>
>

Вот что мы получим, если в строке браузера введем ip-адрес который прописан в коде.

Страница толком не сформирована, только 6 аналоговых датчиков. Кому может быть это интересным? Идем дальше.
Убираем лишнее, оставляя один для датчика дыма и газов MQ-2. А еще добавим строку для подключения датчика температуры и влажности Dht11. А так же сделаем страничку нашу немного информативнее.

Что бы работать с DHT-11, подключаем библиотеку dht11.h прописываем пин на котором подключен датчик (у нас будет 7 цифровой пин) и вводим переменные. Верхняя часть кода получится такой.

Чтобы на страницу выводить русские символы, кириллицу, вызываем команду установки кодировки текста:

Сделаем имя странице, то есть тайтл:

А чтобы наша страничка обновляла значения с датчиков пишем тег «refresh» со значением 5 секунд.

У нас должен получится такой код:

#include
#include
#include
dht11 DHT;
#define DHT11_PIN 7

byte mac[] = <
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
>;
IPAddress ip(192, 168, 0, 20);
EthernetServer server(80);

void setup() <
Ethernet.begin(mac, ip);
server.begin();
>

void loop() <
// listen for incoming clients
EthernetClient client = server.available();
if (client) <
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) <
if (client.available()) <
char c = client.read();
if (c == ‘\n’ && currentLineIsBlank) <
// send a standard http response header
client.println(«HTTP/1.1 200 OK»);
client.println(«Connection: close»);

client.println();
client.println(» «);
client.println(» «);
client.println(» «);
client.println(» «);
client.println(» Данные с датчиков «);

int smoke_gas = 0; //пин на котором подключен MQ-2
int sensorReading = analogRead(smoke_gas);
client.print(«Датчик дыма = «);
client.print(sensorReading);
client.println(«
«);

int chk;
chk = DHT.read(DHT11_PIN);
client.print(«Температура = «);
client.print(DHT.temperature);
client.print(» °C
«);
client.print(«Влажность = «);
client.print(DHT.humidity);
client.print(» %»);
client.print(» «);
client.print(» «);
client.print(» Tehnopage.ru «);

client.println(» «);
break;
>
if (c == ‘\n’) <
// you’re starting a new line
currentLineIsBlank = true;
>
else if (c != ‘\r’) <
// you’ve gotten a character on the current line
currentLineIsBlank = false;
>
>
>
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
>
>

Есть русские символы, тайтл и обновляемая информация с наших датчиков.

На борту w5100 имеет слот sd карты памяти, помоему глупо, делать статью и не вставить в нашу страничку пару иконок.

Подключаем библиотеку для работы с SD картой памяти (она по дефолту идет в IDE).

Говорим программе что надо работать с SD картой. Теперь «Setup» получился такой:

Изображения делаем небольшого размера, чтобы не были на всю страницу. Favicon имеет фиксированый размер 16х16 пикселей и расширение .ico.
Этой строкой мы вызываем показ favicon:

В начало строки выводим картинку.

К остальным значениям по этому примеру.
Но мало прописать ссылку на картинку. Надо еще дать команду на открытие этой картинки. Это необходимо проделать для каждого файла.

После, их надо все закрыть

Вот что должно получиться:

#include
#include
#include
#include
#define REQ_BUF_SZ 20
#define DHT11_PIN 7
dht11 DHT;
File webFile;

char HTTP_req[REQ_BUF_SZ] = <0>; // buffered HTTP request stored as null terminated string
char req_index = 0; // index into HTTP_req buffer
byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED>;
IPAddress ip(192, 168, 0, 20);

void setup() <
Ethernet.begin(mac, ip);
server.begin();
SD.begin(4);
>

void loop() <
// listen for incoming clients
EthernetClient client = server.available();
if (client) <

// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) <
if (client.available()) <
char c = client.read();
if (req_index «);
client.println(» «);
client.println(»
«);
client.println(» «);
client.println(» «);
client.println(» Данные с датчиков «);

int smoke_gas = 0; //пин на котором подключен MQ-2
int sensorReading = analogRead(smoke_gas);
client.print(«Датчик дыма = «);
client.print(sensorReading);
client.println(«
«);

int chk;
chk = DHT.read(DHT11_PIN);
client.print(«Температура = «);
client.print(DHT.temperature);
client.print(» °C
«);
client.print(«Влажность = «);
client.print(DHT.humidity);
client.print(» %»);
client.print(» «);
client.print(» «);
client.print(» Tehnopage.ru «);

client.println(» «);
> else if (StrContains(HTTP_req, «GET /temp.png»)) <
webFile = SD.open(«temp.png»);
if (webFile) <
client.println(«HTTP/1.1 200 OK»);
client.println();
>
>
else if (StrContains(HTTP_req, «GET /humid.png»)) <
webFile = SD.open(«humid.png»);
if (webFile) <
client.println(«HTTP/1.1 200 OK»);
client.println();
>
>
else if (StrContains(HTTP_req, «GET /flame.png»)) <
webFile = SD.open(«flame.png»);
if (webFile) <
client.println(«HTTP/1.1 200 OK»);
client.println();
>
>
else if (StrContains(HTTP_req, «GET /favicon.ico»)) <
webFile = SD.open(«favicon.ico»);
if (webFile) <
client.println(«HTTP/1.1 200 OK»);
client.println();
>
>
if (webFile) <
while (webFile.available()) <
client.write(webFile.read()); // send web page to client
>
webFile.close();
>

req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
break;
>
if (c == ‘\n’) <
// you’re starting a new line
currentLineIsBlank = true;
>
else if (c != ‘\r’) <
// you’ve gotten a character on the current line
currentLineIsBlank = false;
>
>
>
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
>
>

void StrClear(char *str, char length)
<
for (int i = 0; i len) <
return 0;
>
while (index Arduino UNO R3 1 Найти Ethernet Shield W5100 1 Найти Датчик температуры и влажности DHT-11 1 Найти Датчик дыма и газов MQ-2 1 Найти Провода Dupont Папа-Мама Провода Dupont Папа-Мама 6 Найти Cashback на Aliexpress Не пропустите обновления! Подписывайтесь на нашу группу Вконтакте!
Вам понравился наш материал? Поделитесь с друзьями!