domingo, 19 de fevereiro de 2017

Iniciando com o NodeMCU ESP-12E



Agora pessoal, vamos experimentar a plaquinha NodeMCU ESP-12E, que no meu conceito me surpreendeu muito pelo seu tamanho e versatilidade. Permitindo conectar dispositivos eletrônicos com grande facilidade utilizados no dia-a-dia à internet. 
Poder fazer o acompanhamento remoto  de um dispositivo cada vez mais esta se tornando muito mais simplificado em função de inúmeras aplicações voltadas para esse fim.
Para saber mais sobre este conceito, internet das coisas, IoT.
No nosso caso, vamos utilizar um site específico o ThingSpeak, para capturar os dados dos nossos sensores e gerar gráficos analíticos. Isto pode ser bem útil se desejar fazer um estudo mais detalhado das informações.




Conhecendo a Placa



Fonte da imagem: https://forum.makehackvoid.com/uploads/default/178/df994028721a8bdf.png



Configuração da IDE do Arduino para Utilizar o 

NodeMCU


Uma das formas de conseguir programar o Node MCU é utilizando a IDE do Arduino. Para isso vamos serguir alguns passos:

1. Abra a sua IDE do Arduino, de preferência atualizada para a versão mais recente, e clique em Arquivo>Preferências:



 
2. Na tela que abrir cole esta url http://arduino.esp8266.com/stable/package_esp8266com_index.json no campo Urls Adicionais para Gerenciadores de Placas. Isto é necessário para que apareça o modulo da placa para instalação, em Gerenciador de Placas.

3. Agora acesse o Menu Ferramentas e clique em Gerenciador de Placas. Abrirá uma caixa com várias placas para instalar, role a barra até chegar ao final e selecione esp8266 by ESP8266 Community e clique no botão instalar. Na minha IDE como já instalei, aparece como instalado.



curso arduino essencial

 
4. Agora Acesse o Menu Ferramentas>Placas e escolha NodeMCU 0.9(ESP-12 Module)


Para iniciar nos testes com NodeMCU, vamos usar o DHT 11, já connhecido nosso dos outros posts, sensor de temperatura e umidade.
Lembrando que para utilizá-lo é importante ter a bilbioteca instalada em seu computador. Se ainda não tem baixe: libraries
Salve todas as pastas de libraries em seu computador em Arduino>libraries
Ela contém todas as biliotecas dos posts dos projetos do blog.

Montagem


  

Testando a Montagem – Monitor Serial

 



Configurando a Aplicação no ThingSpeak



Após realizada as confiurações na IDE do Arduino, realizados os testes no Monitor Serial, vamos configurar nossa aplicação no ThingSpeak.
Vamos acessar ThingSpeak





Para usar o ThingSpeak para exibir os dados, é necessário realizar um cadastro de forma gratuita no site para poder usufruir desta excelente ferramenta. Será enviado um e-mail do ThingSpeak pedindo para confirmar o seu cadastro. Faça a sua confirmação.
Agora faça o seu login:



  Criação do canal para a nossa aplicação

 


Para exibir as informações é necessário também criar um "Canal" . Nele será configurado os campos que desejar ser exibido.
Agora para finalizar, se desejar, poderá deixar o seu canal público, marcando a opção “Make Public”, só copiar a sua Url para mais tarde se desejar, compartilhar com outras pessoas.
Marque a opção “Show Status” e clique no botão “Save Channel”.




  
Após criado o seu canal, um passo importante é pegal o seu “apiKey”, clicando em API Keys.
Em “Write API Key”, copie a chave formada por números e caracteres:







Esta “chave ” é responsável por abrir o seu canal para realizar a comunicação com seu NodeMCU e “escrever” os dados no ThingSpeak. Cada canal que você criar irá gerar uma nova APIKey, e deverá ser setada no código fonte que for compilar em seu NodeMCU:

 
curso arduino essencial

Dados Exibidos no ThingSpeak










//www.arduinesp.com
//
// Plot DTH11 data on thingspeak.com using an ESP8266
// April 11 2015
// Author: Jeroen Beemster
// Website: www.arduinesp.com

#include <DHT.h>
#include <ESP8266WiFi.h>

