Muy buenas!
Hace poco que estoy trasteando con Arduino y de lenguaje de programación ni idea. Lo que he hecho hasta ahora es ir sumando la programacion de uno y de otro, copiando los sketch publicados.
Os cuento lo que quiero hacer. Tengo un NodeMCU V3 que tiene el ESP8266 (que ya podría ser el arduino micro, o mega, es lo de menos), una MC-RC522 lectora de rfid.
El propósito del proyecto es abrir una puerta con unos cuantos rfid y que además se pueda abrir conectándote a la wifi montando un servidor y pulsando un boton en el navegador.
Lo que he hecho hasta ahora es hacerlo por separado: tengo una programación que funciona genial con el RC522 abriendo cuando procede, etc. Y otra creando un botón en html que cuando esté apagado se encienda y cuando esté encendido que se apague y funciona ok. El problema viene cuando los “sumo”.
Os pongo el sketch del RFID:
#include <MFRC522.h>//Descargar e incluir la librería
#include <SPI.h>
/*
Pins SPI UNO Mega2560 Leonardo NodeMcu
1 (NSS) SAD (SS) 10 53 10 D2
2 SCK 13 52 SCK1 D5
3 MOSI 11 51 MOSI1 D7
4 MISO 12 50 MISO1 D6
5 IRQ * * *
6 GND GND GND GND GND
7 RST 5 ? Reset D1
8 +3.3V (VCC) 3V3 3V3 3.3V 3v3
* No necesario
*/
#define SAD 4
#define RST 5
MFRC522 nfc(SAD, RST);
#define ledPinAbierto 16
#define ledPinCerrado 2
void setup() {
pinMode(ledPinAbierto , OUTPUT);
pinMode(ledPinCerrado, OUTPUT);
SPI.begin();
Serial.begin(9600);
Serial.println("Buscando RC522");
nfc.begin();
byte version = nfc.getFirmwareVersion();
if (! version) {//Entra si no encuentra el módulo.
Serial.print("No ha encontrado RC522");
while(1); //detener
}
Serial.print("Ha encontrado RC522");
Serial.print("Firmware version 0x");
Serial.print(version, HEX);
Serial.println(".");
}
#define AUTHORIZED_COUNT 1 //Para autoriazar más tarjetas ponemos el número aqui y la añadimos abajo
byte Authorized[AUTHORIZED_COUNT][6] = {
{0xB2, 0x95, 0x5E, 0xB2, 0xFF, 0xFF, }
//,{0x10, 0x39, 0x14, 0x2E, 0xFF, 0xFF, } ejemplo de como autorizar más tarjetas 0x83,.....
};
void printSerial(byte *serial);
boolean isSame(byte *key, byte *serial);
boolean isAuthorized(byte *serial);
void loop() {
byte status;
byte data[MAX_LEN];
byte serial[6];
boolean Abierto = false;
digitalWrite(ledPinAbierto, Abierto);
digitalWrite(ledPinCerrado, !Abierto);
status = nfc.requestTag(MF1_REQIDL, data);
if (status == MI_OK) {
status = nfc.antiCollision(data);
memcpy(serial, data, 6);
if(isAuthorized(serial))
{
Serial.println("Autorizado");
Abierto = true;
}
else
{
printSerial(serial);
Serial.println("NO autorizado");
Abierto = false;
}
nfc.haltTag();
digitalWrite(ledPinAbierto, Abierto);
digitalWrite(ledPinCerrado, !Abierto);
delay(4000);
}//if (status == MI_OK)
delay(500);
}//void loop()
boolean isSame(byte *key, byte *serial)
{
for (int i = 0; i < 4; i++) {
if (key[i] != serial[i])
{
return false;
}
}
return true;
}
boolean isAuthorized(byte *serial)
{
for(int i = 0; i<AUTHORIZED_COUNT; i++)
{
if(isSame(serial, Authorized[i]))
return true;
}
return false;
}
void printSerial(byte *serial)
{
Serial.print("Serial:");
for (int i = 0; i < 5; i++) {// aumentar a 5 para leer el número de la tarjeta completo
Serial.print(serial[i], HEX);
Serial.print(" ");
}
}
Y ya os digo que funciona ok. Cuando paso una tarjeta no reconocida no hace nada, cuando se la paso se abre 4 segundos y y se vuelve a cerrar. Todo ok hasta aquí.
Os copio ahora el sketch del botón:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>
/*
NodeMCU Server - Conexión en modo Station con un punto de acceso (router) por Dani No www.esploradores.com
Crea una conexión del NodeMCU en modo Station con un punto de acceso que permite
encender y apagar un LED conectado a la salida D4 (GPIO02) del módulo NodeMCU.
Este código de ejemplo es de público dominio.
*/
const char* ssid = "NOMBRE DE MI RED"; //Indicamos el nombre de la red WiFi (SSID) a la que queremos conectarnos.
const char* password = "PASS DE MI RED"; //Indicamos la contraseña de de red WiFi
WiFiServer server(80); //Definimos el puerto de comunicaciones
int PinLED = 16; // GPIO2 //Definimos el pin de salida - GPIO2 / D4
int estado = LOW; //Definimos la variable que va a recoger el estado del LED
void setup() {
Serial.begin(115200);
pinMode(PinLED, OUTPUT); //Inicializamos el GPIO2 como salida
digitalWrite(PinLED, LOW); //Dejamos inicialmente el GPIO2 apagado
WiFi.begin(ssid, password); //Inicializamos la conexión del NodeMCU con la red WiFi
Serial.printf("Conectando a la red: %sn", WiFi.SSID().c_str());
while (WiFi.status() != WL_CONNECTED) { // Verifica el estado de la conexión del NodeMCU cada 0,5s hasta que conecta
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectada"); // Indica que el NodeMCU conectado con la red WiFi
server.begin(); // Inicia el NodeMCU en modo Station
Serial.println("Servidor inicializado");
Serial.printf("Utiliza esta URL para conectar: http://%s/n", WiFi.localIP().toString().c_str());
}
void loop(){
WiFiClient client = server.available(); // Comprueba si el cliente ha conectado
if (!client) {
return;
}
Serial.println("nuevo cliente"); // Espera hasta que el cliente envía alguna petición
while(!client.available()){
delay(1);
}
String peticion = client.readStringUntil('\r'); // Lee la petición
Serial.println(peticion);
client.flush();
// Comprueba la petición
if (peticion.indexOf('/LED=ON') != -1) {
estado = HIGH;
}
if (peticion.indexOf('/LED=OFF') != -1){
estado = LOW;
}
digitalWrite(PinLED, estado); //Enciende o apaga el LED en función de la petición
client.println("HTTP/1.1 200 OK"); //Envía la página HTML de respuesta al cliente
client.println(""); //No olvidar esta línea de separación
client.print("<h1 align=center>El LED está ahora: ");
//Se crea un único botón para modificar el estado del LED
if(estado == HIGH) {
client.print("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button>
");
} else {
client.print("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button>
");
}
client.println("</html>");
delay(1);
Serial.println("Peticion finalizada"); // Se finaliza la petición al cliente. Se inicializa la espera de una nueva petición.
Serial.println("");
}
La cuestión es que sumando todo me dan los siguientes errores, que no sé como quitarlos o solventarlos:
Le pongo la tarjeta y no la lee hasta que entro o actualizo en la web que se crea y entonces es cuando lee la tarjeta y abre (no hace falta que pulse el botón de apagar o encender, solo creo que detecta si hay cliente y entonces es cuando el RC522 empieza).
El otro problemilla me lo encuentro cuando quito el WHILE de si hay cliente en el html y es que cuando pulso el botón de encender. Se habilita el botón de apagar pero se queda en intermitencia de encendid y apagado una fracción de segundo mínima. Entra en bucle hasta que la apago desde el html.
Es un poco lioso, lo entiendo. No pido que me lo hagan, me conformo con que detecten lo que no va bien para poder formarme y modificarlo.
Mil gracias de antemano!!!