Fios e cabos
Ethernet
TCP
IPv4
IPv4
IPv4
Como obter um endereco IP:
IPv6
Como obter um endereco IP:
HTTP
HTTP
Requisicao GET
GET /sobre.html HTTP/1.1
Host: matehackers.org
...... outras informacoes ........
...... linha em branco ............
HTTP
Requisicao POST
POST /login.php HTTP/1.1
Host: matehackers.org
...... outras informacoes .........
...... linha em branco ............
...... conteudo "encoded" .........
HTTP
Resposta do servidor
200 OK
Content-Type: text/html
...... outras informacoes .........
...... linha em branco ............
...... conteudo (da pagina) .........
Arduinos
Baseados nos chips Atmel
Tipos de Ethernet chips
ENC28J60
Wiznet5100
OK. Mas o que vamos precisar de verdade?
Ligacoes fisicas
Configurar endereco MAC
Lets code!
#include <LiquidCrystal.h>
#include <SPI.h>
#include <Ethernet.h>
byte MAC_ADDRESS[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x__ };
byte IP_ADDRESS[]={192,168,0, _ _ _};
byte DNS_SERVER[] = { 192,168,1,1 };
byte DEFAULT_GATEWAY[]={192,168,1,1};
byte SUBNET_MASK[]={255,255,255,0};
LiquidCrystal lcd(9,8,5,4,3,2); // pinos para o LCD
EthernetServer server(80);
Configurar os parametros minimos de rede:
Lets code!
#include <LiquidCrystal.h>
#include <SPI.h>
#include <Ethernet.h>
byte MAC_ADDRESS[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x__ };
byte IP_ADDRESS[]={192,168,0,_ _ _ };
byte DNS_SERVER[] = { 192,168,1,1 };
byte DEFAULT_GATEWAY[]={192,168,1,1};
byte SUBNET_MASK[]={255,255,255,0};
LiquidCrystal lcd(9,8,5,4,3,2); // pinos para o LCD
EthernetServer server(80);
Configurar os parametros do LCD (opcional)
Lets code!
#include <LiquidCrystal.h>
#include <SPI.h>
#include <Ethernet.h>
byte MAC_ADDRESS[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x__ };
byte IP_ADDRESS[]={192,168,0,_ _ _};
byte DNS_SERVER[] = { 192,168,1,1 };
byte DEFAULT_GATEWAY[]={192,168,1,1};
byte SUBNET_MASK[]={255,255,255,0};
LiquidCrystal lcd(9,8,5,4,3,2); // pinos para o LCD
EthernetServer server(80);
Configurar a porta do servidor Arduino
Lets code!
#include <LiquidCrystal.h>
#include <SPI.h>
#include <Ethernet.h>
byte MAC_ADDRESS[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x__ };
byte IP_ADDRESS[]={192,168,0,_ _ _};
byte DNS_SERVER[] = { 192,168,1,1 };
byte DEFAULT_GATEWAY[]={192,168,1,1};
byte SUBNET_MASK[]={255,255,255,0};
LiquidCrystal lcd(9,8,5,4,3,2); // pinos para o LCD
EthernetServer server(80);
Setup
void setup() {
Serial.begin(9600); // Inicializa comunicacao serial com o computador
lcd.begin(16,2); // Especifica o tamanho do lcd
lcd.setCursor(0,0); // Linha inicial do LCD (co X li)
int dhcpip = 0;
dhcpip = Ethernet.begin(MAC_ADDRESS); // Tenta conf. via DHCP
if (dhcpip == 0) { // Se nao conseguiu
delay(1000); // Aguarda o shield reinicializar
Serial.println("IP manual sendo configurado...");
Ethernet.begin(MAC_ADDRESS, IP_ADDRESS, DNS_SERVER, DEFAULT_GATEWAY, SUBNET_MASK); // IP na marra!
Serial.println(Ethernet.localIP());
lcd.print(Ethernet.localIP());
}
else{
Serial.println("Meu IP via DHCP eh: ");
Serial.println(Ethernet.localIP());
lcd.print(Ethernet.localIP());
}
server.begin(); // Inicializa o servidor para "ouvir" requisicoes dos clientes
}
Loop
void loop() {
EthernetClient client = server.available(); // Se cliente conectado, valor = verdadeiro
if (client) {
Serial.println("novo cliente conectado...");
boolean currentLineIsBlank = true; // Uma requisicao HTTP acaba com uma linha em branco
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n' && currentLineIsBlank) { // Se chegou uma linha em branco, o cliente parou de transmitir
client.println("HTTP/1.1 200 OK"); // Hora de trabalhar, Arduino! Transmitindo a resposta....
client.println("Content-Type: text/html"); // Tipo de dado que sera transmitido
client.println("Connection: close"); // A conexao encerra quando parar de responder
//client.println("Refresh: 5"); // Rele automaticamente a pagina a cada 5s
client.println(); // final do cabecalho (header) HTTP
Loop
client.println("<!DOCTYPE html>");
client.println("<head>");
client.println("<title>Arduino Ports - List Page</title>");
client.println("<meta charset="UTF-8" />");
client.println("<link href="//maxcdn.bootstrapcdn.com/bootstrap/
3.3.2/css/bootstrap.min.css" type="text/css" rel="stylesheet" />");
client.println("</head>");
client.println("<body> <div class="row" > <div class="span3 well" > <p></p></div>");
client.println("<div class="span9" style="margin:20px 20px 20px 20px; " >");
client.println("<h3>Sinais dos pinos do Arduino</h3>");
Loop
client.println("<table class="table table-striped table-bordered" >");
client.println("<thead><tr> <th>Pino</th><th>Valor atual</th> </tr></thead>");
client.println("<tbody>");
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("<tr><td>Analog");
client.print(analogChannel);
client.print("</td><td>");
client.print(sensorReading);
client.print("</td></tr>");
}
Loop
for (int digitalChannel = 0; digitalChannel <= 7; digitalChannel++) {
int pinReading = bitRead(PORTD,digitalChannel);
client.print(" <tr><td>Digital");
client.print(digitalChannel);
client.print(" </td><td>");
client.print(pinReading);
client.println(" </td></tr>");
}
for (int digitalChannel = 8; digitalChannel <= 13; digitalChannel++) {
int pinReading = bitRead(PORTB,digitalChannel);
client.print(" <tr><td>Digital");
client.print(digitalChannel);
client.print(" </td><td>");
client.print(pinReading);
client.println(" </td></tr>");
}
Loop
client.println("</tbody></table></div></div>");
client.println("<script type="text/javascript" src="//maxcdn.bootstrapcdn.com/
bootstrap/3.3.2/js/bootstrap.min.js" ></script>");
client.println("<script type="text/javascript" src="https://ajax.googleapis.com/
ajax/libs/jquery/2.1.3/jquery.min.js" ></script>");
client.println("</body>");
client.println("</html>");
break;
} // finaliza a resposta
Loop
if (c == '\n') {
currentLineIsBlank = true;
} else if (c != '\r') {
currentLineIsBlank = false;
}
} // encerra rotina de cliente disponivel
} // encerra rotina de cliente conectado
delay(1); // espera o buffer de envio ser esvaziado pelo navegador
client.stop(); // encerra a conexao com o cliente
Serial.println("Cliente desconectado.");
} // encerra cliente conectado
} // encerra loop
Programas utilizados na apresentacao/oficina:
MateHackers - www.matehackers.org