Нужна помощь с Arduino Mega 2560, Ethernet Shield W5100, реле и кнопка

Shadowzix
Offline
Зарегистрирован: 05.05.2018

Доброе время суток. Я новечек (по крайне мери я так считаю).

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

Суть в том что, нужно включения реле с 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;
}

 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если Вы 

Shadowzix пишет:

новечек

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

А брать чужую непонятную портянку на 200+ строк и пытаться запустить её методом тыка - дело совершенно бесперкспетивное.

Shadowzix пишет:

по крайне мери я так считаю

Shadowzix
Offline
Зарегистрирован: 05.05.2018

От части я понимаю что к чему. Подключил датчики(влажность почвы, DHT датчик, модуль RTS, датчик света)   все работает, отображает на HTML странице. Перебирал HTML и CSS кода. Понимаю поверхностно, что зачем и как. Сам добавил кнопку(смотря конечно по шаблонам и поделал под себя).

Вот только не понимаю почему не срабатывает корректно.

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Т.е. у вас нет времени разобраться в этой портянке, но вы думаете, что у других его просто завались, чтобы денек-другой в отладке посидеть?  

Локализуйте ошибку. Подключите вместо сенсорной обычную кнопку, поймите какое минимальное сочетание комплектующих вызывает проблему. После этого создайте минимальный скетч, где ошибка воспроизводится. Его еще хотя бы кто-то будет смотреть... Мое мнение такое.