Помогите с Web Serverom на ардуинке

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

arturmon
Сообщения: 155
Зарегистрирован: Сб июл 07, 2012 11:42 pm

Помогите с Web Serverom на ардуинке

Сообщение arturmon »

Добрый день.
подскажите кто может, проблемка с ардуинкой а точнее с библиотекой <EtherCard.h>
ни как не могу разобраться :cry: информации слишком мало по библиотеке, а так хочется переделать вот этот web server для ENC https://github.com/sergiomokshin/Arduino-WebServer
1 не получается передать параметры стилей (тупо не достучаться становится до ардуинки
2 не могу с помощью цикла вывести в веб некоторые переменные

может кто уже работал с этой библиотекой и подскажет как решить данную проблему.

Код: Выделить всё





// Present a "Will be back soon web page", as stand-in webserver.
// 2011-01-30 <[email protected]> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>
#include <avr/eeprom.h>


#define DEBUG   0   // set to 1 to display free RAM on web page
#define SERIAL  0   // set to 1 to show incoming requests on serial port

#define CONFIG_EEPROM_ADDR ((byte*) 0x10)


// configuration, as stored in EEPROM
struct Config {
 //   byte band;
    byte group;
    byte collect;
    word refresh;
    byte valid; // keep this as last byte
} config;

#define STATIC 0  // set to 1 to disable DHCP (adjust myip/gwip values below)

#if STATIC
// ethernet interface ip address
static byte myip[] = { 192,168,0,200 };
// gateway ip address
static byte gwip[] = { 192,168,0,10 };

#endif

// ethernet mac address - must be unique on your network
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

static BufferFiller bfill; // used as cursor while filling the buffer
byte Ethernet::buffer[1000]; // tcp/ip send and receive buffer


static void loadConfig() {
    for (byte i = 0; i < sizeof config; ++i)
        ((byte*) &config)[i] = eeprom_read_byte(CONFIG_EEPROM_ADDR + i);
  //  if (config.valid != 253) {
  //      config.valid = 253;
 //       config.band = 8;
 // странная проверка по первому признаку!! если ему не соответсвует то все сбрасывает на те которые ниже
 if (config.group != 1) {
        config.group = 1;
        config.collect = 1;
        config.refresh = 5;
    }
 //   byte freq = config.band == 4 ? RF12_433MHZ :
 //               config.band == 8 ? RF12_868MHZ :
 //                                  RF12_915MHZ;
 //   rf12_initialize(31, freq, config.group);
}

static void saveConfig() {
    for (byte i = 0; i < sizeof config; ++i)
        eeprom_write_byte(CONFIG_EEPROM_ADDR + i, ((byte*) &config)[i]);
}


#if DEBUG
static int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}
#endif



void setup(){
  Serial.begin(57600);
  Serial.println("\n[myWEB_Server]");
  
    	/* Disable SD card */
  	pinMode(4, OUTPUT);
  	digitalWrite(4, HIGH);
 loadConfig();
   Serial.print("MAC: ");
  for (byte i = 0; i < 6; ++i) {
    Serial.print(mymac[i], HEX);
    if (i < 5)
      Serial.print(':');
  }
  Serial.println();
     
     delay(2000);
     
  if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0) 
    Serial.println( "Failed to access Ethernet controller");
    Serial.println("Setting up DHCP");
#if STATIC
  ether.staticSetup(myip, gwip);
