Tutorial Módulo Ethernet ENC28J60 y Arduino
En este tutorial aprenderemos a usar el Módulo Ethernet ENC28J60, con un ejemplo sencillo en donde accederemos a nuestro Arduino desde internet, encenderemos un LED y visualizaremos la lectura de un potenciómetro desde un navegador web.
El Módulo Ethernet ENC28J60 es popular por su bajo costo, si bien esta desarrollado por Microchip, existen librerías para hacerlo trabajar con Arduino, consume mucho más memoria que el Ethernet Shield, pero para aplicaciones básicas es muy útil.
Existe gran información y ejemplos de este módulo en la red, así como diferentes librerías, para este tutorial utilizaremos una de las librerías más usadas, la librería Ethercard.
Para realizar el Tutorial necesitamos un Arduino Uno, un módulo ENC28J60, un potenciómetro, un Led, una resistencia, un protoboard, cables DuPont y un cable Ethernet para conectarnos a nuestro Modem, router o switch
Conexiones entre el Módulo Ethernet ENC28J60 y Arduino
Módulo ENC28J60 |
Arduino Uno |
---|---|
VCC |
Pin 3.3V |
GND |
Pin GND |
SS (CS) |
Pin 10 |
MOSI (SI) |
Pin 11 |
MISO (SO) |
Pin 12 |
SCK |
Pin 13 |
Hay que resaltar que las conexiones son válidas para el Arduino Uno o placas basadas en el Atmega328 (Arduino mini pro, Arduino nano, etc) pues el Módulo ENC28J60 usa la comunicación SPI, por lo que si se trabaja con el Mega, se tiene que conectarse a sus pines SPI correspondientes.
Una vez hecho toda la conexión pasamos a programar el sketch para el Arduino
Programa para el Módulo Ethernet ENC28J60
Si es la Primera vez que estamos programando este módulo es necesario descargar e importar a nuestro IDE de Arduino la librería Ethercard.
Una vez importado la librería escribimos el siguiente sketch:
#include <EtherCard.h> static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x01,0x05}; static byte myip[] = {192,168,1,177}; byte Ethernet::buffer[700]; const int ledPin = 2; char* EstadoLed="OFF"; void setup () { Serial.begin(9600); Serial.println("Test del Modulo ENC28J60"); if (!ether.begin(sizeof Ethernet::buffer, mymac, 10)) Serial.println( "No se ha podido acceder a la controlador Ethernet"); else Serial.println("Controlador Ethernet inicializado"); if (!ether.staticSetup(myip)) Serial.println("No se pudo establecer la dirección IP"); Serial.println(); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); } static word homePage() { BufferFiller bfill = ether.tcpOffset(); bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n" "Content-Type: text/htmlrnPragma: no-cachernRefresh: 5\r\n\r\n" "<html><head><title>Naylamp Mechatronics</title></head>" "<body>" "<div style='text-align:center;'>" "<h1>Test del Módulo ENC28J60</h1>" "Tiempo transcurrido : $L segundos" "<br /><br />Estado del LED: $S<br />" "<a href=\"/?status=ON\"><input type=\"button\" value=\"ON\"></a>" "<a href=\"/?status=OFF\"><input type=\"button\" value=\"OFF\"></a>" "<br /><br />Potenciómetro: $D (resolución de 1024)" "<br /><br />" "<a href='https://naylampmechatronics.com/'>naylampmechatronics.com</a>" "</body></html>" ),millis()/1000,EstadoLed,analogRead(0)); return bfill.position(); } void loop() { word len = ether.packetReceive(); word pos = ether.packetLoop(len); if(pos) { if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) { Serial.println("Comando ON recivido"); digitalWrite(ledPin, HIGH); EstadoLed = "ON"; } if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) { Serial.println("Comando OFF recivido"); digitalWrite(ledPin, LOW); EstadoLed= "OFF"; } ether.httpServerReply(homePage()); // se envia página Web } }
Ahora expliquemos lo principal del código:
static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x01,0x05}; static byte myip[] = {192,168,1,177};
Aquí configuramos nuestra Mac y la IP , podemos poner cualquier valor, evitando duplicar con algún otro equipo conectado a nuestra red.
En void setup () inicializamos el módulo Ethernet y reportamos por el puerto serial, aquí también configuramos el pin del led como salida.
En la función static word homePage() escribimos nuestra página web, la cual debe estar en formato HTML:
static word homePage() { BufferFiller bfill = ether.tcpOffset(); bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n" "Content-Type: text/htmlrnPragma: no-cachernRefresh: 5\r\n\r\n" "<html><head><title>Naylamp Mechatronics</title></head>" "<body>" "<div style='text-align:center;'>" "<h1>Test del Módulo ENC28J60</h1>" "Tiempo transcurrido : $L segundos" "<br /><br />Estado del LED: $S<br />" "<a href=\"/?status=ON\"><input type=\"button\" value=\"ON\"></a>" "<a href=\"/?status=OFF\"><input type=\"button\" value=\"OFF\"></a>" "<br /><br />Potenciómetro: $D (resolución de 1024)" "<br /><br />" "<a href='https://naylampmechatronics.com/'>naylampmechatronics.com</a>" "</body></html>" ),millis()/1000,EstadoLed,analogRead(0)); return bfill.position(); }
Notar que para enviar datos de variables hay que usar los marcadores $L $S $D para después enviar los datos de tipo Long, cadena, y decimal respectivamente.
También estamos configurando para que el navegador vuelva a cargar la página cada 5 segundos esto se hace con “Refresh: 5”, es necesario cunado estamos mostrando datos que cambian constantemente. El tiempo de actualización dependerá del tipo de dato que se está mostrando. En algunas aplicaciones esto no es necesario o se opta por poner un botón para actualizar. Si no se desea simplemente quitar “Refresh: 5” en la función de la página web.
La siguiente comparación se hace para ver si se han enviado datos desde el navegador mediante el método GET
if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) { Serial.println("Comando ON recivido"); digitalWrite(ledPin, HIGH); EstadoLed = "ON"; }
En este caso estamos comparando si se ha recibido un dato con el método GET de la siguiente forma ?status=ON , esto sucede si en el navegador se presiona el botón ON (ver el código HTML del botón en la función anterior)
Una vez escrito el sketch lo cargamos a nuestro Arduino.
Solo faltaría conectar el módulo ENC28J60 con un cable Ethernet a aun modem, router, switch o a la PC.
Ahora desde un navegador web de nuestra laptop, celular o tablet, accedemos a nuestro Arduino escribiendo la IP (para nuestro ejemplo 192.168.1.177) en el navegador.
Modificando el código HTML se pueden lograr diseños da paginas mas complejas, se pueden agregar imágenes, cambiar la fuente y tamaño del texto, agregar tablas, pero esto dependerá de la habilidad de programación en HTML que tengamos.
Ru** ***ko 29/03/2023 Responder
Hola, estimados. Una consulta. ¿Es posible acceder a la página web que se aloja en el ENC28J60 desde un segundo arduino con algún comando get o post, de modo que cuando se sense algo en una entrada del segundo arduino poder accionar a través del ENC28J60 las salidas del arduino original de modo de accionar un relay? permitiría recibir una entrada en arduino 2 y accionar sobre un relay a través de tcp/ip en arduino 1, el cual está conectado al ENC28J60...LO* *Nu 14/11/2022 Responder
Deberían subir el código corregido, porque ese código tiene varias fallas y algunos que recién empiezan les complica entender eso y terminan enredándose mas ...iv** 28/05/2022 Responder
hola soy nuevo en esto y estoy muy interesado, ademas me parece que tu explicación esta muy bueno. tengo un problema el código lo cargo con arduino el mismo que compartió y lo subo pero y no tengo problema pero la ip no me la reconoce que puede ser graciasCE*** 18/02/2022 Responder
MUY BUENO PERO CUANDO ESCRIBO UNA PAGINA MAYOR DE 1500 BYTES NO FUNCIONA, POR FAVOR PODES VER POR QUE PASA ESO?na**** 08/12/2021 Responder
to tentando passar um dado float que li do sensor dht11 usando o %D,%f,%s,%l mas todos aparecem numeros aleatoriosDa*** ******** ***be 04/12/2020 Responder
porque no me quiere abrir la pagina y arme y desarme el circuito muchas veces, mes estoy volviendo locoFr******* ******** *******no 20/05/2020 Responder
Buenas amigos. A continuacion el codigo HTML arreglando el tema de las comillas y los saltos de linea , funcional en Chrome y IE ( solo probe en estos dos).//Encabezado
"HTTP/1.0 200 OKrn"
"Content-Type: text/htmlrn"
"Pragma: no-cachern"
"Refresh: 5rnrn"
//Codigo HTML
"
""
"
"
Test del Modulo ENC28J60
""Tiempo transcurrido : $L segundos" //$L= Datos tipo Long
"
Estado del LED: $S
" //$S= Datos tipo String
""
""
"
Potenciometro: $D (resolucion de 1024)" //Datos tipo Decimal
"
"
"www.naylampmechatronics.com"
""
Br*** **va 26/04/2020 Responder
Buenas tardesTengo el inconveniente de que si lo conecto a través del router con cable UTP normal o cruzado no funciona, tanto las luces del puerto del router como el del modulo estan apagadas (solo luz roja de alimentacion del circuito ENC28J60). Si aparece el mensaje de conexion en el serial de arduino. Si conecto con cable cruzado a una laptop directamente al moudlo ethernet si lo reconoce y parpadean las luces de envio y recepcion del modulo, y puedo acceder a la pagina y encender y apagar un led.
Habra que configurar el tipo de conexion o algo mas para que pueda funcionar? quiero acceder atreves de un router.
Muchas gracias
Br*** ********ia 20/05/2020 Responder
Buenas noches Bruno, en mi caso lo pude solucionar dándole más información, colocando la puerta de enlace que corresponde a la dirección del router. En donde se define el ip coloca directamente lo siguiente.#define STATIC 1
#if STATIC
static byte myip[] = {192,168,xxx,xxx}; //el ip que asignas a tu dispositivo.
static byte gwip[] = { 192,168,xxx,1 }; //dirección de puerta de enlace.
#endif
Espero te sirva.
Saludos
Se**** **** ****** ******** *******ma 11/03/2020 Responder
Hola, quiero hacer funcionar un Rele en vez del LED, hice toda la coneccion como se muestra, compila bien en el Monitor Serie me sale q inicio bien el modulo, pero no piedo hacer ping al equipo, que podria ser??Da**** 05/03/2020 Responder
Hola! Muy interesante proyecto lo estoy tratando de probar con un Arduino uno y no he logrado visualizar la página desde el navegador, no hace ping desde la cmd. Lo escribí tal cual y no me ha funcionado. Por favor cuál puede ser el problema?Gracias.
jo** 21/02/2020 Responder
Hola JGGC. Por si te sirve, el problema es que los retornos de carro y la nueva línea no están bien escritos en el header HTTP. Si querés mandame un mail y te mando el código con las correcciones. Mi mail es: [email protected]JG** 15/02/2020 Responder
Buen Día, el problema que tengo es que no se ve la pagina web, si no el código fuente guardado en el Arduino.Hice un post en: https://forum.arduino.cc/index.php?topic=664945.0
Para mas información, si alguien puede ayudarme se lo agradecería.
De antemano, agradezco la atención prestada.
Saludos y Gracias.
ta*** 09/01/2020 Responder
disculpa, la dirección mac del módulo cómo la sabes?Ca**** 07/12/2019 Responder
No he conseguido mostrar información de variables mas alla de $D $L.Que debo hacer para mostrar los valores de mis propias variables?
Gracias!
Br*** ******** ********* ********ín 03/08/2019 Responder
hola, fijate que lo he programado en arduno mega y en arduino uno, y en ninguno me ha funcionado, no se cual es el problema, en el monitor serie todo parece normal, pero al introducir la direccion ip en mi navegador simplemente dice que no esta disponible la pagina, podrian ayudarmeGu***** 11/04/2019 Responder
¿Y por que no se puede recibir nada por medio de wifi? intente recibir datos conectado via wifi pero no me dejaba mas que cable ethernetLo***** 01/06/2019 Responder
¿Será porque se trata solo de un módulo con conector y especificaciones Ethernet? :-)Ya nos explicarás como lo has intentado conectarlo por Wifi...
AL** 15/11/2018 Responder
hola el programa me compila y carga bien, abro el serial me aparece test del modulo ENC28J60 controlador ethernet inicializado pero al poner la ip en cualquier dispositivo no carga solo me aparece no se puede accederMi**** *********th 31/10/2018 Responder
Saludos.Entonces si es compatible con el arduino nano?
sa**** 24/07/2018 Responder
duda,¿podría conectar este proyecto con una aplicación en android en lugar de la pagina web?
lu** ***ña 02/07/2018 Responder
Pongo la ip en la PC, celular, Laptop y nada. No conecta. La tarjeta si tiene comunicacion con el arduinoSi**** 22/06/2018 Responder
Prueba este codigo#include
static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x01,0x05};
static byte myip[] = {192,168,1,177};
byte Ethernet::buffer[700];
const int ledPin = 2;
char* EstadoLed="OFF";
void setup () {
Serial.begin(9600);
Serial.println("Test del Modulo ENC28J60");
if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
Serial.println( "No se ha podido acceder a la controlador Ethernet");
else
Serial.println("Controlador Ethernet inicializado");
if (!ether.staticSetup(myip))
Serial.println("No se pudo establecer la dirección IP");
Serial.println();
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
static word homePage() {
BufferFiller bfill = ether.tcpOffset();
bfill.emit_p(PSTR("HTTP/1.0 200 OKrn"
"Content-Type: text/htmlrnPragma: no-cachernRefresh: 5rnrn"
"
""
"
"
Test del Módulo ENC28J60
""Tiempo transcurrido : $L segundos"
"
Estado del LED: $S
"
""
""
"
Potenciómetro: $D (resolución de 1024)"
"
"
"www.naylampmechatronics.com"
""
),millis()/1000,EstadoLed,analogRead(0));
return bfill.position();
}
void loop() {
word len = ether.packetReceive();
word pos = ether.packetLoop(len);
if(pos) {
if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
Serial.println("Comando ON recivido");
digitalWrite(ledPin, HIGH);
EstadoLed = "ON";
}
if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
Serial.println("Comando OFF recivido");
digitalWrite(ledPin, LOW);
EstadoLed= "OFF";
}
ether.httpServerReply(homePage()); // se envia página Web
}
}
lu*** 24/05/2018 Responder
Amigo, me sale texto plano pero no me muestra como pagina web. Alguna sugerencia por favor.fi***** 07/05/2018 Responder
Hay un pequeño error en el post:En la linea donde mandas las cebeceras HTTP parece.
"Content-Type: text/htmlrnPragma: no-cachernRefresh: 5rnrn"
Creo que el editor te quito las diagonales del retorno de carro y del salto de linea, por lo cual al cargar el código y al realizar el request el navegador al no saber cual es el content-type acaba mostrando el contenido como crea conveniente(depende del navegador) yo lo probe en Crhome y me mostraba el contenido como si fuera texto plano.
Para que sea mas claro creo que debería quedar en 3 lineas(ya que eso son) algo como:
"Content-Type: text/htmlrn",
"Pragma: no-cachern",
"Refresh: 5rnrn",
Mayor info sobre las cabeceras y contenidos posibles:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
Fe**** 26/03/2018 Responder
Compañero, me compila y me sube a la arduino, pero al intentar abrir la página con la ubicacion IP que le di no carga.Jh**** 27/03/2018 Responder
Checa en el monitor serial de arduino si hay comunicaciónpuede que entre arduino y el modulo no haya conexion
o que entre el modulo y tu router
abre la ip desde un ordenador o laptop,
por ejemplo en mi caso
desde el celular me aparece que no puedo tener acceso
y en la laptop sin problemas
Al******* ***** 24/12/2017 Responder
Buenos dias una pregunta el modulo solo se puede configurar como server o tambien hay posibilidad de hacer la configuracion para cliente?iv** 03/12/2017 Responder
disculpen, tengo que ocupar afuerza el arduino uno, es que ocupo el arduino mega y no me hace nada solo me manda el mensaje de test del moduloAu****** *****ez 03/11/2017 Responder
HOla me interesa programar el arduino con modulo de audio y red para hacer streaming o llevar audio desde un punto a otro por media de la red IP (enlace dedicado de IP - punto a punto)Què modelo me recomiendas usar y como hacer la configuración para codificar el audio y enviarlo
gracias por tu ayuda
ga***** ******* ***to 22/08/2017 Responder
vcs podem me responder no meu email por gentileza se vao fazer videos ????Ga***** 22/08/2017 Responder
Ola gostei muito desse lugar, vcs podem por mais para eu copiar e colar para apreender sou aluno senai????e coloca um videos de tutorial no youtube???.-_- e nos seus doido.FE***** 13/06/2017 Responder
Muchas gracias por el aporte señores de NayLamp; porfa pueden facilitarme sobre como se crea los botones como en el ejemplo. "ON" "OFF", le agradezco de ante mano. saludos desde Huancavelica.E-mail:[email protected]
Ar*** 28/04/2017 Responder
Hola Hice todo exactamente igual. y el monitor serial me diceTest del Modulo ENC28J60
No se ha podido acceder a la controlador Ethernet
No hay link con el router al cual lo conecte. la ip esta bien configurada.
El modulo solo prende una luz roja D1 y ninguna mas. el router es un linksys.
Lo tengo conectado por USB a una Netbook conectada con el cargador a la red electrica.
El arduino es un arduino nano.
Espero tu pronta respuesta. Saludos
Na***** 30/04/2017 Responder
Hola Ariel, revisa nuevamente tus conexiones, parece que no hay comunicación entre el arduino y el ENC28J60. En ether.begin() asegúrate de especificar el número 10, que corresponde al pin SS de la comunicación SPI. Si no se especifica por defecto es el pin 8.Fe****** ******ar 24/03/2017 Responder
Tengo e.print(pos1); o ethernet.print(pos1); estos si los veo en mi IP 192.168.1.100 y puedo prender y apagar el led y veo mis valores en pantalla pero, como obtengo un valor tipo $_post o $_get? :D Otra vez Saludos!Na***** 25/03/2017 Responder
Cuando se reciben datos por POST o GET estos se reciben en la petición http, y se guardan en la variable buffer, cuando presionamos los botones se envían valores con el método GET, por eso realizamos la búsqueda con if(strstr(...., "GET /?status=ON") != 0), la función strstr() devuelve la posición a partir de donde encuentra la cadena que se está buscando. Si lo que deseas es leer una variable, tendrías que leer el número a partir de la posición obtenida en strstr().Fe****** ******ar 24/03/2017 Responder
y como envio un dato como $volts=read.analog()+calculos... si obtengo en salida 4.3 ó 99 ó 255; algunas secuencias no me funcionan con ethernet.h ni con Ethercard, solo con Ether_28J60 pero aún no puedo enviar datos. las cadenas string en Ether_28J60 parece que las desconoce o quizás mi librería es algo obsoleta; por ejemplo bajé tu version Ethercard y no obtuve errores, pero una que bajé ayer que es igual me puso varios errores. SaludosNa***** 25/03/2017 Responder
Hola Fernando, En nuestro ejemplo solo enviamos datos enteros, para esto usamos $D y $L para enviar una variable tipo flotante como 4.3, tienes que usar $T, si $T no funciona agrega después de #include la línea: #define FLOATEMIT7Ma**** 04/11/2018 Responder
Hola, tengo el mismo problema que Fernando Baltazar, probe con $T y agregando la linea #define FLOATEMIT7 pero aun asi no consigo que me muestre valores con decimales, de hecho me muestra valores que no se aproximan ni por asomo a lo que deberia, por ejemplo en valor analogico me muestra 223 que corresponderia a 12.5v (el valor correcto lo veo bien en el monitor serie), pero bajo web veo 32461. Podrias guiarme un poco, ya me queme mucho la cabeza y no encontre solucion. GraciasJU** 14/02/2017 Responder
word len = ether.packetReceive();word pos = ether.packetLoop(len);
ESOS COMANDOS SON LOS DEL POTENCIOMETRTO?
Na***** 18/02/2017 Responder
Hola Juan, esas líneas son la longitud y posición de la petición http del cliente, el valor del potenciómetro lo obtenemos en la función static word homePage() en el interior del texto html enviamos marcadores $L $S $D para después enviar variables de tipo Long, cadena, y decimal respectivamente.Pa*** 27/12/2016 Responder
Hola! muy buen tutorial, me funciono bien, solo queria hacer una pregunta. Puedo accesar desde cualquier computadora al modulo ethernet, me refiero a que si puedo accesar desde otro LAN. digamos yo estar lejos de mi casa y por medio de internet accesar al modulo ethernet, o solo funciona para dispositivos de la misma LAN?Na***** 18/02/2017 Responder
Hola Pablo, para acceder remotamente a tu arduino, tienes que abrir un puerto de tu Router y asignar dicho puerto a la IP del Arduino. Posterior a esto para acceder remotamente en lugar de ingresar usando la IP de tu arduino ahora tienes que usar la IP publica de tu LAN, que generalmente es dinámica. El puerto por defecto para los navegadores es el 80, si configuraste otro tienes que digitarlo junto a la IP cuando accedas remotamente.fi***** 08/05/2018 Responder
Aquí hay un detalle, y es que muchos routers tienen el puerto 80(HTTP) o 443(HTTPS) abierto,(para la administración remota) esto genera conflictos al intentar hacer el NAT(abrir el puerto publico)., A mí me pasó esto y tuve que hacer la NAT al puerto 8088, y para acceder escribo desde mi navegador http://mi-ip:8088En el código del Arduino le tuve que agregar la siguiente línea en la función setup:
ether.hisport = 8088
Para mayor información revisar la incidencia #154 del proyecto oficial:
https://github.com/jcw/ethercard/issues/154
Suerte!!
je*** 06/12/2016 Responder
me gustaria saber como imprimo los valores de un sensor de esa forma.Na***** 14/12/2016 Responder
Hola Jesus, Para enviar, variables hazlo de la misma forma como enviamos el valor de la lectura analógica en el ejemploEd** 19/10/2016 Responder
Hola!, no consigo hacerlo funcionar, me vuelvo loco con las comillas!, podrías pasarme el código final por correo? [email protected] , gracias . SaludosLe***** 15/05/2017 Responder
Buenas tardes.Me pasa lo mismo y ya estoy loco con las " si dispones del código final y puedes pasarlo
pues también lo agradecería.
Hablamos.
Lu***** 07/09/2016 Responder
Hola, muy bueno el tutorial.Lo unico con lo que me volvi loco es que tuve que sacarle el encabezado html para que funcione en chrome e IE("HTTP/1.0 200 OKrn" "Content-Type: text/htmlrnPragma: no-cachernRefresh: 5rnrn")
Y aparte no estan casteadas las comillas en las lineas:
""
""
En /?status=ON y /?status=OFF presenta errores que se solucionan al usar comillas simples.
Por lo menos asi me funciono a mi.
Te lo comento por si estoy haciendo algo mal por favor decimelo, y si te ayuda a corregir algún error en el código que no hayas visto genial!
Saludos!
Vl****** ***ic 21/01/2021 Responder
me funciono con estas modificaciones al códigojo*** ******do 29/01/2017 Responder
Hola al compilar el código me aparecen errores de comillas en la seccion de codigo HTML podrias ayudarme con esto o si lo tienes corregido.Te agradezco las atenciones, saludos.
Ne* 29/10/2016 Responder
Hola, Luciano! Estuve leyendo tu comentario sobre el error y la corrección que le diste, por favor podrías explicarlo un poco mejor, y si podrías enviarme alguna info te lo agradeceré. Mi correo es [email protected]Le**** 28/09/2016 Responder
Luciano! hola, disculpa veo que ya pudiste resolver los errores que manda al verificar, podrias pasarme tu codigo final? mi correo es [email protected], de antemano muchas gracias, saludosNa***** 14/09/2016 Responder
Hola Luciano, efectivamente, las comillas podrían confundir al compilador, pues estas las interpreta como inicio y fin de una cadena. todas las comillas internas deben ir con\" , tenemos un error al digitar el codigo en nuestro blog que borra el \ , estaremos solucionandolo pronto. La comilla simple también funciona en este caso, y es el navegador quien se encarga de corregir esto, pero si es para mostrar comillas en un texto html se pueden remplazar por " que en html se usa para texto con comillas.