Projetos de Exemplo

Que tal alguns exemplos?

Nessa seção temos algo de bom. Diversos exemplos que tem por proposta mostrar as possibilidades de uso do Guardião Cloud. Todos os exemplos podem ser encontrados no GitHub.

Iremos explicar como montar e utilizar tais exemplos, inclusive não apenas exemplos com Arduino, mas também exemplos utilizando outras linguagens e plataformas. Nossos exemplos sempre serão atualizados, então nos acompanhe pelo GitHub ou pelo Facebook.

Caso queira, as libraries utilizadas nos projetos podem ser baixada, através do link: libraries

Exemplo com Arduino

Coleta de Dados do Arduino com Ethernet + DHT11

Sensor de Temperatura/umidade

Este exemplo é composto por um Arduino UNO, tendo um Shield Ethernet acoplado para se conectar a Internet e um sensor DHT11 para coletar as informações de temperatura e umidade do ambiente. Podemos aplicar este exemplo para acompanhar variações de temperatura e umidade, na intenção de gerar alertas em situações adversas.

#include <dht.h>
#include <SPI.h>
#include <Ethernet.h>

#define DHTPIN 7 //porta conectada ao DHT11
static char apiKey[] = "xxxxxxxx-yyyy-zzzz-wwww-kkkkkkkkkkkk";
static char serial[] = "IOTWBS0001";

dht DHT;
EthernetClient client;

signed long next;
unsigned long frequencyTime = 60000; //Tempo que será lido e enviado os valores(1 min.).
static byte mac[] = { 0xDE, 0xAD, 0x09, 0xEF, 0xFE, 0xED }; // Endereço MAC
static char serverName[] = "guardiao.cl";//NÃO ALTERE ESSE VALOR - URL do Guardião Cloud

void setup() {
Serial.begin(9600);
Ethernet.begin(mac); //IP Automático
next = 0;
}

void loop() {
if (((signed long)(millis() - next)) > 0)
{
  Serial.println(F("Coletando...")); 
  next = millis() + frequencyTime;
  char temp[6] PROGMEM;
  char hum[6] PROGMEM;
  int chk = DHT.read11(DHTPIN); //É possível utilizar outros sensores DHT, necessário mudar a chamada.
  if(chk == DHTLIB_OK){  
    dtostrf(DHT.temperature, 1, 2, temp);
    dtostrf(DHT.humidity, 1, 2, hum);
  }
  else{
    temp[0] = '0';
    hum[0] = '0';
  }
  char queryString[128];
  char outBuf[128];
  char host[64];

  if (client.connect(serverName, 80)) 
  {
    sprintf(queryString,"apiKey=%s&temperatura=%s&umidade=%s",apiKey, temp,hum);
    sprintf(outBuf,"GET /collect/%s/?%s HTTP/1.1",serial,queryString);
    client.println(outBuf);
    sprintf(host,"Host: %s",serverName);
    client.println(host);
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
    client.stop();
  }
  else
  {
    Serial.println(F("Falha de conexão"));
  } 
}

}

Para baixar esse código, acesse: guardiaocl-coleta

A lista de material para esse exemplo:

  • Arduino UNO ou compatível
  • Shield Ethernet - Chip Wiznet W5100
  • Sensor de Temperatura DHT11
  • Fios(Macho-Fêmea)

Para a conexão do DHT11 com o Arduino, e para o exemplo proposto, a ligação pode ser feita nos seguintes moldes:

Porta Ligação Arduino
S Digital 7
- GND
+ 5V

Coleta de Dados do Arduino com Ethernet + DHT11 + Display LCD 16x2

Arduino DHT11 DISPLAY

O diferencial desta montagem em relação ao anterior, é que acrescentamos um diplay de LCD 16x2 para exibir as informações para os usuários. Pode ser um detalhe que faz toda a diferença.

#include <dht.h>
#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define DHTPIN 7 //porta conectada ao DHT11
static char apiKey[] = "xxxxxxxx-yyyy-zzzz-wwww-kkkkkkkkkkkk"; //@todo Alterar para a API Key do Projeto.
static char serial[] = "IOTWBS0001"; //@todo Alterar para a Serial do Dispositivo.

