5. Internet das Coisas
“Uma rede de objetos (coisas) dotadas de
sensores e/ou atuadores que se comunicam
com outros objetos, sistemas e pessoas”
-Torna mais fácil a vida das pessoas
-Mudança definitiva
28. O Que é Arduino?
Plataforma para a
criação de
prototipos
– Hardware Livre
– Fácil de Usar
– Origem em
Wiring
• C/C++
Imagem: http://arduino.cc/
29. É um dispositivo que conecta o
mundo físico com o mundo
virtual!
O Que é Arduino?
30. @plantaiot
Plantas dão uma sensação de
leveza e vida
– Isso é - é claro - quando você
não se esqueça de regá-las
– elas murcham e morrem
As plantas não falam!
Ainda..
31. @plantaiot
Então vamos dar voz a esta nova
planta:
– Ela vai poder dizer o que está
sentindo
– Esta não vai morrer por falta
de água!
32. @plantaiot
Uma frase para cada nível de
água no solo:
– Sem água (Totalmente
seco)
– Mínimo (Nível crítico)
– Pouca Água (Nível baixo)
– Intermediário (Nível
suficiente)
– Cheio (Molhado – acabou
de ser regada)
37. Objetivo da @plantaiot
Muito fácil extrair
dados do mundo real e
transformar em
informações úteis que
podem ser usadas
diretamente para o
controle e automação
das coisas.
38. Planta IoT com Regador
Melhoranda a solução:
– Planta IoT
– Regador IoT
– Dados na Nuvem
– Histórico dos Eventos
– Autônomia
41. Plataforma IoT
Lugar centralizado com:
– Armazenamento de dados de
sensores
– Visualização de Dados
– Gerenciamento remoto
– Tecnologias de computação
em nuvem
– Envio/Recebimento de dados
através de API (Application
Program Interface)
– Armazenamento seguro
– Acessado de qualquer lugar
46. Código Planta IoT com Xively
...
// Xively key para upload e download de dados
char xivelyKey[] = "fNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0c";
// xively feed ID
#define xivelyFeed 899999994
// datastreams
char nivelAguaID[] = "nivel_agua";
char regadorID[] = "regador";
#define CHANNEL_NIVEL_AGUA 0
#define CHANNEL_REGADOR 1
...
47. Código Planta IoT com Xively
...
// Define o nome dos datastreams do feed
XivelyDatastream datastreams[] = {
XivelyDatastream(nivelAguaID, strlen(nivelAguaID),
DATASTREAM_INT),
XivelyDatastream(regadorID, strlen(regadorID),
DATASTREAM_INT),
};
// Liga os datastreams no feed
XivelyFeed feed(xivelyFeed, datastreams, 2 /* número de
datastreams */);
EthernetClient client;
XivelyClient xivelyclient(client);
...
48. Código Planta IoT com Xively
...
void loop() {
processaSensorNivelAgua();
processaRegador();
// delay de 15s entre chamadas
delay(15000);
}
...
49. Código Planta IoT com Xively
...
// le sensor da planta e salva na nuvem
void processaSensorNivelAgua() {
int valorSensorAgua = analogRead(sensorAguaPin);
int nivelAgua = map(valorSensorAgua, 0, 1023, 0, 4);
Serial.print("Nivel de Água [0..4]=");
Serial.println(nivelAgua);
// guarda o valor na nuvem
datastreams[CHANNEL_NIVEL_AGUA].setInt(nivelAgua);
// send value to xively
Serial.println("Nivel de Agua");
Serial.println("Uploading it to Xively");
int ret = xivelyclient.put(feed, xivelyKey);
// return message
Serial.print("xivelyclient.put returned ");
Serial.println(ret);
Serial.println("");
}
...
50. Código Planta IoT com Xively
...
// liga regador de acordo com o nivel de agua na
planta
void processaRegador() {
// otem dados do feed na nuvem
int getReturn = xivelyclient.get(feed, xivelyKey);
if(getReturn > 0){
Serial.print("Datastream Nivel de Agua: ");
Serial.println(feed[CHANNEL_NIVEL_AGUA]);
} else {
Serial.println("HTTP Error");
}
...
51. Código Planta IoT com Xively
...
// guarda o nivel da agua do feed obtido
int nivelAgua = feed[CHANNEL_NIVEL_AGUA].getInt();
// calcula quanto tempo o regado deve ficar ligado
int segundosRegadorDeveLigar = 0;
if (nivelAgua < NIVEL_SEM_AGUA) {
// liga regador por 5 segundo
segundosRegadorDeveLigar = 5;
} else if (nivelAgua < NIVEL_MINIMO_AGUA) {
// liga regador por 3 segundo
segundosRegadorDeveLigar = 3;
} else if (nivelAgua < NIVEL_POUCA_AGUA) {
// liga regador por 1 segundo
segundosRegadorDeveLigar = 1;
}
// liga ou desliga o regador de acordo com o nivel da agua
controlaRegador(segundosRegadorDeveLigar);
...
52. Código Planta IoT com Xively
...
// guarda o valor do regador a ser salvo na nuvem
datastreams[CHANNEL_REGADOR].setInt(segundosRegadorDeveLigar);
Serial.print("Datastream Regador: ");
Serial.println(feed[CHANNEL_REGADOR]);
// send value to xively
Serial.println("Regador");
Serial.println("Uploading it to Xively");
int ret = xivelyclient.put(feed, xivelyKey);
// return message
Serial.print("xivelyclient.put returned ");
Serial.println(ret);
Serial.println("");
...
55. Outras Plataformas
...
// this method makes a HTTP connection to the server:
void sendData(int thisData) {
// if there's a successful connection:
if (client.connect(server, 80)) {
Serial.println("connecting...");
// send the HTTP PUT request:
client.print("PUT /v2/feeds/");
client.print(FEEDID);
client.println(".csv HTTP/1.1");
client.println("Host: api.pachube.com");
client.print("X-PachubeApiKey: ");
client.println(APIKEY);
client.print("User-Agent: ");
client.println(USERAGENT);
client.print("Content-Length: ");
// calculate the length of the sensor reading in bytes:
// 8 bytes for "sensor1," + number of digits of the data:
int thisLength = 8 + getLength(thisData);
client.println(thisLength);
// last pieces of the HTTP PUT request:
client.println("Content-Type: text/csv");
client.println("Connection: close");
client.println();
// here's the actual content of the PUT request:
client.print("sensor1,");
client.println(thisData);
}
...
•
Outras Plataformas
podem ser utilizadas
com Arduino sem
Biblioteca Específica.
•
Deve-se montar a
requisição HTTP e
enviar através do
Ethernet Shield
59. Fim
Valorize suas ideias, mesmo que elas pareçam
simples e com fácil implementação. O que
importa é uma ideia legal, não quanto complexa
ela é.
Vamos tirar as idéias da cabeça e torná-las
realidade.
IoT já está aqui, é presente. Vamos aproveitar!