ENC28J60 и Arduino Leonardo

Нет ответов
janlam
Offline
Зарегистрирован: 28.01.2014
Доброго времени суток.
 
Иемю в наличии Ардуино Леонардо и ENC28J16 Шилд. Нашёл единственную библиотеку и скеч который вообше удалось запустить. Брал здесь http://computer-service.pro/smf/index.php/topic,31.msg67.html#msg67 . Всё запускается. Захожу через браузер,и вижу там картину информация по Аналоговы выходам. И дигитальные выходы 3,5,6,7,8,9 значение которых я могу поменять, и в реале они меняются. На леонардо от шлда подkлючил SI, SO, GND, PCT, SCK включены к ICSP контактам. 2 и 10 контактк понятное дело заняты опять же таки шилдом. Вопрос следующий: Как мне воспользоваться контактами 4,11,12,13. В скетче ничего не нашёл как это сделать. Может они где то в библиотеке заблокированы? Но порылся по файлам библиотеки, ничего такого не увидел. Помогите пожалуйста разобраться.
 

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


// Present a "Will be back soon web page", as stand-in webserver.
// 2011-01-30 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

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




//int sensorValue = 0;  // variable to store the value coming from the sensor


#define CONFIG_EEPROM_ADDR ((byte*) 0x40)


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



// ethernet mac address - мак адрес должен быть уникальным для каждого устройства сети
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

static BufferFiller bfill; // used as cursor while filling the buffer
byte Ethernet::buffer[1300]; // tcp/ip размер буфера


static void loadConfig() {
    for (byte i = 0; i < sizeof config; ++i)
        ((byte*) &config)[i] = eeprom_read_byte(CONFIG_EEPROM_ADDR + i);
 // значения поумолчанию если group не равно 1
 if (config.group != 1) {
        config.group = 1;
        config.debug = 1;
        config.auto_dhcp = 0;
        config.refresh = 5;
    }
}

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


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

#define STATIC 1  // 1 выключает DHCP



#if STATIC
// ip адрес
static byte myip[] = { 192,168,1,15 };
// ip адрес шлюза
static byte gwip[] = { 192,168,1,1 };

#endif





void setup(){
  Serial.begin(57600);
  Serial.println("\n[myWEB_Server]");
  
    	/* выключение SD card 4pin*/
  	pinMode(4, OUTPUT);
  	digitalWrite(4, HIGH);
  
  pinMode(9, OUTPUT);
  	digitalWrite(9, LOW);
  
  
  

    pinMode(3, OUTPUT);       
    digitalWrite(3, LOW);  

      for (int i=5;i<=9;i++){
    pinMode(i, OUTPUT);       
    digitalWrite(i, LOW);  
  }
  
 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);
    //---------------------------------------------   

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

buf.emit_p(PSTR( 
"Analog in<br/>"
"<br/>"));

for (int analogChannel = 0; analogChannel <=5; analogChannel++) {
buf.emit_p(PSTR("<span>Analog in $D = $D</span><br/>"),analogChannel,analogRead(analogChannel));
}
/*******************************************************************/

  buf.emit_p(PSTR("<br>Digital out<br/><br/>"));
 buf.emit_p(PSTR("<span>Digital out&nbsp;$D = $D</span><A HREF ='IS$D"),3,digitalRead(3),3);
      if(digitalRead(3) == 1)
buf.emit_p(PSTR("0"));
else
buf.emit_p(PSTR("1"));
buf.emit_p(PSTR("'>&nbsp;Изменить</A>"));

buf.emit_p(PSTR(""));






buf.emit_p(PSTR("<br/>"));
buf.emit_p(PSTR("<span>Digital out&nbsp;$D = $D</span><A HREF ='IS$D"),9,digitalRead(9),9);
      if(digitalRead(9) == 1)
buf.emit_p(PSTR("0"));
else
buf.emit_p(PSTR("1"));
buf.emit_p(PSTR("'>&nbsp;Изменить</A>"));

buf.emit_p(PSTR(""));









