Problema con ESP8285 y Lector Rfid

Hola a todos,

Estoy creando un lector rfid wiegand con una placa ESP8285. Utilizo la biblioteca WiFiManager para generar un AP, configurar el Wifi y luego crear un servidor web. Todo funciona casi bien.

El problema que tengo es que cuando conecto los pines de interrupción del lector, la placa ESP8285 no genera el AP o el servidor web.

Si primero desconecto los pines del lector, ahi si me levanta el AP o el servidor web, luego conecto los pines del lector y todo funciona. Pero si tengo los pines del conector desde el principio, no funciona y en la terminal veo caracteres extraños.

¿Tienes alguna idea de cuál podría ser el problema?

A continuación muestro el código y el esquema.

#include <FS.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>         // https://github.com/tzapu/WiFiManager

// Set web server port number to 80
WiFiServer server(80);
 
 
#define MAX_BITS 100                 // max number of bits 
#define WEIGAND_WAIT_TIME  3000      // time to wait for another weigand pulse.  
 
unsigned char databits[MAX_BITS];    // stores all of the data bits
unsigned char bitCount;              // number of bits currently captured
unsigned char flagDone;              // goes low when data is currently being captured
unsigned int weigand_counter;        // countdown until we assume there are no more bits
 
unsigned long facilityCode=0;        // decoded facility code
unsigned long cardCode=0;            // decoded card code
String sFacilityCode = "";
String sCardCode = "";

const byte interruptPin0 = 13;
const byte interruptPin1 = 15;

String header;
 

// interrupt that happens when INTO goes low (0 bit)
void ISR_INT0()
{
  Serial.print("0");   // uncomment this line to display raw binary
  bitCount++;
  flagDone = 0;
  weigand_counter = WEIGAND_WAIT_TIME;  
 
}
 
// interrupt that happens when INT1 goes low (1 bit)
void ISR_INT1()
{
  Serial.print("1");   // uncomment this line to display raw binary
  databits[bitCount] = 1;
  bitCount++;
  flagDone = 0;
  weigand_counter = WEIGAND_WAIT_TIME;  
}
 
void setup()
{
  Serial.begin(9600);
  Serial.println();
  Serial.println("RFID Readers");

  // binds the ISR functions to the falling edge of INTO and INT1
  attachInterrupt(digitalPinToInterrupt(interruptPin0), ISR_INT0, FALLING);  
  attachInterrupt(digitalPinToInterrupt(interruptPin1), ISR_INT1, FALLING);
 
 
  weigand_counter = WEIGAND_WAIT_TIME;

  // WiFiManager
  // Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wifiManager;

   wifiManager.autoConnect("AutoConnectAP");
  // or use this for auto generated name ESP + ChipID
  //wifiManager.autoConnect();
  
  // if you get here you have connected to the WiFi
  Serial.println("Connected.");
  
  server.begin();

  pinMode(interruptPin0, INPUT_PULLUP); //data0
  pinMode(interruptPin1, INPUT_PULLUP); //data1
 
}
  
void loop()
{
  tagReader();
  webServer();
}
 
void printBits()
{
      // I really hope you can figure out what this function does
      Serial.print("FC = ");
      Serial.print(facilityCode);
      Serial.print(", CC = ");
      Serial.println(cardCode); 

      sCardCode = String(cardCode);
      sFacilityCode = String(facilityCode);
}


void tagReader(){
  // This waits to make sure that there have been no more data pulses before processing data
  if (!flagDone) {
    if (--weigand_counter == 0){
        flagDone = 1;
      }
  }

 
  // if we have bits and we the weigand counter went out
  if (bitCount > 0 && flagDone) {
    unsigned char i;
 
    Serial.print("Read ");
    Serial.print(bitCount);
    Serial.print(" bits. ");
 
    // we will decode the bits differently depending on how many bits we have
    // see www.pagemac.com/azure/data_formats.php for mor info
    if (bitCount == 35)
    {
      // 35 bit HID Corporate 1000 format
      // facility code = bits 2 to 14
      for (i=2; i<14; i++)
      {
         facilityCode <<=1;
         facilityCode |= databits[i];
      }
 
      // card code = bits 15 to 34
      for (i=14; i<34; i++)
      {
         cardCode <<=1;
         cardCode |= databits[i];
      }
 
      printBits();
    }
    else if (bitCount == 26)
    {
      // standard 26 bit format
      // facility code = bits 2 to 9
      for (i=1; i<9; i++)
      {
         facilityCode <<=1;
         facilityCode |= databits[i];
      }
 
      // card code = bits 10 to 23
      for (i=9; i<25; i++)
      {
         cardCode <<=1;
         cardCode |= databits[i];
      }
 
      printBits();  
    }
    else {
      // you can add other formats if you want!
     Serial.println("Unable to decode."); 
    }
 
     // cleanup and get ready for the next card
     bitCount = 0;
     facilityCode = 0;
     cardCode = 0;
     for (i=0; i<MAX_BITS; i++) 
     {
       databits[i] = 0;
     }
  }
}

