Статьи » Разработки |
2015-10-18 в 11:51
Это статья для тех, у кого давненько пылится этот шилд. Как оказалось, в русском сегменте пример работы найти сложно. Моргать светодиодами уже не всем интересно. Каждому бы хотелось положить начало системе умного дома либо просто сделать страницу с различными датчиками и тем же включением светодиодов. Нашей командой разработчиков была разработана и протестирована за несколько вечеров и одну бессонную ночь прошивка, с который вы сейчас ознакомитесь на примере Arduino метеостанции.
Теперь открываем Arduino IDE и открываем Файл - Образцы - Ethernet - WebServer либо копируем отсюда. Код
#include <SPI.h>
#include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 0, 20); EthernetServer server(80); 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("<!DOCTYPE HTML>"); client.println("<html>"); // output the value of each analog input pin for (int analogChannel = 0; analogChannel < 6; analogChannel++) { int sensorReading = analogRead(analogChannel); client.print("analog input "); client.print(analogChannel); client.print(" is "); client.print(sensorReading); client.println("<br />"); } client.println("</html>"); 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 аналоговых датчиков. Кому может быть это интересным? Идем дальше. Что бы работать с DHT-11, подключаем библиотеку dht11.h прописываем пин на котором подключен датчик (у нас будет 7 цифровой пин) и вводим переменные. Верхняя часть кода получится такой. Библиотека DHT11 - скачать Код
#include <dht11.h>
#include <SPI.h> #include <Ethernet.h> dht11 DHT; #define DHT11_PIN 7 Чтобы на страницу выводить русские символы, кириллицу, вызываем команду установки кодировки текста: Код
client.println("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>");
Сделаем имя странице, то есть тайтл: Код
client.println("<title>Данные с датчиков</title>");
А чтобы наша страничка обновляла значения с датчиков пишем тег "refresh" со значением 5 секунд. Код
client.println("<meta http-equiv='refresh' content='5'/>");
У нас должен получится такой код: Код
#include <dht11.h>
#include <SPI.h> #include <Ethernet.h> 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("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<meta http-equiv='refresh' content='5'/>"); client.println("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>"); client.println("<title>Данные с датчиков</title>"); int smoke_gas = 0; //пин на котором подключен MQ-2 int sensorReading = analogRead(smoke_gas); client.print("Датчик дыма = "); client.print(sensorReading); client.println("<br />"); int chk; chk = DHT.read(DHT11_PIN); client.print("Температура = "); client.print(DHT.temperature); client.print(" °C<br/>"); client.print("Влажность = "); client.print(DHT.humidity); client.print(" %"); client.print("</br>"); client.print("</br>"); client.print("<form action='http://tehnopage.ru 'target='_blank'><button type='submit' >Tehnopage.ru</button></form>"); client.println("</html>"); 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). Код
#include <SD.h>
Говорим программе что надо работать с SD картой. Теперь "Setup" получился такой: Код
void setup() {
Ethernet.begin(mac, ip); server.begin(); SD.begin(4); } Изображения делаем небольшого размера, чтобы не были на всю страницу. Favicon имеет фиксированый размер 16х16 пикселей и расширение .ico. Код
client.println("<link rel='shortcut icon' href='favicon.ico' type='image/x-icon'>");
В начало строки выводим картинку. Код
client.print("<img src='/flame.png'/>Датчик дыма = ");
К остальным значениям по этому примеру. Код
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(); } Вот что должно получиться: Код
#include <dht11.h> char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string EthernetServer server(80); void setup() { void loop() { // an http request ends with a blank line if (StrContains(HTTP_req, "GET / ")) { client.println("Connection: close"); client.println(); int chk; client.println("</html>"); void StrClear(char *str, char length) char StrContains(char *str, char *sfind) len = strlen(str); if (strlen(sfind) > len) { Загружаем код в ардуину, все файлы в корень sd карты, в браузере получим такую страницу. Библиотека DHT11 - скачать
Список электронных компонентов.
Не пропустите обновления! Подписывайтесь на нашу группу Вконтакте. Так же у нас есть Telegram канал. Вам понравился наш материал? Поделитесь с коллегами! Просмотров: 70115. Оценка статьи: 4.9 из 5. Уже оценило 354 читателя |
Всего комментариев: 13 | |||||||||||||||||||||||||||
|