Статьи » Разработки |
2015-10-18 в 11:51 (последнее изменение 2023-11-22 в 10:13)
Это статья для тех, у кого давненько пылится этот шилд. Как оказалось, в русском сегменте пример работы найти сложно. Моргать светодиодами уже не всем интересно. Каждому бы хотелось положить начало системе умного дома либо просто сделать страницу с различными датчиками и тем же включением светодиодов. Нашей командой разработчиков была разработана и протестирована за несколько вечеров и одну бессонную ночь прошивка, с который вы сейчас ознакомитесь на примере 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='https://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 - скачать
Список электронных компонентов.
Посмотрите еще эти статьи
Управляем вытяжкой на кухне пультом от телевизора на Arduino Вывод картинки на дисплей 128x64 Детектор микронаушников Ethernet shield w5100 таймер включения на веб странице Вывод различных данных на дисплей LCD 128x64 Подключение датчиков газа и дыма серии MQ к Arduino Не пропустите обновления! Подписывайтесь на нашу группу Вконтакте. Так же у нас есть Telegram канал. Вам понравился наш материал? Поделитесь с коллегами! Просмотров: 73164. Оценка статьи: 4.9 из 5. Уже оценило 354 читателя |
Всего комментариев: 13 | ||||||||||||||
|