// replace with your channel’s thingspeak API key,
String apiKey = "Copie o Write API Key";
const char* ssid = "Nome da sua rede";
const char* password = "senha";

const char* server = "api.thingspeak.com";
#define DHTPIN 2 // SO CONNECT THE DHT11/22 SENSOR TO PIN D4 OF THE NODEMCU

DHT dht(DHTPIN, DHT11,15); //CHANGE DHT11 TO DHT22 IF YOU ARE USING DHT22
WiFiClient client;

void setup() {
Serial.begin(115200);
delay(10);
dht.begin();

WiFi.begin(ssid, password);

Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.begin(ssid, password);

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

}

void loop() {

float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}

if (client.connect(server,80)) { // "184.106.153.149" or api.thingspeak.com
String postStr = apiKey;
postStr +="&field1=";
postStr += String(t);
postStr +="&field2=";
postStr += String(h);
postStr += "\r\n\r\n";

client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);

Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" degrees Celcius Humidity: ");
Serial.print(h);
Serial.println("% send to Thingspeak");
}
client.stop();

Serial.println("Waiting…");
// thingspeak needs minimum 15 sec delay between updates
delay(20000);
}

Referências:


 



domingo, 12 de fevereiro de 2017

Acelerômetro e Giroscópio - Módulo GY-521


Este pequeno Modulo da figura acima é o GY-521, usado como acelerômetro e giroscópio e sensor de temperatura. Utiliza o CI MPU-6050 do fabricante InvenSense. 

O CI MPU-6050 possui uma excelente precisão ao fazer as medições, utilizando a tecnologia MEMS. O que mais impressiona neste Módulo e que o algoritmo de  detecçao de movimento é processado dentro do próprio CI, graças ao recurso DMP (Digital Motion Processor).

Para mais informações, sugiro que visitem o excelente site especialidado em embarcados, o embarcados.com.br . Este site foi minha referência de estudo para este modulo.

Para montagem vamos utilizar a mesma interface do WebestufaServer, e estou imprementando o código do módulo GY-521.

Os pinos que iremos utilizar do Modulo GY-521 será:

  • VCC : ligar ao 5V do Ethernet Shield;
  • GND: ligar ao GND do Ethernet Shield;
  • SDA: ligar ao SDA do Arduino Mega;
  • SCL: ligar ao SCL do Arduino Mega.


Montagem Eletrônica

 


 



Aplicação em Funcionamento

Para acessar a página da aplicação digitei no navegador : http://192.168.0.99 .Lembrando que este endereço poderá ser alterado no código e usado de acordo com a classe de ip da rede em que desejar utilizar.



 

 

 

 

Código Fonte




Código Fonte: WebestufaServer_GY-521

//Programa : Arduino Ethernet Shield W5100 e GY-521 (MPU-6050)
//Código Fonte de Referência: https://www.embarcados.com.br/arduino-acelerometro-giroscopio/
//Adaptação: Marcelo | Webestufa


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


//Endereco I2C do MPU6050
const int MPU=0x68;  //pino aberto 0X68 , pino ligado em 3,3V 0x69

//Variaveis globais
int acelX,acelY,acelZ,temperatura,giroX,giroY,giroZ;


//Definicoes de IP, mascara de rede e gateway
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,99);          //Define o endereco IP
IPAddress gateway(192,168,0,1);      //Define o gateway
IPAddress subnet(255, 255, 255, 0); //Define a máscara de rede
//Inicializa o servidor web na porta 80
EthernetServer server(80);