void webServer(){
  
WiFiClient client = server.available();   // Listen for incoming clients

  if (client) {                             // If a new client connects,
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        header += c;
        if (c == '\n') {                    // if the byte is a newline character
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            
            
            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // CSS to style the on/off buttons 
            // Feel free to change the background-color and font-size attributes to fit your preferences
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".button2 {background-color: #77878A;}</style></head>");
            
            // Web Page Heading
            client.println("<body><h1>ESP8285 Tag Reader</h1>");
            client.println("<p>CardCode: " + sCardCode + "</p>");
            client.println("<p>FacilityCode: " + sFacilityCode + "</p>"); 
           
            client.println("</body></html>");
            
            // The HTTP response ends with another blank line
            client.println();
            // Break out of the while loop
            break;
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
    }
    // Clear the header variable
    header = "";
    // Close the connection
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
  
  }

Schematic Rfid.PNG

Probaste con otros pines?

Hola goldarg,

Una vez tuve un problema similar y resultó ser un problema de alimentación. Resulta que, al menos en mi caso el ESP8266 consumía mucho al encender. Si a esto le sumas que ese chip es muy sensible al ruido, me pasaba lo que comentas. Lo arreglé poniendo un condensador para evitar los microcortes. Prueba, a lo mejor te funciona.

Saludos

Era problema del pin 15. Por el tema de energia para probar use la salida del arduino uno de 5v pero era solo el pin. Ustedes me pueden decir si si la entrada vin del 8285 se aguanta 12v lei por ahi que hasta 20v soporta. El circuito que estoy armando necesita 12v y la verdad lo conecte a los 12v y funciono sin problemas pero no se si será mejor bajar los 12 a 3.3v. Que me recomiendan? No se mucho de electronica pero necesito añadir al circuito una bateria de 12v 7ah y una fuente que cargue la bateria busque una swichting de 12v 4ah no se si estara bien y que me aconsejan añadirle al circuito para evitar que se queme algo?

Hi,
Segun la foto tu estas alimentando el wienegar con los 5 voltios del arduino pero busque las especificaciones de algunos y dicen que el voltaje del wienegar debe de ser de 6 voltios a 14 voltios. No se cual es el modelo que tu usas pero seria bueno que buscaras las especificaciones del que etas usando. Creo que debes de usar un voltaje de 12 voltios de entrada.

tauro0221:
Hi,
Segun la foto tu estas alimentando el wienegar con los 5 voltios del arduino pero busque las especificaciones de algunos y dicen que el voltaje del wienegar debe de ser de 6 voltios a 14 voltios. No se cual es el modelo que tu usas pero seria bueno que buscaras las especificaciones del que etas usando. Creo que debes de usar un voltaje de 12 voltios de entrada.

Si al final estoy usando transformador de 12v ya que el cierre magnetico y el lector usan ese voltaje. Lo que no se es si esta bien que use 12v para la placa 8285 o si tengo que bajar a tension. Estoy viendo tambien que usar para activar la cerradura magnetica si un rele o un transitor en modo switch, si me pueden indicar un modelo de transistor ya que vi que hay muchos y no se cual se adapta mejor

Hi,
No dices que voltaje/corriente usa la cerradura magnetica. Adjunto 2 link de un mofet ya montado en un modulo de 5-36 voltios y una capacidad 15 amperios simpre y cuando le instales heat sink. Otro link de un relay bien fuerte de 10 amp con voltaje de salida 5 a 60 voltios DC. El ESP8285 usa 3.3 voltios. en ese caso como ya tienes los 12 voltios lo que necesitas es un regulador de 12 voltios 3.3 voltios.

https://www.ebay.com/itm/5pcs-MOS-FET-DC-Trigger-Switch-Driving-Module-PWM-Regulator-Control-Panel/302691587264

Tauro gracias por tu ayuda. La cerradura usa 12v y un consumo maximo de 320ma. Entiendo que deberia pasar corriente continuamente y con el esp mandar la señal para desactivarlo eso seria un NPN no?

Osea tengo 2 lectores de 12v con consumo de 71ma cada uno maximo.
Una cerradura de 320ma
El esp 300ma maximo dependiendo el modo.

Me faltaria completar el circuito con el mofet y resistencias en caso que necesite.

Tengo una fuente de 12v de 5a y una bateria de 12v 7ah para que se mantenga todo activo en caso de corte de luz. Ademas estoy viendo un step down de 12v a 3.3v que es lo q necesita el esp8285 el cual lei que es sensible a los voltajes

Desde ya muchas gracias

Hi,
Si quires lo puedes hacer con un transistor mosfet y dos resistencia o lo puedes comprar ya montado em un modulo como el que esta en link adjunto. Este modulo tiene el opto coupler incluido. Son baratos. Para que inventar la rueda si ya la puedes comprar hecha.

Gracias tauro, si para que inventar la rueda, estuve viendo en mi pais este driver

http://www.nubbeo.com.ar/modulo-driver-mosfet-irf520-24v-9a-arduino-nubbeo-972264672xJM

Ya que las compras en ebay desde Argentina tienen muchos problemas con la aduana. El IRF520 veo que es de 24v 9a, me sirve igual?

Hi,
Ese es perfecto ya viene como un modulo y lo puedes montar facilmente. Es lo mismo. Wow ARG $59.90 = US $1.65.