Ethercard.h + VirtualWire.h + UNO R3

murikoz
Offline
Зарегистрирован: 17.02.2016

Всем привет. Я начинающий ардуинщик. Не могу собрать скетч, его суть, чтобы на enc28j60 подключенного к UNO R3 сделать вебсервер на пару строк(типа <a href..../a>). При нажатии на эти ссылки посылается GET запрос. Библиотека Ethercard принимает запрос, и потом обработав этот запрос ардуина отправляет определенную команду  по передатчику 433мГц на другую ардуино мини, которая в свою очередь обрабатывает принятую информацию...... Проблема в передатчике вернее в скетче на UNO.

1. Не могу разобраться какое количество buffer[NNN] мне надо поставить чтобы все заработало - и было оптимальным, а не просто от балды. Память нужно экономить. Если ставлю 770 компилятор не ругается. Если 800 ругается. Пороговое значение гдето 790.

Скетч использует 11 298 байт (35%) памяти устройства. Всего доступно 32 256 байт.
Глобальные переменные используют 1 572 байт (76%) динамической памяти, оставляя 476 байт для локальных переменных. Максимум: 2 048 байт.
Недостаточно памяти, программа может работать нестабильно.

Если ставлю пороговое значение(т.е. около 790), программа вроде работает(запускается инициализация и тд) при открытии сайта 192.168.1.222 сайт не открывается, а при отладке в Serial получаю что "word len = ether.packetReceive();" переменная len равна 0. Это первая проблема.

2. Если ставлю буфер на 770 и комментирую строки использующие библиотеку VirtualWire

/*vw_set_tx_pin(9);
vw_set_ptt_inverted(true);
vw_setup(2000); */

программа начинает работать. Захожу на сайт нажимаю на ссылки... Но мне также нужно использовть VirtualWire  чтобы отправлять команды на др ардуинку. Соответственно раскоментировав функционал уже не работает.

Грешу на память. Не так сильно разбираюсь в микроконтроллерах, но в кодах, что то понимаю.

P.S. Когда запускаю программу по 1-му сценарию(см.выше), при отладке увидел что ардуино 2 раза инициирует setup(). 

Собственно код:

#include <EtherCard.h>
#include <VirtualWire.h>

static byte mymac[] = { 0x5A,0x5A,0x5A,0x5A,0x5A,0x5A };

static byte myip[] = { 192,168,1,222 };

// Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера.
byte Ethernet::buffer[800];
BufferFiller bfill;

const char http_OK[] PROGMEM =
  "HTTP/1.0 200 OK\r\n"
  "Content-Type: text/html\r\n"
  "Pragma: no-cache\r\n\r\n";

const char http_Found[] PROGMEM =
  "HTTP/1.0 302 Found\r\n"
  "Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =
  "HTTP/1.0 401 Unauthorized\r\n"
  "Content-Type: text/html\r\n\r\n";

/**не обращайте внимание на 503 service unavailable, иногда все работает(буфер 770 и строки для VirtualWire библиотеки закомментированны), а при буфере 800 не хочет.**/
const char page[] PROGMEM =
"HTTP/1.0 503 Service Unavailable\r\n"
"Content-Type: text/html\r\n"
"Retry-After: 600\r\n"
"\r\n"
"<html>"
  "<body>"
    "<a href=?btn=20DF10EF>o</a><br />"
    "<a href=?btn=20DF906F>m</a><br />"
  "</body>"
"</html>"
;


void setup() {
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    {}
  ether.staticSetup(myip);
  vw_set_tx_pin(9);
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);      // Bits per sec
}

// --------------------------------------

void loop() {
  delay(1); // Дёргаем микроконтроллер.

  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  Serial.println(len);
  if (pos) {Serial.println("p");
    bfill = ether.tcpOffset();
    char *data = (char *) Ethernet::buffer + pos;
    if (strncmp("GET /", data, 5) != 0) {
      bfill.emit_p(http_Unauthorized);
    }
    else {
      data += 5;
      if (data[0] == ' ') {       
        //homePage();//старая версия программы, не понимаю зачем здесь проверка условия
      }
      // "14" = количество символов "?btn=20DF10EF ".
      else if (strncmp("?btn=20DF10EF ", data, 14) == 0) {
        //здесь обработка и отправка команды на др ардуино используя VirtualWire
        //.....
        bfill.emit_p(http_Found);
      }
      else {
        bfill.emit_p(http_Unauthorized);
      }
    }
    memcpy_P(ether.tcpOffset(), page, sizeof page);
    ether.httpServerReply(sizeof page-1);
  }
}

 

murikoz
Offline
Зарегистрирован: 17.02.2016

Кто нибудь помогите? или помогите реализовать эту схему по другому если решения нет. Очень нужно уже месяц сижу и мучаюсь ничего не получается