void setup() {

  Serial.begin(9600); //inicia a comunicação serial
  Wire.begin();                 //inicia I2C
  Wire.beginTransmission(MPU);  //Inicia transmissão para o endereço do MPU
  Wire.write(0x6B);            
  
  //Inicializa o MPU-6050
  Wire.write(0);
  Wire.endTransmission(true);
 
  //Inicializa a interface de rede
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();

 
}


  void loop() {

  Wire.beginTransmission(MPU);      //transmite
  Wire.write(0x3B);                 // Endereço 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);     //Finaliza transmissão
 
  Wire.requestFrom(MPU,14,true);   //requisita bytes
  
  //Armazena o valor dos sensores nas variaveis correspondentes
  acelX=Wire.read()<<8|Wire.read();  //0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
  acelY=Wire.read()<<8|Wire.read();  //0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  acelZ=Wire.read()<<8|Wire.read();  //0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  temperatura=Wire.read()<<8|Wire.read();  //0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  giroX=Wire.read()<<8|Wire.read();  //0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  giroY=Wire.read()<<8|Wire.read();  //0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  giroZ=Wire.read()<<8|Wire.read();  //0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
 
   
  //Aguarda conexao do browser 
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == 'n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 2"); //Recarrega a pagina a cada 2seg
          client.println();
          client.println("<!DOCTYPE HTML>");
          //INICIO DO CODIGO HTML

          client.println("<HTML>");
          client.println("<head><Webestufa</title></head>");
          client.println("<BODY>");
          client.println("<br><br><center><a href=\"http://www.webestufa.com.br\"> <img align=center width=350px heigh=150px  src=https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8coZfJlBHW0gqH_yc0ss45IlGAG41hvP57galtye4SG_MSWDNQdgeprZFXuN_kgd49rVAtEPhfupoEhTZmToqobXXExOU1WKJyTvoOqkr7oj-Z-iEYz7uCFTUxdjqIGgsI8xzFjyj1yw/s128/logowebestufa.gif></center></br></br>");
          client.println("<H1><center>Arduino + Ethernet Shield W5100 + Acelerometro e Giroscopio</center></H1>");
          client.println("<br />");
          client.println("<br />");
          client.println("<h2><center>");
         
          //Valores lidos do Acelerômetro
          client.print("<br><br><center>Acelerometro :");
          client.print("   X: ");client.print(acelX);
          client.print("\tY: ");client.print(acelY);
          client.print("\tZ: ");client.print(acelZ);
          client.println("<br />");
          client.println("<br />");
                  
          //Envia valores lidos do giroscópio
          client.print("\tGiroscopio:");
          client.print("  X:");client.print(giroX);
          client.print("\tY:");client.print(giroY);
          client.print("\tZ:");client.print(giroZ);

             
          //Temperatura em graus Celsius
          client.print("\tTemperatura: ");client.println(temperatura/340.00+36.53);client.print("*C");
                 
          //Aguarda 500 ms
          delay(500);
         
          client.println("</center></h2>");
          client.println("<br>");

          break;
        }
        if (c == 'n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != 'r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();

   
    }
}


Referência

Embarcados: https://www.embarcados.com.br/arduino-acelerometro-giroscopio/

sexta-feira, 10 de fevereiro de 2017

Webestufa Server - Sensor HC-SR04



Um outro sensor muito interessante para várias aplicações é o sensor HC-SR04 o conhecido sensor ultrassônico. O seu trabalho é fazer medições com boa precisão e detectar objetos e obstáculos. Muito usado em robôs desviadores de obstáculos, permitindo aos robôs fazerem a medição dos objetos e tomar a decisão de desviar, claro que tal função deve ser programada para esta rotina.

Pensando numa aplicação para este sensor nas nossas aplicações voltadas para horta e/ou estufas agrícolas, ele poderá ser usado para detectar obstáculos no caminho de nossos vasos de plantas por exemplo. Caso ocorra a passagem de algum objeto entre os vasos a aplicação web irá exibir uma variação na medição.
Para fazer o tratamento do sensor HC-SR04, usei o código exemplo do Blog FILIPEFLOP.
O que eu fiz foi implementar o sensor DHT11, para ver os dois funcionando na aplicação.

Funcionamento

 

Fonte da imagem: blog.vidadesilicio.com.br

Na imagem acima do excelente blog blog.vidadesilicio , podemos observar o funcionamento do sensor, que basicamente opera da seguinte forma:

pino VCC: pino de alimentação de 5v;

pino TRIG : O sensor recebe do microcontrolador um pulso de 5v e envia 8 ciclos de sinal ultrassônico a 40KHZ, esse sinal é refletido atingindo o objeto;

pino ECHO: É o pino que recebe o sinal refretido do objeto, permitindo fazer a medida da distância do objeto, em função do tempo que tal sinal demora para ser recebido. 

pino GND: pino que é ligado o negativo do sensor.

Para a sugestão de montagem foi usado:

Sensor HC-SR04


Arduino Mega2560


Ethernet Shield W5100

 


Sensor DHT11



Protoboard





