Pesquisar

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

Vá para o gerente da placa e 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 - módulo AFSmart  
01 - com 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



Nenhum comentário:

Postar um comentário