#else
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
#endif

  ether.printIp("My IP: ", ether.myip);
  ether.printIp("Netmask: ", ether.mymask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);

}

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

  static void homePage(BufferFiller& buf) {
    //---------------------------------------------
        buf.emit_p(PSTR("$F\r\n"
        "<meta http-equiv='refresh' content='$D'; charset=\"utf-8\"/>"
        "<title>Web Server Arduino</title>"), okHeader, config.refresh);
    //---------------------------------------------   

buf.emit_p(PSTR( 

"<style>"
/****************************тут первая проблема. как толко раскоментирую ардуина стоновится недоступной******************
".TableSite{width: 960px;margin: 0 auto;}"
".Banner{width: 970px;height: 120px;background-color:#3399CC;padding-top: 1px;}"
".Main{padding-top: 30px;width: 970px;background-color:#EEEEEE;height: 500px;margin: 0 auto;overflow:auto;}"
".MainMonitor{width:100%;height:100%;position:relative;}"
".BlockMonitorEntry{padding-left: 20px;margin-left: 20px;background-color: #FFFFFF;width:430px;height:430px;float:left;border:thin solid #CCCCCC;}"
".BlockItemMonitor{padding-top: 10px;}"
".TextOutput{float:left;margin-right:15px;}"
".IconSaida{width:15px;height:15px;marging-left:50px;margin-right:10px;float:left}"
*/***************************************************************************************************************
"h1{font-size:20px;margin-left: 10px;font-name: Calibri;color:white;padding-top: 5px;}"
"span{font-size:13px;font-name: Calibri;color:black;}"

"</style>"

"<body><div class='TableSite'>"
"<div class='Banner'><h1>WebServer Arduino ALPHA</h1></div>"
"<div class='Main'>"



"<div class='BlockMonitorEntry'><div class='BlockItemMonitor'>"
"Entradas Analogicas<br/>"
"<br/><pre>"));
 Serial.println("Start @for@");
 for (int analogChannel = 0; analogChannel <=5; analogChannel++) {
 // #if SERIAL
 Serial.println(analogChannel);
 Serial.println("=");
 Serial.println(analogRead(analogChannel));
//#endif
/*****************************не выполняется цикл, точнее ни чего не выводится и тоже не доступна стоновится**************
 buf.emit_p(PSTR("<span>Entrada Analogica $D"),analogChannel);  
 buf.emit_p(PSTR(" = "));
buf.emit_p(PSTR("$D</span><br/>\r\n"),analogRead(analogChannel)); 
buf.emit_p(PSTR("</span><br/>")); 
*/***********************************************************************************************************

}

buf.emit_p(PSTR(
"<br/><br/><br/>"
"- <a href='c'>configure</a> -<br/>"
"<br/>"
"</div>"
"</div>"


 
"<div class='BlockMonitorEntry'><div class='BlockItemMonitor'>"
"Saidas Digitais<br/><br/>"));
/*
   for (int digitalChannel = 0; digitalChannel <= 7; digitalChannel++) {
      
buf.emit_p(PSTR("<div class='IconSaida' style='background-color:"));
     if(digitalRead(digitalChannel) == 1)
             buf.emit_p(PSTR("red;'></div>"));
      else    
             buf.emit_p(PSTR("lightgray;'></div>"));      
buf.emit_p(PSTR("<span>Saida Digital&nbsp;"));
buf.emit_p(PSTR("$D"),digitalChannel);
buf.emit_p(PSTR(" = "));
buf.emit_p(PSTR("$D"),digitalRead(digitalChannel));
buf.emit_p(PSTR("</span>"));
buf.emit_p(PSTR("<A HREF ='http://192.168.1.70/IS"));
buf.emit_p(PSTR("$D"),digitalChannel);
      if(digitalRead(digitalChannel) == 1)
buf.emit_p(PSTR("0"));
else
buf.emit_p(PSTR("1"));
buf.emit_p(PSTR("'>&nbsp;Alterar saida</A>"));

buf.emit_p(PSTR(""));
buf.emit_p(PSTR("<br/>"));
*/
buf.emit_p(PSTR("</div></div></div></div>"));


  long t = millis() / 1000;
  word h = t / 3600;
  byte m = (t / 60) % 60;
  byte s = t % 60;

buf.emit_p(PSTR(  
    "<h1>Uptime is $D$D:$D$D:$D$D</h1>"
    "<h2>test</h2>"
    "</body></html>"),h/10, h%10, m/10, m%10, s/10, s%10);

#if DEBUG
    buf.emit_p(PSTR(" ($D bytes free)"), freeRam());
#endif
 
}
  //------------------------------------