buf.emit_p(PSTR("<br/>"));
     for (int digitalChannel = 5; digitalChannel <= 9; digitalChannel++) {
buf.emit_p(PSTR("<span>Digital out&nbsp;$D = $D</span><A HREF ='IS$D"),digitalChannel,digitalRead(digitalChannel),digitalChannel);
      if(digitalRead(digitalChannel) == 1)
buf.emit_p(PSTR("0"));
else
buf.emit_p(PSTR("1"));
buf.emit_p(PSTR("'>&nbsp;Изменить</A>"));

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

buf.emit_p(PSTR("</div></div></div></div></body></html>"));

buf.emit_p(PSTR("<br/><br/><br/>"
                "- <a href='c'>configure</a> -<br/>"
                "<br/>"));
  }
  
  //------------------------------------
  
  
  
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 g = getIntArg(data, "g");// тут выискиваем переменные из формы
        byte d = getIntArg(data, "d", 0);
        byte c = getIntArg(data, "a", 0);
        word r = getIntArg(data, "r");

        if (1 <= g && g <= 250 && 1 <= r && r <= 3600) {
            // присваиваем внутренним переменым новые значения
            config.group = g;
            config.debug = d;
            config.auto_dhcp = c;
            config.refresh = r;
     Serial.println(config.debug);      
            saveConfig();//сохраненине новых настроек EEPROM
            loadConfig();// загрузка новых настроек из EEPROM
            // перенаправление на домашную страничку
            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"
    "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>"
        "<h3>Настройка Web Server ARDUINO</h3>"
        "<form>"
          "<p>"), okHeader);
          

    buf.emit_p(PSTR("Net group <input type=text name=g value='$D' size=3> (1..250)<br>"
                    "Включение режима отладки: <input type=checkbox name=d value='1' $S><br> "
                    "Получение IP по DHCP: <input type=checkbox name=a value='1' $S><br> "
                    "Авто обновление страницы <input type=text name=r value='$D' size=4> (1..3600 секунд)"
                    "</p>"
                    "<input type=submit value=Set>"
        "</form>"), config.group,
                    config.debug ? "CHECKED" : "",
                    config.auto_dhcp ? "CHECKED" : "",
                    config.refresh);//имена переменных выгледят так "name=r"
#if DEBUG
    buf.emit_p(PSTR("<br>"));
    buf.emit_p(PSTR(" ($D bytes free)"), freeRam());
#endif
}

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

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 /IS", data, 7) == 0)
            struktPage(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
                     }



}

static void struktPage(const char* data,  BufferFiller& buf) {
#if SERIAL
Serial.println(data[8]);  
Serial.println(data[7]);  
#endif

    int nivel = 0;
    int porten = 0;
    if(data[8] == '0') 
    {
         nivel = 0;   
    }     
    else  
    {
         nivel = 1;   
    }     
        if (data[7] == '3')
        {
        digitalWrite(3, nivel);
           buf.emit_p(PSTR(
                "HTTP/1.0 302 found\r\n"
                "Location: /\r\n"
                "\r\n"));
            return;
        }
        else if (data[7] == '5')
        {
        digitalWrite(5, nivel);
           buf.emit_p(PSTR(
                "HTTP/1.0 302 found\r\n"
                "Location: /\r\n"
                "\r\n"));
            return;
        }
        else if (data[7] == '6')
        {
        digitalWrite(6, nivel);
           buf.emit_p(PSTR(
                "HTTP/1.0 302 found\r\n"
                "Location: /\r\n"
                "\r\n"));
            return;
        }
        else if (data[7] == '7')
        {
        digitalWrite(7, nivel);
           buf.emit_p(PSTR(
                "HTTP/1.0 302 found\r\n"
                "Location: /\r\n"
                "\r\n"));
            return;
        }        
        else if (data[7] == '8')
        {
        digitalWrite(8, nivel);
           buf.emit_p(PSTR(
                "HTTP/1.0 302 found\r\n"
                "Location: /\r\n"
                "\r\n"));
            return;
        }
        else if (data[7] == '9')
        {
        digitalWrite(9, nivel);
            buf.emit_p(PSTR(
                "HTTP/1.0 302 found\r\n"
                "Location: /\r\n"
                "\r\n"));
            return;
        }
         else
            buf.emit_p(PSTR(
                "HTTP/1.0 401 Unauthorized\r\n"
                "Content-Type: text/html\r\n"
                "\r\n"
                "<h1>401 Unauthorized</h1>"));   
}


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