dht DHT;
EthernetClient client;
LiquidCrystal_I2C lcd(0x27,16,2);

signed long next;
unsigned long frequencyTime = 60000; //Frequência do Tempo que será lido e enviado os valores(1 min.).
static byte mac[] = { 0xDE, 0xAD, 0x09, 0xEF, 0xFE, 0xED }; // Endereço MAC, mude caso tenha vários
static char serverName[] = "guardiao.cl"; //NÃO ALTERE ESSE VALOR
static byte termometru[8] = //icone para temperatura
{
  B00100,
  B01010,
  B01010,
  B01110,
  B01110,
  B11111,
  B11111,
  B01110
};

static byte picatura[8] = //icone de umidade
{
  B00100,
  B00100,
  B01010,
  B01010,
  B10001,
  B10001,
  B10001,
  B01110,
};

void setup() {
  lcd.init();
  lcd.clear();
  lcd.backlight(); 
  lcd.print(F("System Starting"));
  lcd.setCursor(0, 1);
  lcd.print(F("Guardiao Cloud"));
  lcd.createChar(1,termometru);
  lcd.createChar(2,picatura);

  Ethernet.begin(mac); //IP Automático
  next = 0;
}

void loop() {
  if (((signed long)(millis() - next)) > 0)
  {
    next = millis() + frequencyTime;
    char temp[6] PROGMEM;
    char hum[6] PROGMEM;
    float temperature = 0;
    float humidity = 0;
    int chk = DHT.read11(DHTPIN); //Leitura do Sensor DHT11
    if(chk == DHTLIB_OK){  
      temperature = DHT.temperature;
      humidity = DHT.humidity;
      dtostrf(temperature, 1, 2, temp);
      dtostrf(humidity, 1, 2, hum);
    }
    else{
      temp[0] = '0';
      hum[0] = '0';
    }
    char queryString[128];
    char outBuf[128];
    char host[64];

    lcd.clear();
    lcd.setCursor(0, 0);  
    lcd.print(F("Serie - "));
    lcd.print(serial);
    lcd.setCursor(1, 1);  
    lcd.write(1);
    lcd.setCursor(3, 1);
    lcd.print((float)temperature,0);
    lcd.setCursor(5, 1);
    lcd.print((char)223); //sinal de graus
    lcd.print(F("C"));

    lcd.setCursor(9, 1);
    lcd.write(2);
    lcd.setCursor(11, 1);
    lcd.print((float)humidity,0);
    lcd.print(F("%"));

    if (client.connect(serverName, 80)) 
    {
      sprintf(queryString,"apiKey=%s&temperatura=%s&umidade=%s",apiKey, temp,hum);
      sprintf(outBuf,"GET /collect/%s/?%s HTTP/1.1",serial,queryString);
      client.println(outBuf);
      sprintf(host,"Host: %s",serverName);
      client.println(host);
      client.println("User-Agent: arduino-ethernet");
      client.println("Connection: close");
      client.println();
      client.stop();
    }
    else
    {
      Serial.println(F("Falha de conexão"));
    } 
  }

}

Para baixar esse código, acesse: guardiaocl-coleta

A lista de material para esse exemplo:

  • Arduino UNO ou compatível
  • Shield Ethernet - Chip Wiznet W5100
  • Sensor de Temperatura DHT11
  • Fios(Macho-Fêmea)
  • Display I2C - LCD 16x2

Para a conexão do DHT11 com o Arduino, e para o exemplo proposto, a ligação pode ser feita nos seguintes moldes:

Porta Ligação Arduino
S Digital 7
- GND
+ 5V

E para conectar o Display 16x2, a ligação pode ser feita conforme esquema abaixo:

Porta Ligação Arduino
SDA Analógico 4
SCL Analógico 5
GND GND
VCC 5V

Coleta de Dados com DHT11 e envio através de MQTT

Sensor de Temperatura/umidade

