Нужна помощь с Arduino Mega 2560, Ethernet Shield W5100, реле и кнопка
- Войдите на сайт для отправки комментариев
Доброе время суток. Я новечек (по крайне мери я так считаю).
Взял код с сайта и начал лепить. В нем несколько датчиков, но пока что убрал для удобства.
Суть в том что, нужно включения реле с web (с HTML+CSS, находится на флешки) сайта и с сенсорной кнопки. С сайта включается, а вот с сенсорной кнопки проблема. Срабатывает с как будто задержкой, нужно нажать и держать или "фапать"(нажимать) нонстопом.
Пребывал код
То что я пробовал решить, но не вышло:
-Думал проблема с delay, но не в нем.
-Убрал все датчики, может из за них. но нет.
-Перебирал код, не помогло.
Пробовал скетч без (HTML+CSS), то есть без флешки(прописывая код HTML в скетче). Все работает хорошо.
Но мне нужно что бы работал с флешкой. Если конечно возможно. Буду очень благодарин за помощь.
Хотел сам разобраться, не писать на форум, но уже пол года не могу разобраться и понять в чем проблема:(
#include <DHT.h> #include <SPI.h> #include <Ethernet.h> #include <SD.h> #define REQ_BUF_SZ 20 #define BUFFER_SIZE 512 boolean butt_flag = 0; boolean butt; 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 }; //вводим mac адрес, обычно он такого вида, может отличаться byte ip[] = { 192, 168, 1, 178 }; // ip in lan (это то, что вам нужно использовать в вашем браузере. ("192.168.1.178") byte gateway[] = { 192, 168, 1, 3 }; // Доступ в Интернет через маршрутизатор byte subnet[] = { 255, 255, 255, 0 }; //маска подсети EthernetServer server(80); bool pin1; bool pin2; bool pin3; bool pin4; // задаем константы const int pinTouch = 50; // номер входа, подключенный к кнопке buttonPin // переменные boolean lastTouch = LOW; // Переменная для сохранения предыдущего состояния кнопки lastButton boolean currentTouch = LOW; // Переменная для сохранения текущего состояния кнопки currentButton void setup() { Serial.begin(9600); //Открыть Монитор порта pinMode(22, OUTPUT); digitalWrite(22, HIGH); //Выключить реле при первом запуске pinMode(pinTouch, INPUT); // инициализируем пин, подключенный к кнопке, как вход SD.begin(4); Ethernet.begin(mac, ip); server.begin(); pin1 = pin2 = pin3 = pin4 = 0; } boolean debounce(boolean last){ boolean current = digitalRead(pinTouch); // Считать состояние кнопки if (last != current) // Если изменилось ... { current = digitalRead(pinTouch); // Считываем состояние кнопки return current; // Возвращаем состояние кнопки } } void loop() { EthernetClient client = server.available(); byte buff[BUFFER_SIZE]; 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 / ") || StrContains(HTTP_req, "GET /index.htm")) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println(); webFile = SD.open("index.htm"); } else if (StrContains(HTTP_req, "GET /lodo.png")) { webFile = SD.open("favicon.ico"); if (webFile) { client.println("HTTP/1.1 200 OK"); 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 /pochva.png")) { webFile = SD.open("pochva.png"); if (webFile) { client.println("HTTP/1.1 200 OK"); client.println(); } } else if (StrContains(HTTP_req, "GET /my.css")) { webFile = SD.open("my.css"); if (webFile) { client.println("HTTP/1.1 200 OK"); client.println(); } } else if (StrContains(HTTP_req, "ajax_flame")) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: keep-alive"); client.println(); client.print((digitalRead(22)) ? "0" : "1"); client.print(":"); client.print((digitalRead(23)) ? "0" : "1"); client.print(":"); client.print((digitalRead(24)) ? "0" : "1"); client.print(":"); client.print((digitalRead(25)) ? "0" : "1"); } else if (StrContains(HTTP_req, "setpin?pin=1")) { pin1 = !pin1; digitalWrite(22, pin1); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println(); } else if (StrContains(HTTP_req, "setpin?pin=2")) { pin2 = !pin2; digitalWrite(23, pin2); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println(); } else if (StrContains(HTTP_req, "setpin?pin=3")) { pin3 = !pin3; digitalWrite(24, pin3); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println(); } else if (StrContains(HTTP_req, "setpin?pin=4")) { pin4 = !pin4; digitalWrite(25, pin4); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println(); } /*-------------------Кнопка для релле-------------------*/ // часть кода для кнопки, реле currentTouch = debounce(lastTouch); if (lastTouch == LOW && currentTouch == HIGH) // Если нажатие (условие для реле) { pin1 = !pin1; } lastTouch = currentTouch; digitalWrite(22, pin1); // Изменить статус состояния реле /*------------------------------------------------------*/ Serial.println("123"); 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(200); // close the connection: client.stop(); } } 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; }
Если Вы
новечек
то, не берите код с сайта, а делайте сами. пусть не с несколькими датчиками, а с парой светодиодв. Потом добавите к ним третий. Так со временем Вы чему-то научитесь.
А брать чужую непонятную портянку на 200+ строк и пытаться запустить её методом тыка - дело совершенно бесперкспетивное.
по крайне мери я так считаю
От части я понимаю что к чему. Подключил датчики(влажность почвы, DHT датчик, модуль RTS, датчик света) все работает, отображает на HTML странице. Перебирал HTML и CSS кода. Понимаю поверхностно, что зачем и как. Сам добавил кнопку(смотря конечно по шаблонам и поделал под себя).
Вот только не понимаю почему не срабатывает корректно.
Т.е. у вас нет времени разобраться в этой портянке, но вы думаете, что у других его просто завались, чтобы денек-другой в отладке посидеть?
Локализуйте ошибку. Подключите вместо сенсорной обычную кнопку, поймите какое минимальное сочетание комплектующих вызывает проблему. После этого создайте минимальный скетч, где ошибка воспроизводится. Его еще хотя бы кто-то будет смотреть... Мое мнение такое.