static int getIntArg(const char* data, const char* key, int value =-1) {
    char temp[10];
    if (ether.findKeyVal(data + 7, temp, sizeof temp, key) > 0)
        value = atoi(temp);
    return value;
}


static void configPage(const char* data, BufferFiller& buf) {
    // pick up submitted data, if present
    if (data[6] == '?') {
   //     byte b = getIntArg(data, "b");
        byte g = getIntArg(data, "g");
        byte c = getIntArg(data, "c", 0);
        word r = getIntArg(data, "r");
        if (1 <= g && g <= 250 && 1 <= r && r <= 3600) {
            // store values as new settings
   //         config.band = b;
            config.group = g;
            config.collect = c;
            config.refresh = r;
            saveConfig();
            // re-init RF12 driver
            loadConfig();
            // clear history
            //memset(history_len, 0, sizeof history_len);
            // redirect to the home page
            buf.emit_p(PSTR(
                "HTTP/1.0 302 found\r\n"
                "Location: /\r\n"
                "\r\n"));
            return;
        }
    }
    // else show a configuration form
    buf.emit_p(PSTR("$F\r\n"
        "<h3>Web Server configuration</h3>"
        "<form>"
          "<p>"
 //   "Freq band <input type=text name=b value='$D' size=1> (4, 8, or 9)<br>"
    "Net group <input type=text name=g value='$D' size=3> (1..250)<br>"
    "Collect mode: <input type=checkbox name=c value='1' $S> "
        "Don't send ACKs<br><br>"
    "Refresh rate <input type=text name=r value='$D' size=4> (1..3600 seconds)"
          "</p>"
          "<input type=submit value=Set>"
        "</form>"), okHeader, config.group,
                    config.collect ? "CHECKED" : "",
                    config.refresh);
}

//==========================================

void loop(){
    word len = ether.packetReceive();
    word pos = ether.packetLoop(len);
    // check if valid tcp data is received
    if (pos) {
     bfill = ether.tcpOffset(); 
     char* data = (char *) Ethernet::buffer + pos;

 #if SERIAL
        Serial.println(data);
#endif
        // receive buf hasn't been clobbered by reply yet
        if (strncmp("GET / ", data, 6) == 0)
            homePage(bfill);
        else if (strncmp("GET /c", data, 6) == 0)
            configPage(data, bfill);
//        else if (strncmp("GET /send", data, 6) == 0)
//            sendPage(data, bfill);
        else
            bfill.emit_p(PSTR(
                "HTTP/1.0 401 Unauthorized\r\n"
                "Content-Type: text/html\r\n"
                "\r\n"
                "<h1>401 Unauthorized</h1>"));   
                       ether.httpServerReply(bfill.position()); // send web page data
                     }

}


arturmon
Сообщения: 155
Зарегистрирован: Сб июл 07, 2012 11:42 pm

Re: Помогите с Web Serverom на ардуинке

Сообщение arturmon »

немного подразобрался с библиотекой <EtherCard.h> оказалось что просто не хватает буфера (buffer[1000]).
печально либо придется обламываться и остаться без красивого интерфейса )
либо искать как "упаковать" домашнюю страницу и передать как один пакет.
похоже ни кто arduino не балуется... :mrgreen:
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am

Re: Помогите с Web Serverom на ардуинке

Сообщение ser009 »

arturmon писал(а):немного подразобрался с библиотекой <EtherCard.h> оказалось что просто не хватает буфера (buffer[1000]).
печально либо придется обламываться и остаться без красивого интерфейса )
либо искать как "упаковать" домашнюю страницу и передать как один пакет.
похоже ни кто arduino не балуется... :mrgreen:
почему не балуется???
Я тоже делаю webserver
arturmon
Сообщения: 155
Зарегистрирован: Сб июл 07, 2012 11:42 pm