Este exemplo é composto por um Arduino UNO, tendo um Shield Ethernet acoplado para se conectar a Internet, os dados são enviado através de MQTT, com a coleta de um sensor DHT11 para informações de temperatura e umidade do ambiente. Podemos aplicar este exemplo para acompanhar variações de temperatura e umidade, na intenção de gerar alertas em situações adversas.

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <dht.h>

#define DHT11_PIN 7

byte mac[]    = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
byte server[] = { 54,175,116,131 }; //IP referente ao guardiao.cl

void callback(char* topic, byte* payload, unsigned int length) {

}

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);
dht DHT;

float tempC = 0.0;
float humidity = 0.0;

String clientName = String("IOTWBS0001");
String topicName = String("IOTWBS/collect/IOTWBS0001"); //Prefixo do Projeto + Canal de Coleta + Serial do Dispositivo

void setup()
{
  Ethernet.begin(mac);
  Serial.begin(9600);
}

void loop()
{
  char clientStr[34];
  clientName.toCharArray(clientStr,34);
  char topicStr[26];
  topicName.toCharArray(topicStr,26);
  //Lendo dados do sensor
  DHT.read11(DHT11_PIN);
  humidity = (float)DHT.humidity;
  tempC = (float)DHT.temperature;

  if (!client.connected()) {
    client.connect(clientStr,"suporte@webonesystem.com.br","497aa991-d8e6-4bb6-ad17-f01a13648333");
  }
  if (client.connected() ) {
    String json = buildJson();
    char jsonStr[200];
    json.toCharArray(jsonStr,200);
    boolean pubresult = client.publish(topicStr,jsonStr);
    if (pubresult)
      Serial.println("successfully sent");
    else
      Serial.println("unsuccessfully sent");
  }
  delay(5000);
}

String buildJson() {
  String data = "{";
  data+="\n";
  data+= "\"data\": {";
  data+="\n";
  data+="\"temperatura\": ";
  data+=(int)tempC;
  data+= ",";
  data+="\n";
  data+="\"umidade\": ";
  data+=(int)humidity;
  data+="\n";
  data+="}";
  data+="\n";
  data+="}";
  return data;
}

Para baixar esse código, acesse: guardiaocl-coleta-mqtt

A lista de material para esse exemplo:

  • Arduino UNO ou compatível
  • Shield Ethernet - Chip Wiznet W5100
  • Sensor de Temperatura DHT11
  • Fios(Macho-Fêmea)

Para a conexão do DHT11 com o Arduino, e para o exemplo proposto, a ligação pode ser feita nos seguintes moldes:

Porta Ligação Arduino
S Digital 7
- GND
+ 5V

Exemplo com Python

Coleta de Dados com DHT11 + Leitura de Console (Python)

Existe uma outra montagem possível de ser feita, para as pessoas que não possuem o Shield Ethernet e querem ler os dados do sensor DHT11 para enviar para o Guardião Cloud. Conectando o Arduino, e escrevendo os dados de coleta no console, é possível utilizar o Python para ler o console e enviar tais informações.

Para baixar esse código, acesse: python-serialport-guardiao

A lista de material para esse exemplo:

  • Arduino UNO ou compatível
  • Sensor de Temperatura DHT11
  • Fios(Macho-Fêmea)

Para a conexão do DHT11 com o Arduino, e para o exemplo proposto, a ligação pode ser feita nos seguintes moldes:

Porta Ligação Arduino
S Digital 7
- GND
+ 5V

No linux para facilitar o processo rode os comandos de instalação do pip e pyserial.

#Instalação de códigos.
sudo apt-get install python-pip
sudo pip install pyserial

Para o Arduino, é necessário apenas colocar o sistema para escrever no console, em um padrão que o Python possa converter e enviar os dados.

//Código Arduino
#include <dht.h>
dht DHT;
#define DHT11_PIN 7

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int chk = DHT.read11(DHT11_PIN);
  Serial.print(DHT.humidity);
  Serial.print("|");
  Serial.println(DHT.temperature);
  delay(60000);
}

Crie um script Python (coleta.py), utilize o código ao lado e em seguida execute com python coleta.py:

