RETO fin de semana: ENC28J60

Hola

Alguien se apunta a un reto de fin de semana, verán tengo una placa enc28j60 que conseguí hace ya bastante tiempo y en su momento la hice funcionar para algo local.

Ahora en otro sistema completamente nuevo y buscando en Internet otras librerías me tope con este articulo en ingles: http://www.tweaking4all.com/hardware/arduino/arduino-enc28j60-ethernet/

Y en otra busqueda me tope con https://thingspeak.com/ que es una base de datos en linea con la que se puede comunicar el arduino o cualquier otro micro controlador para enviar o recibir datos.

__

NO hay premios en especie, aclaro, solo es para aumentar la participación en el foro y para hacer algo cool entre todos(los que se apunten) el fin de semana…
__

El objetivo es hacer funcionar esta placa con cualquiera de las diferentes librerías y comunicarse con thingspeak.com para mandar o recibir datos y de ahí en adelante lo que sea que tengan a la mano se puede usar, vale cualquier placa, sensores y fierros.

Documentar el proceso en un hilo del foro.

Bueno es solo una idea, que les parece?

toda la feina ya ha hecho un Paisano mío hace tiempo. una librería que va igual que la ethernet de la IDE. se llama uipethernet, la uso hace tiempo en proyectos tanto servidor como cliente.

Yo ya lo hice, pero como nadie contesto ya no seguí el hilo.

Hay tres librerias mas o nenos conocidas para este modulo, yo use Ethercard, la favorita de muchos y OneWire para un sensor DS18B20 que mide la temperatura ambiente en mi casa cada 15 minutos.

tuve un problema porque el modem no dejaba conectar al modulo, tenia activado el filtro por mac en mi modem, lo desactive y ya funciono.

Dejo el código:

#include <EtherCard.h>
//Local Network Setings
static byte mymac[] = {0x74, 0x69, 0x69, 0x2D, 0x30, 0x31};
//static byte myip[]  = {192, 168,   1, 123};
//static byte mygw[]  = {192, 168,   1, 254};
//static byte mydns[] = {  8,   8,   8,   8};

byte Ethernet::buffer[500];
static uint32_t timer;
Stash stash;

const char website[] PROGMEM = "api.thingspeak.com";
#include <OneWire.h>
OneWire ds(8);
byte addr[10];
byte data[12];
byte i;
float celsius;

void setup(){
  Serial.begin(9600);
if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) 
    Serial.println(F("Failed to access Ethernet controller"));
    ether.dhcpSetup();//ether.staticSetup(myip, mygw, mydns);
if (!ether.dnsLookup(website))
    Serial.println(F("DNS failed"));

searchds();
}

void loop(){
word len = ether.packetReceive();
word pos = ether.packetLoop(len);

if (millis() > timer ){
    timer = millis() + 900000L;
    Serial.println();
    Serial.print(F(">>> SEND "));
     getTemp();
    sendToThingSpeak();
  }

}

void sendToThingSpeak(){
byte sd = stash.create();
stash.print("1=");
stash.print(celsius);
stash.save();

 Stash::prepare(PSTR("POST /update HTTP/1.1""\r\n"
                      "Host: api.thingspeak.com""\r\n"
                      "Conection: close""\r\n"
                      "X-THINGSPEAKAPIKEY: LLAVE API""\r\n"
                      "Content-Type: application/x-www-form-urlencoded" "\r\n" 
                      "Content-Length: $D" "\r\n" 
                      "\r\n" 
                      "$H"), stash.size(), sd);
 ether.tcpSend();
}

void searchds(){
  if( !ds.search(addr)) {
  //Serial.print("No more addresses.\n");
  ds.reset_search();
  delay(250);
  return;
  }
}
void readData(){
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    //Serial.print(data[i], HEX);
    //Serial.print(" ");
  }
}void getTemp(){
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); 
 
  delay(1000);
  
  readData();
  
int16_t raw = (data[1] << 8) | data[0];

byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  
  celsius = (float)raw / 16.0;
  Serial.print("  Temperature = ");
  Serial.println(celsius);
  
}

https://thingspeak.com/channels/17262
adjunto una imagen!

que buen lugar. No lo conocía.
Llegue tarde para tu propuesta pero me gusta igual.
No tengo el ENC28J60 y si el shield ethernet.
Voy a probar a ver que tal.

A mi me han ido muy bien los ENC28J60 breakout. Tirado de precio en China. Y con la lib UIPEthernet estan compatible con el codigo del Ethernet.h

Solo en vez de #include <Ethernet.h> pones #include <UIPEthernet.h> y ya funciona con el ENC28J60 breakout. Van de coña para construir pequeños (de medida) projectos. Lo uso ya para un temperatura logger, un conmutator (con rele) via web, es decir webserver, incluso en mi proyecto actual del control de la piscina cliente y servidor web a la vez.