Re: Помогите с Web Serverom на ардуинке

Сообщение arturmon »

ser009 писал(а):
arturmon писал(а):немного подразобрался с библиотекой <EtherCard.h> оказалось что просто не хватает буфера (buffer[1000]).
печально либо придется обламываться и остаться без красивого интерфейса )
либо искать как "упаковать" домашнюю страницу и передать как один пакет.
похоже ни кто arduino не балуется... :mrgreen:
почему не балуется???
Я тоже делаю webserver
на каком шилде? на EthernetShield W5100 или на enc28j60?
на 5100 полно информации, а на enc очень жидко ( не понятно как сделать передачу страницы которая больше буфера ) может знаете? :?:
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am

Re: Помогите с Web Serverom на ардуинке

Сообщение ser009 »

arturmon писал(а):
ser009 писал(а):
arturmon писал(а):немного подразобрался с библиотекой <EtherCard.h> оказалось что просто не хватает буфера (buffer[1000]).
печально либо придется обламываться и остаться без красивого интерфейса )
либо искать как "упаковать" домашнюю страницу и передать как один пакет.
похоже ни кто arduino не балуется... :mrgreen:
почему не балуется???
Я тоже делаю webserver
на каком шилде? на EthernetShield W5100 или на enc28j60?
на 5100 полно информации, а на enc очень жидко ( не понятно как сделать передачу страницы которая больше буфера ) может знаете? :?:
У меня есть и тот и другой
У меня запустился W5100 сразу.
Код взял вот отсюда http://smartliving.ru/forum/viewtopic.php?f=4&t=257

Что касается enc28j60 меньше информации и готовых проектов для ковыряния. Будет время позанимаюсь
Все эксперименты проводятся на работе на рабочем компе.
Сейчас в планах покупка отдельного железа под это дело.
Пока все на коленке и на макетке, кусочками отдельными мелкими фрагментами и только в испытательном режиме
arturmon
Сообщения: 155
Зарегистрирован: Сб июл 07, 2012 11:42 pm

Re: Помогите с Web Serverom на ардуинке

Сообщение arturmon »

Похоже проще заказть 5100 чеи что то написать под ENC :(
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am

Re: Помогите с Web Serverom на ардуинке

Сообщение ser009 »

arturmon писал(а):Похоже проще заказть 5100 чеи что то написать под ENC :(
Писатель из меня тоже никудышный, вот так у меня и появилось 2 модуля :mrgreen:
arturmon
Сообщения: 155
Зарегистрирован: Сб июл 07, 2012 11:42 pm

Re: Помогите с Web Serverom на ардуинке

Сообщение arturmon »

как приедет 5100 может вместе накалякаем что нибудь :roll:
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am

Re: Помогите с Web Serverom на ардуинке

Сообщение ser009 »

arturmon писал(а):как приедет 5100 может вместе накалякаем что нибудь :roll:
OK :idea:
arturmon
Сообщения: 155
Зарегистрирован: Сб июл 07, 2012 11:42 pm

Re: Помогите с Web Serverom на ардуинке

Сообщение arturmon »

Пока жду Сетевушку на Wiz 5100 пише неспешно на том что есть, тоесть enc28j60.
вот что пока может:

1 Имеет веб интерфейс в котром можно "пощелкать" портами (думаю через MajorDoMo пощелкать тоже будет не проблема :D )
2 можно просматривать состояние аналоговых портов (брать тоже через MajorDoMo можно)
3 сделал настройки рефреша которые сохраняются в EEPROM
4 Получать iP через DHCP или устанавливать вручную (хочу сделать это в настройках через веб)
Вложения
my_scetch.rar
(3.22 КБ) 467 скачиваний
EtherCard.rar
Либы для 1.0.2
(74.78 КБ) 395 скачиваний
Ответить