Pesquisar

AFSmartRadio Tranceiver 915Mhz Lora

AFSmartRadio Tranceiver 915Mhz Lora Módulo AFsmart Lora V1.0 montado Arduino Pro-Mini e Rádio Rf4463PRO A Internet das coisas (...

Programando Módulo AFSmart ESp8266 ESP12F

O módulo AFSmart ESP12F pode ser programado como um Arduino clássico, mas sua principal característica é a sua conexão Wi-Fi, o que lhe permite publicar dados para um servidor ou um painel on-line.
Módulo AFSmart ESP8266 esp12F - AFS001705


Ou criar facilmente objetos conectados, que pode ser controlado a partir de um servidor de automação residencial/Industrial ou de um aplicativo móvel (desenvolvido com Blynk ou Cayenne, por exemplo). Nesta matéria, iremos aprender como programar o ESP8266 para se comportar como um servidor Web . Ou seja, podemos interagir com o programa, o GPIO ... a partir de uma interface web acessível a partir de um navegador da Web.

Iremos usar como base nossa primeira aplicação implementando o controle utilizando do protocolo Wiegand-26 - Neste novo caso, iremos realizar o controle do Rele2 do módulo ESP8266 AFSmart , bem como mostrar no web-browser a temperatura de um sensor de temperatura, e o código lido pelo usuário no leitor de cartões.

Caso ainda não tenha instalado em sua IDE as placas ESP8266 - siga o exemplo abaixo, Seção1, caso já possua instalado, basta ir para Seção2.

Seção1


Instale as bibliotecas e placas ESP8266 na Arduino IDE

Antes de iniciar, é necessário verificar se todas as bibliotecas necessárias estão instaladas.  http://arduino.esp8266.com/stable/package_esp8266com_index.json


    No gerenciador de placas procure por esp8266 , então clique em instalar.


   Após instalar, feche sua IDE e abra novamente de forma a reinicar e carregar as placas instaladas.

Seção2

Na sua IDE Arduino escolha a Placa conforme imagem abaixo


Para a Porta COM verifique qual foi porta atribuída pelo Windows, caso não saiba, basta ir em Gerenciador de Dispositivos e verificar.


Para esta aplicação será utilizado o módulo AFSmart AF12F  desenvolvido pela AFEletronica, pode ser adquirido Clicando no link.

Qual a vantagem? 

Se trata de um produto de tamanho reduzido já com entrada para sensor de temperatura DS18B20, entrada para sensores Infra Vermelho Tx e Rx, o módulo possui versão para alimentação AC ou DC onde se conecta diretamente na rede AC 127/220V ou a versão DC onde possui as versões 9V/12V.

Possui ainda dois reles para uso geral. Conversor de nível nas IO´s IO0 e IO4, onde pode ser implementado comunicação I2c, Serial, quando a linha de dados do periférico externo possui tensão superior à 3V3.

Neste caso iremos utilizar este conversor para comunicar com um leitor de cartão Wiegand-26, onde será conectado ao barramento Data0 e Data1 do Wiegand-26 do leitor de cartões, onde sua tensão é de 5Vdc.

Não bastasse os pinos não utilizados internamente ao módulo, foi disponibilizado em um barramento lateral para uso Geral.


ESP12F

A aplicação deste projeto irá apresentar as seguintes características

Mostrar no Browser a temperatura lida pelo sensor DS18B20

Controle do Rele1 via leitor de Cartão Wiegand-26, será dado um pulso de 3s após a leitura do cartão, será realizado a leitura de dois cartões ou dois usuários, o código deste cartão será apresentado no browser informando se o mesmo é do usuário 1 ou usuário 2.

Será realizado o controle do Rele2 do módulo via browser.



Portanto para implementação será necessário:
01 - Sensor de temperatura DS18B20 conectado/soldado ao módulo
01 Leitor de Cartão Wiegand-26
01 Conversor USB-Serial para envio da aplicação ao módulo

O código:



#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <Wiegand.h>
#include <OneWire.h>

#define ssid      "SSID"       // WiFi SSID
#define password  "password"  // WiFi password
#define Rele2      16          // Led
#define Rele1       14

byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;

float   t = 0 ;
float   h = 0 ;
float   p = 0;
long code = 0 ;
int user = 0;
String  etatLed = "OFF";

#define FALSE 0      
#define TRUE  1 
const int rele1 = 14;

long Usuario1 = 0x97F8A5; // código cartao MiFire
long Usuario2 = 0x5C2FE5; // código cartao MiFire

WIEGAND wg;

OneWire  ds(2);  // pino que esta ligado o Sensor de Temperatura

ESP8266WebServer server ( 80 );

String getPage(){

               String page = "<html lang=pt-BR><head><meta http-equiv='refresh' content='10'/>";
               page += "<title>ESP8266 Demo - www.afeletronica.com.br</title>";
               page += "<style> body { background-color: #fffff; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>";

             page += "</head><body><h1>ESP8266 AFSmart - Protocolo Wiegand </h1>";
             page += "<h3>DS18B20</h3>";
             page += "<ul><li>Temperatura : ";
             page += celsius;
             page += "&deg C</li>";
             page += "</li></ul>";
             page += "<ul><li>Codigo Wiegand : ";
             page += code;
             page += "</li></ul>";
            page += "<ul><li>Usuario : ";
            page += user;
            page += "<h3>Rele2</h3>";
            page += "<form action='/' method='POST'>";
            page += "<ul><li>Rele2 (estado: ";
            page += etatLed;
            page += ")";
            page += "<INPUT type='radio' name='LED' value='1'>ON";
            page += "<INPUT type='radio' name='LED' value='0'>OFF</li></ul>";
            page += "<INPUT type='submit' value='Atualizar'>";
            page += "</body></html>";
            
      return page;
}

void handleRoot()

     if ( server.hasArg("LED") ) 
     {
        handleSubmit();
     } 
    else 
    {
             server.send ( 200, "text/html", getPage() );
    }  
}

