Arduino и Ethernet Shield W5100 обсуждение цикла статей.
Часть 1 - Начало проекта. Часть 2 - Добавлено динамическое обновление данных и работа с SD картой. Часть 3 - Добавлено оформление страницы. Часть 4 - Добавлено управление реле. Часть 5 - Добавлен регулятор мощности нагрузки в виде ползунка. NEW!!! Часть 6 - Реализация включения реле по таймеру
Здравствуйте. Есть у меня ряд очень странных сложностей. Я несколько изменил скетч, дабы убрать пока что ненужный мне функционал, но у меня есть ряд фундаментальных проблем. Приведу скетч, дабы было ясно, что происходит:
Starting SD initiations... Chip select done Searching index.htm... Found Searching UI.css... Found Searching script.js... Found SD card init DONE GET / HTTP/1.1 Host: 192.168.0.177 Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,-AgяStarting SD initiations... Chip select done Searching index.htm... Found Searching UI.css... Found Searching script.js... Found SD card init DONE
Еще не полностью прочитан запрос, но каким-то боком вылезла функция sd_info(). Я пробовал ее убирать ее вызов, ситуация все та же. Есть идеи, каким боком вообще SD карта попадает сюда? Я же слушаю буфер карты и пишу в буфер контроллера.
Код
while (client.connected()) { if (client.available()) { char c = client.read(); Serial.print(c); if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // save HTTP request character req_index++; }
Добавлено (2016-04-19, 16:01) --------------------------------------------- У меня, кстати, мега, китайская, если это что-то значит
Добавлено (2016-04-19, 16:22) --------------------------------------------- Немного изменил скетч. Добился такого результата:
Код
Setup start Ethernet start Starting SD initiations... Chip select done Searching index.htm... Found Searching UI.css... Found Searching script.js... Found SD card init DONE loop start GET / HTTP/1.1 Host: 192.168.0.177 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecur
после чего контроллер не реагирует ни на что, кроме перезагрузки Перезалил скетч с меги на уно. Результат один в один такой же. Я явно чего-то не понимаю
Добавлено (2016-04-19, 16:40) --------------------------------------------- Добавил задержку между записью символов в буфер.
Код
while (client.connected()) { if (client.available()) { char c = client.read(); Serial.print(c); delay(2); HTTP_req[req_index] = c; // save HTTP request character req_index++;
Привело вот к такому результату
Код
Setup start Ethernet start Starting SD initiations... Chip select done Searching index.htm... Found Searching UI.css... Found Searching script.js... Found SD card init DONE loop start loop start loop start loop start loop start GET / HTTP/1.1 Host: 192.168.0.177 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) Setup start Ethernet start Starting SD initiations... Chip select done Searching index.htm... Found Searching UI.css... Found Searching script.js... Found SD card init DONE loop start loop start loop start ...
Я в прострации, честно говоря
Сообщение отредактировал Vetrinus - Вторник, 2016-04-19, 16:23
ну вот как вам обьяснить , в скетче то ошибок нет, вы хотели инициализацию карты , вы ее получили, а карту то стартовать надо да, посмитрите тут примеры а то зависните и забросите усее.
Ну, а каков должен быть алгоритм? Приведу свое понимание: 1) Поднимаем сеть 2) запускаем SD карту, spi select slave 4 пин 3)Смотрим, есть ли клиенты 4) Если есть, смотрим буфер шилда 5) Если он не пуст, переписываем в программный буфер для парсинга 6) Парсим строку и отдаем нужный файл 7) либо отдаем данные для ajax 8) Закрываем соединения 9) Очищаем буфер шилда
Но у меня контроллер перезагружается на этапе чтения буфера шилда. Setup start.. в ком порту. Причем тут SD карта вообще, ее даже близко в этом месте нет. Снизойдите, пожалуйста. Хотябы номер пункта напишите, в котором ошибка, по вашему мнению.
Если вы хотите спрятать пароль авторизации , у меня мысль такая- создать файл с именем пароля на сд и считывать имя файла для проверки, а не строку в файле или сам фаил на стороне , совпало пускаем , нет идем мимо
А какая разница, с чем сравнивать, если и так и так источник находится на контроллере. А то, что сравнивать, в запросе, который не интерпретируется, т.к. контроллер перезагружается с нуля во время записи запроса в буфер...
Добрый вечер! Нужна ваша помощь. Делаю проект такой как в теме, только использую два датчик газа mq-2 и mq-6, и датчик температуры влажности dht11. Реле не использую. У меня датчики газа не реагируют на газ из зажигалки ни от плиты, не на дым, постоянно такие значения и сами по себе то вверх то вниз меняются. Не сильно +- 30. и температура тоже в помещении всегда 22, 23 градуса ниже ни разу не опускалось. Может что в коде не так или со схемой не то?
// 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 < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // save HTTP request character req_index++; } if (c == '\n' && currentLineIsBlank) { if (StrContains(HTTP_req, "GET /")) { if (StrContains(HTTP_req, "/ ") || StrContains(HTTP_req, "/index.htm")) { sendHtmlFile(client, "index.htm"); } else if (StrContains(HTTP_req, "/favicon.ico")) { sendFile(client, "favicon.ico"); } else if (StrContains(HTTP_req, "/temp.png")) { sendFile(client, "temp.png"); } else if (StrContains(HTTP_req, "/humid.png")) { sendFile(client, "humid.png"); } else if (StrContains(HTTP_req, "/flame.png")) { sendFile(client, "flame.png"); } else if (StrContains(HTTP_req, "/my.css")) { sendFile(client, "my.css"); } else if (StrContains(HTTP_req, "ajax_flame")) { sendBaseAnswer(client); int smoke_gas = 0; //пин на котором подключен MQ-2 int sensorReading = analogRead(smoke_gas); int LPG_gas = 1; //пин на котором подключен MQ-6 int sensorReading1 = analogRead(LPG_gas); int t = dht.readTemperature(); int f = dht.readTemperature(true); int h = dht.readHumidity(); int hif = dht.computeHeatIndex(f, h); int hic = dht.computeHeatIndex(t, h, false); char buff[32]; sprintf(buff, "%d:%d:%d:%d:%d:%d:%d:", sensorReading, sensorReading1, t, f, h, hif, hic); client.println(buff);
sendBaseAnswer(client); } } 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(); } } bool sendHtmlFile(EthernetClient client, char *fileName) { webFile = SD.open(fileName); sendBaseAnswer(client); return sendFile(client, webFile); } bool sendFile(EthernetClient client, char *fileName) { webFile = SD.open(fileName); sendHttpOkAnswer(client); client.println(); return sendFile(client, webFile); } bool sendFile(EthernetClient client, File &webFile) { if (webFile) { while (webFile.available()) client.write(webFile.read()); // send web page to client webFile.close(); return 1; } return 0; } void sendBaseAnswer(EthernetClient client) { sendHttpOkAnswer(client); client.println(F("Content-Type: text/html")); client.println(F("Connection: close")); client.println(); } void sendHttpOkAnswer(EthernetClient client) { client.println(F("HTTP/1.1 200 OK")); }
void StrClear(char *str, char length) { for (int i = 0; i < length; i++) { str [i]= 0; } }
char StrContains(char *str, char *sfind) { char found = 0; char index = 0; char len; len = strlen(str); if (strlen(sfind) > len) { return 0; } while (index < len) { if (str [index]== sfind[found]) { found++; if (strlen(sfind) == found) { return 1; } } else { found = 0; } index++; } return 0; }
index.htm
Код
<html>
<head> <meta http-equiv='content-type' content='text/html; charset=UTF-8'> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> <title>Газоанализатор WEB контроль</title> <link type="text/css" rel="StyleSheet" href="/my.css" /> <script> function GetFlameState() { nocache = "&nocache=" + Math.random() * 1000000; var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (this.readyState == 4) { if (this.status == 200) { if (this.responseText != null) { var arrayOfStrings = this.responseText.split(":");
document.getElementById("flame_txt").innerHTML = arrayOfStrings[0]; document.getElementById("flame2_txt").innerHTML = arrayOfStrings[1]; document.getElementById("tempc_txt").innerHTML = arrayOfStrings[2]; document.getElementById("tempv_txt").innerHTML = arrayOfStrings[3]; document.getElementById("humid_txt").innerHTML = arrayOfStrings[4]; document.getElementById("indc_txt").innerHTML = arrayOfStrings[5]; document.getElementById("indv_txt").innerHTML = arrayOfStrings[6]; for(var i = 1 ; i < 5 ; i++) if(arrayOfStrings[6+i] == "1") document.getElementById("led_"+i).setAttribute("class","button_enabled"); else document.getElementById("led_"+i).setAttribute("class","button_disabled"); } } } } request.open("GET", "ajax_flame" + nocache, true); request.send(null); setTimeout('GetFlameState()', 1000); } function onClick(pin){ var request = new XMLHttpRequest(); request.open("GET", "\setpin?pin=" + pin , false); request.send(null); } function PWM(){ value = document.getElementById("led_PWM").value; var request = new XMLHttpRequest(); request.open("GET", "\setpin?pin=5?value=" + value, false); request.send(null); } </script>
Добавлено (2016-04-30, 00:28) --------------------------------------------- Когда отключаю плату Ethernet и по отдельности проверяю датчики все работают, причем mq-2 показывает всегда примерно 135 и когда подводишь источник газа быстро повышается, а mq-6 показывает примерно 400 и повышается только до 500 когда долго держать. Но как сделать чтоб когда и Ethernet ,была подключена и данные были точные? Когда несколько датчиков и к ардуино, тоже значения уже большая погрешность на mq-2 начинается с 200 и не сильно растет при воздействии газом. Возможно не хватает напряжения, так понимаю?
Всем привет. У меня в зале люстра управляется двумя реле, первое реле отвечает за одну лампу, второе за остальные две. Как переделать код так, чтобы при включении первых двух кнопок включалась и третья, соответственно при включении\выключении третьей включались\выключались первые две. Правильнее будет завести под это дело какую то другую функцию?
До этого для управления использовал связку w5100 и Mega, но без участия SD. Ваш проект понравился гораздо больше, но вот пока не во всё врубаюсь ^^'
Господа всем доброго времени суток. Прошу помощи вашей. Взял пробную страницу по работе с датчиками и кнопками с веб интерфейса с этого сайта. Попробовал все отлично работает. Потом изменил дописал как себе надо и у меня перестал работать вывод инфо с датчиков. Кнопки работают, кто может подскажите плиз че не так прошивку и html выкладываю. код ардуино мега
Код
// listen for incoming clients EthernetClient client = server.available(); if (client) {
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(); }
for(var i = 1 ; i < 9 ; i++) if(arrayOfStrings[23+i] == "1") document.getElementById("led_"+i).setAttribute("class","button_enabled"); else document.getElementById("led_"+i).setAttribute("class","button_disabled"); } } } } request.open("GET", "ajax_flame" + nocache, true); request.send(null); setTimeout('GetFlameState()', 1000); } function onClick(pin){ var request = new XMLHttpRequest(); request.open("GET", "\setpin?pin=" + pin, false); request.send(null); } </script>
<!скрипт вывода даты и текущего времени>
<b><center>
<script type="text/javascript"> function clock() { var d = new Date(); var month_num = d.getMonth() var day = d.getDate(); var hours = d.getHours(); var minutes = d.getMinutes(); var seconds = d.getSeconds();
конкретно не работает функция ajax_flame я там даже включил изменение состояния светодиода нет ответа никакого не пашет хотя функция с кнопками работает.
Вот умеют же некоторые .Это я к y2056 Если сумеете сделать то вам респект . И положите файлы для народа.У меня даже не формируется html. Пустой экран . И вы делаете как я понял на меге. Много выходов задействовано.и dht 11 вроде минусовую температуру не видят.И вроде часовая плата стоит у вас.
Ваша
Код
<td><center><b>Температура <br> в спальне </b></center> <br> <div id="temp1_4"> </div></td> <td><center><b>Влажность <br> в спальне </b></center> <br> <div id="humid1_4"></div></td>