Construa seu primeiro device IoT

Roberto Barros

IoT = Internet of Things

...é que uma rede de objetos físicos capaz de coletar e transmitir dados. É uma extensão da internet atual que possibilita que objetos do dia-a-dia se conectem à Internet.

Para isso vamos precisar de um microcontrolador

Arduino

Problema: não se conecta à internet

Vantagem: Possui ótimas ferramentas de desenvolvimento

ESP8266 (nodemcu)

Pode ser usado com a IDE do arduino:

Outras Opções

ESP32

Wifi + Bluetooth

ESP01

Compacto

Nosso primeiro Software

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Blink Led

void setup() {
  pinMode(D4, OUTPUT);
}


void loop() {
  digitalWrite(D4, LOW);

  delay(1000);

  digitalWrite(D4, HIGH);

  delay(2000);
}

E se quisermos controlar uma carga maior?

Blink Lamp

void setup() {
  pinMode(D0, OUTPUT);
}


void loop() {
  digitalWrite(D0, LOW);

  delay(1000);

  digitalWrite(D0, HIGH);

  delay(2000);
}

Vamos conectar na internet

#include <ESP8266WiFi.h>

const char* SSID = "Nome da Rede";
const char* PASSWORD = "Senha da Rede";


void initWiFi() {
  Serial.println("Conectando-se em: " + String(SSID));

  WiFi.begin(SSID, PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }


  Serial.println("");
  Serial.println("WiFi conectado");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

}

void setup() {
  Serial.begin(115200);

  initWiFi();  
}


void loop() {

}

MQTT

Message Queuing Telemetry Transport é um protocolo de mensagens leve para sensores e pequenos dispositivos móveis otimizado para redes TCP/IP não confiáveis ou de alta latência. O esquema de troca de mensagens é fundamentado no modelo Publicador-Subscritor.

MQTT Brokers

Configurando o MQTT

Setup do PubSub

#include <PubSubClient.h>

const char* BROKER_MQTT = "iot.eclipse.org";
int BROKER_PORT = 1883;
const char* TOPIC = "lewagon-iot-lamp";

WiFiClient espClient;
PubSubClient MQTT(espClient);

void initMQTT() {
  MQTT.setServer(BROKER_MQTT, BROKER_PORT);
}

void setup() {
  initMQTT();
}

Conectando o Broker

void connectMQTT() {
  while (!MQTT.connected()) {
    Serial.println("Tentando se conectar ao Broker MQTT: " + String(BROKER_MQTT));
    if (MQTT.connect("clientId-lewagon-iot-lamp")) {
      Serial.println("Conectado");
      MQTT.subscribe(TOPIC);

    } else {
      Serial.println("Falha ao Conectar. Tentando novamente em 2 segundos");
      delay(2000);
    }
  }
}

void loop() {
  if (!MQTT.connected()) {
    connectMQTT();
  }
  MQTT.loop();
}

Callback

void initMQTT() {
  MQTT.setServer(BROKER_MQTT, BROKER_PORT);
  MQTT.setCallback(mqtt_callback);
}

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

  String message;
  for (int i = 0; i < length; i++) {
    char c = (char)payload[i];
    message += c;
  }
  Serial.println("Tópico => " + String(topic) + " | Valor => " + String(message));
  Serial.flush();

}

Ligando tudo!

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

  String message;
  for (int i = 0; i < length; i++) {
    char c = (char)payload[i];
    message += c;
  }
  Serial.println("Tópico => " + String(topic) + " | Valor => " + String(message));
  Serial.flush();

  if (message == "on") {
    digitalWrite(D0, HIGH);
  } else {
    digitalWrite(D0, LOW);
  }

}


void setup() {
 pinMode(D0, OUTPUT);
}

Websocket

É uma tecnologia que permite a comunicação bidirecional. Websocket foi desenvolvido para ser implementado em browsers web e servidores web, mas pode ser usado por qualquer cliente ou aplicação servidor.

Client Web

<html>
<head>
  <title>Client MQTT Web</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.1.0/paho-mqtt.min.js">
  </script>
</head>
<body>

  <button id='on'>Ligar</button>
  <button id='off'>Desligar</button>

</body>
</html>

Eclipse Paho JavaScript client:

https://github.com/eclipse/paho.mqtt.javascript

Setup do Broker

  <script>
    var wsbroker = "iot.eclipse.org";
    var wsport = 443;
    var randomId = parseInt(Math.random() * 100, 10)
    var client = new Paho.Client(wsbroker, wsport, "myclientid_" + randomId);

  </script>
 

Conectando com o broker

  <script>

    client.connect({onSuccess:onConnect , useSSL: true});

    function onConnect() {
      client.subscribe("lewagon-iot-lamp");
      console.log("Conectado");
    }

  </script>

Se o broker desconectar

  <script>

    client.onConnectionLost = onConnectionLost;

    function onConnectionLost(responseObject) {
      if (responseObject.errorCode !== 0) {
        console.log("onConnectionLost:"+responseObject.errorMessage);
      }
    }

  </script>

Quando um botão é clicado a mensagem é enviada

  <script>

    function sendMessage(message) {
      return function() {
        mqtt_message = new Paho.Message(message);
        mqtt_message.destinationName = "lewagon-iot-lamp";
        client.send(mqtt_message);
      }
    }

    document.getElementById('on').addEventListener('click', sendMessage('on'));
    document.getElementById('off').addEventListener('click', sendMessage('off'));


  </script>

Recebendo a mensagem

  <script>

    client.onMessageArrived = onMessageArrived;

    function onMessageArrived(message) {
      console.log("onMessageArrived:"+message.payloadString);
    }


  </script>

Código completo

Obrigado!

Roberto Barros

roberto@scandix.com

Construa seu primeiro device IoT

By Roberto Barros

Construa seu primeiro device IoT

Construa seu primeiro device IoT - Workshop LeWagon

  • 767