void handleSubmit() {

  // Actualise le GPIO / Update GPIO 

  String LEDValue;

  LEDValue = server.arg("LED");

  Serial.println("Set GPIO "); Serial.print(LEDValue);

  if ( LEDValue == "1" ) {

    digitalWrite(Rele2, LOW);

    etatLed = "On";

    server.send ( 200, "text/html", getPage() );

  } else if ( LEDValue == "0" ) {

    digitalWrite(Rele2, HIGH);

    etatLed = "Off";

    server.send ( 200, "text/html", getPage() );

  } else {

    Serial.println("Err Led Value");

  }

}



void ds_18b20()
{
  if ( !ds.search(addr)) 
{

   // Serial.println("No more addresses.");

    //Serial.println();

    ds.reset_search();

    delay(250);

    return;

  }

  

  //Serial.print("ROM =");

  for( i = 0; i < 8; i++) {

    //Serial.write(' ');

    //Serial.print(addr[i], HEX);

  }



  if (OneWire::crc8(addr, 7) != addr[7]) {

      //Serial.println("CRC is not valid!");

      return;

  }



  ds.reset();

  ds.select(addr);

  ds.write(0x44, 1);        // start conversion, with parasite power on at the end

  

  delay(1000);     // maybe 750ms is enough, maybe not

  // we might do a ds.depower() here, but the reset will take care of it.

  

  present = ds.reset();

  ds.select(addr);    

  ds.write(0xBE);         // Read Scratchpad



  for ( i = 0; i < 9; i++) {           // we need 9 bytes

    data[i] = ds.read();



  }



  // Convert the data to actual temperature

  // because the result is a 16 bit signed integer, it should

  // be stored to an "int16_t" type, which is always 16 bits

  // even when compiled on a 32 bit processor.

  int16_t raw = (data[1] << 8) | data[0];

  if (type_s) {

    raw = raw << 3; // 9 bit resolution default

    if (data[7] == 0x10) {

      // "count remain" gives full 12 bit resolution

      raw = (raw & 0xFFF0) + 12 - data[6];

    }

  } else {

    byte cfg = (data[4] & 0x60);

    // at lower res, the low bits are undefined, so let's zero them

    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms

    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms

    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms

    //// default is 12 bit resolution, 750 ms conversion time

  }

  celsius = (float)raw / 16.0;

  fahrenheit = celsius * 1.8 + 32.0;

}



    



void readCard(){



if(wg.available())

  {

    Serial.print("Wiegand HEX = ");

    //Serial.print(wg.getCode(),HEX);

    //code = (wg.getCode(),HEX);

     code = wg.getCode();

    

    Serial.print(code,HEX);

    Serial.print(", DECIMAL = ");

    Serial.print(wg.getCode());

    Serial.print(", Gate= ");

    Serial.print(wg.getGateActive());

    Serial.print(", Type W");

    Serial.println(wg.getWiegandType());    



    //if the code matches to claires card

    if(wg.getCode() == Usuario1)

    {

      Serial.println("Usuario1\n");

       user = 1;

       //open the door

      digitalWrite(14, LOW);

      //turn on her pathway lights

      //digitalWrite(5, HIGH);

      //wait 2 seconds before lock the door

      delay(3000);

      digitalWrite(14, HIGH);

      //wait 1 minute before turning off the lights

      //delay(60000);



    }



    if(wg.getCode() == Usuario2)

    {

      Serial.println("Usuario2\n");

       user = 2;

       //open the door

      digitalWrite(14, LOW);

      //turn on her pathway lights

      //digitalWrite(5, HIGH);

      //wait 2 seconds before lock the door

      delay(3000);

      digitalWrite(14, HIGH);

      //wait 1 minute before turning off the lights

      //delay(60000);



    }

       

    }



  

}

void setup() {

  Serial.begin ( 115200 );

// PIN assigment and declaration for Arduino Mega 

  //GATE A 

  wg.D0PinA =0;   

  wg.D1PinA =4;   



  //GATE B

  //wg.D0PinB =18;  

 // wg.D1PinB =19;   



  //GATE C

//  wg.D0PinC =20;  

//  wg.D1PinC =21;

 // Reader enable

  wg.begin(TRUE, FALSE, FALSE);  // wg.begin(GateA , GateB, GateC)



  pinMode(14,OUTPUT);

  pinMode(16,OUTPUT);

  digitalWrite(14,HIGH);

  digitalWrite(16,HIGH);

  

  WiFi.begin ( ssid, password );

  // Attente de la connexion au réseau WiFi / Wait for connection

  while ( WiFi.status() != WL_CONNECTED ) {

    delay ( 500 ); Serial.print ( "." );

  }

  // Connexion WiFi établie / WiFi connexion is OK

  Serial.println ( "" ); 

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

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

  // On branche la fonction qui gère la premiere page / link to the function that manage launch page 

  server.on ( "/", handleRoot );

  server.begin();

  Serial.println ( "HTTP server started" );

  

}

void loop() {

  server.handleClient();

  readCard();

  ds_18b20();



}

Para pegar o número IP do módulo AFSmart, abra o monitor serial, em seguida, conecte-se  ao módulo a ele a partir de um navegador da Web para acessar a interface da estação meteorológica.

Imagem da Aplicação:


Vídeo da leitura do Cartão MiFire