#Código Python
import serial
import urllib2
__author__ = 'Guardiao Cloud'

apiKey = "xxxxxxxx-yyyy-zzzz-wwww-kkkkkkkkkkkk" #@todo Alterar Numero da API Key
serialKey = "IOTWBS0001" #@todo Alterar numero de serie do dispositivo de Coleta
serialPort = '/dev/ttyS0' #@todo Alterar caminho da porta Serial do Arduino

if __name__ == '__main__':
    ser = serial.Serial(serialPort, 9600)
    while True:
        arduinoRead = ser.readline()
        arduinoRead = arduinoRead.replace('\n','').replace('\r','')
        listaVal = arduinoRead.split("|")
        param = "apiKey={0}&umidade={1}&temperatura={2}".format(apiKey,listaVal[0],listaVal[1])
        url = "http://guardiao.cl/collect/{0}/?{1}".format(serialKey,param)
        print urllib2.urlopen(url).read()

Coletando dados com SNMP GET

Com o intuito de mostrar que o Guardião Cloud, permite receber dados de qualquer formato e origem, iremos mostrar alguns exemplos de como podemos utilizar o SNMP (Simple Network Management Protocol), para realizar a coleta de dados.

No exemplo abaixo, monitoramos o LA (Load Average) de uma máquina Linux, a qual será enviado para acompanhamento. Podemos, por exemplo, com tal informação ver a utilização de uma máquina e gerar alerta antes que a máquina venha a ocasionar travamento.

Para baixar esse código, acesse: python-snmpget-guardiao

#Instalação de códigos.
sudo apt-get install python-pip
sudo pip install pysnmp pysnmp-mibs
#Código Python
import urllib2,time
from pysnmp.entity.rfc3413.oneliner import cmdgen

__author__ = 'Guardiao Cloud'

apiKey = "xxxxxxxx-yyyy-zzzz-wwww-kkkkkkkkkkkk" #@todo Alterar Numero da API Key
serialKey = "IOTWBS0001" #@todo Alterar numero de serie do dispositivo de Coleta
checkedTime = 60  #Tempo em segundos de coleta e envio das informacoes

snmpPort = 161 #@todo Alterar porta do SNMP
snmpIP = '127.0.0.1' #@todo Alterar IP da maquina com SNMP
snmpCommunity = 'public' #@todo Alterar comunidade padrao SNMP

#Mapa contendo o oid=nomeEnvio
mapaGuardiao = {}
mapaGuardiao['.1.3.6.1.4.1.2021.10.1.3.1'] = 'load1min'  #Chave 1
mapaGuardiao['.1.3.6.1.4.1.2021.10.1.3.2'] = 'load5min'  #Chave 2
mapaGuardiao['.1.3.6.1.4.1.2021.10.1.3.3'] = 'load15min'  #Chave 3

if __name__ == '__main__':
    while True:
        cmdGen = cmdgen.CommandGenerator()
        errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
            cmdgen.CommunityData(snmpCommunity, mpModel=0),
            cmdgen.UdpTransportTarget((snmpIP, snmpPort)),
            cmdgen.MibVariable('.1.3.6.1.4.1.2021.10.1.3.1'),  #Mesmo valor da Chave 1
            cmdgen.MibVariable('.1.3.6.1.4.1.2021.10.1.3.2'),  #Mesmo valor da Chave 2
            cmdgen.MibVariable('.1.3.6.1.4.1.2021.10.1.3.3'),  #Mesmo valor da Chave 3

        )

        if errorIndication:
            print(errorIndication)
        else:
            if errorStatus:
                print('%s at %s' % (
                    errorStatus.prettyPrint(),
                    errorIndex and varBinds[int(errorIndex)-1] or '?'
                    )
                )
            else:
                valorEnvio = ""
                for name, val in varBinds:
                    chave = mapaGuardiao["."+name.prettyPrint()] #Fazendo um parse baseado na chave para geração da URL
                    valor = val.prettyPrint()
                    valorEnvio += "{0}={1}&".format(chave,int(valor))
                url = "http://guardiao.cl/collect/{0}/?{1}apiKey={2}".format(serialKey,valorEnvio,apiKey)
                print urllib2.urlopen(url).read()
        time.sleep(checkedTime)