Wire



 

  Montagem na Protoboard

 

 

 Esquema de Montagem Eletrônica

Lembrando que se for utilizar o Arduino Mega 2560 com o Ethernet Shield W5100, se atente para o jumpeamento dos pinos:

W5100                      Mega 2560
pino                           pino
11----------------------------->51
12----------------------------->50
13----------------------------->52


Acessando a Página da Aplicação 

Para acessar a página da aplicação digitei no navegador : http://192.168.0.99
Lembrando que este endereço poderá ser alterado no código e usado de acordo com a classe de ip da rede em que desejar utilizar.

 

Aplicação em Funcionamento

 

 

Código da Aplicação 

 



Biblioteca do Sensor HC-SR04  Ultrasonic
Salve a biblioteca Ultrasonic na pasta Arduino/libraries
  
Código Fonte:  WebestufaServer_Ultrasonic


//Programa : Arduino Ethernet Shield W5100 e HC-SR04
//Código Fonte : FILIPEFLOP http://blog.filipeflop.com/arduino/tutorial-ethernet-shield-w5100.html
//Adaptação para uso com o Sensor DHT11: Marcelo | Webestufa
//Baseado no programa exemplo de David A. Mellis e Tom Igoe

#include <Ultrasonic.h>
#include <SPI.h>
#include <Ethernet.h>
#include <DHT.h>


//Define os parametros para o sensor ultrasonico HC-SR04
#define PINO_TRIGGER  6 //Porta ligada ao pino Trigger do sensor
#define PINO_ECHO     7 //Porta ligada ao pino Echo do sensor
//Inicializa o sensor ultrasonico
Ultrasonic ultrasonic(PINO_TRIGGER, PINO_ECHO);


//Definição dos Parametros para o Sensor DHT11
#define DHTPIN A0 // pino que estamos conectado
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);


//Definicoes de IP, mascara de rede e gateway
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,99);          //Define o endereco IP
IPAddress gateway(192,168,0,1);      //Define o gateway
IPAddress subnet(255, 255, 255, 0); //Define a máscara de rede
//Inicializa o servidor web na porta 80
EthernetServer server(80);


void setup()
{
  //Inicializa a interface de rede
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();

  dht.begin();

}


  void loop() {
 
  float cmMsec;
  long microsec = ultrasonic.timing();
  //Le e armazena as informacoes do sensor ultrasonico
  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
 
      int h = dht.readHumidity(); // Variável para receber a umidade
      int t = dht.readTemperature();// Variável para receber a temperatura
 
  //Aguarda conexao do browser 
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == 'n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 2"); //Recarrega a pagina a cada 2seg
          client.println();
          client.println("<!DOCTYPE HTML>");
          //INICIO DO CODIGO HTML

          client.println("<HTML>");
          client.println("<head><Webestufa</title></head>");
          client.println("<BODY>");
          client.println("<br><br><center><a href=\"http://www.webestufa.com.br\"> <img align=center width=350px heigh=150px  src=https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8coZfJlBHW0gqH_yc0ss45IlGAG41hvP57galtye4SG_MSWDNQdgeprZFXuN_kgd49rVAtEPhfupoEhTZmToqobXXExOU1WKJyTvoOqkr7oj-Z-iEYz7uCFTUxdjqIGgsI8xzFjyj1yw/s128/logowebestufa.gif></center></br></br>");
          client.println("<H1><center>Arduino + Ethernet Shield + DHT11 + Sensor Ultrassonico HC-SR04</center></H1>");
          client.println("<br />");
          client.println("<br />");
          //Mostra o estado da porta digital 3
          client.println("<h2><center>");
          int porta_digital = digitalRead(3);
          //Mostra as informacoes lidas pelo sensor ultrasonico
          client.print("<br><br><center>Sensor Ultrasonico :");
          client.print(cmMsec);
          client.print(" cm");
          client.println("</center></h2>");
          client.println("<br>");
          client.println("<h2><center>");
          client.println("Temperatura:");
          client.println(t);
          client.println(" *C");
          client.println(" - ");
          client.println("Umidade:");
          client.println(h);
          client.println("%");
          client.println("</center></h2>");
          client.println("<br>");

          break;
        }
        if (c == 'n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != 'r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();

   
    }
}