No linux para facilitar o processo rode os comandos de instalação do pip e pysnmp pysnmp-mibs.

Crie um script Python (coleta.py), utilize o código ao lado e em seguida execute com python coleta.py.

Coletando dados com SNMP WALK

O exemplo abaixo mostra de que maneira utilizar o SNMP Walk, para obter tráfego das interfaces de rede de uma determinada máquina. O sistema irá realizar uma primeira coleta, e após um tempo X, realizar um segundo coleta, para pegar a quantidade de tráfego.

Para baixar esse código, acesse: python-snmpwalk-guardiao

#Instalação de códigos.
sudo apt-get install python-pip
sudo pip install pysnmp pysnmp-mibs
#Código Python
import urllib2,time
from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.smi import builder, view

__author__ = 'Guardiao Cloud'

mibBuilder = builder.MibBuilder().loadModules('IP-MIB')
mibView = view.MibViewController(mibBuilder)

apiKey = "xxxxxxxx-yyyy-zzzz-wwww-kkkkkkkkkkkk" #@todo Alterar Numero da API Key
serialKey = "IOTWBS0001" #@todo Alterar numero de serie do dispositivo de Coleta
checkedTime = 5

snmpPort = 161 #@todo Alterar porta do SNMP
snmpIP = '127.0.0.1' #@todo Alterar IP da maquina com SNMP
snmpCommunity = 'public' #@todo Alterar comunidade padrao SNMP
snmpInterface = 'eth0' #@todo Alterar interface de Rede que se deseje monitorar

lastValueIn = 0
lastValueOut = 0
valorRef = False
tempoIncial = time.time()

if __name__ == '__main__':
    while True:
        cmdGen = cmdgen.CommandGenerator()
        errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(
            cmdgen.CommunityData(snmpCommunity, mpModel=0),
            cmdgen.UdpTransportTarget((snmpIP, snmpPort)),
            cmdgen.MibVariable('IF-MIB', 'ifDescr'),
            cmdgen.MibVariable('IF-MIB', 'ifInOctets'),
            cmdgen.MibVariable('IF-MIB', 'ifOutOctets'),
        )

        if errorIndication:
            print(errorIndication)
        else:
            if errorStatus:
                print('%s at %s' % (
                    errorStatus.prettyPrint(),
                    errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
                    )
                )
            else:
                for varBindTableRow in varBindTable:
                    controle = False
                    consumoIn = 0
                    consumoOut = 0
                    for oid, val in varBindTableRow:
                        if val.prettyPrint() == snmpInterface and controle == False :
                            controle = True
                        if controle:
                            oid, label, suffix = mibView.getNodeName(oid)
                            oidLabel = label[len(label)-1]
                            if(oidLabel == 'ifInOctets'):
                                actualInVal = float(val.prettyPrint())
                                consumoIn = (((lastValueIn - actualInVal) * 8)/(tempoIncial - time.time()))/1024
                                lastValueIn = float(val.prettyPrint())
                            if(oidLabel == 'ifOutOctets'):
                                actualOutVal = float(val.prettyPrint())
                                consumoOut = (((lastValueOut - actualOutVal) * 8)/(tempoIncial - time.time()))/1024
                                lastValueOut = float(val.prettyPrint())
                if valorRef == True :
                    valorEnvio = "bandwidthEntrada={0}&bandwidthSaida={1}".format(int(round(consumoIn)),int(round(consumoOut)))
                    url = "http://guardiao.cl/collect/{0}/?apiKey={1}&{2}".format(serialKey,apiKey,valorEnvio)
                    print urllib2.urlopen(url).read()
                valorRef = True
        time.sleep(checkedTime)
        tempoIncial = time.time()

No linux para facilitar o processo rode os comandos de instalação do pip e pysnmp pysnmp-mibs.

Crie um script Python (coleta.py), utilize o código ao lado e em seguida execute com python coleta.py.