Buenas tardes a todos , Estoy trabajando en un 2do proyecto. El cual este es para mi Pymes.
Cuento con casi 15 Empleados
Y quiero hacer un Control de Entrada y Salida de cada 1.
Lista de materiales:
- 1 Arduino Mega
- 1 Arduino Ethernet Shield
- 1 Keypad 4 X 4
- Reloj Tiny RTC DS1307
- 1 Lector RFID-RC522 El cual me trajo problemas y lo estoy cambiando por EM4100 125Khz RFID
- 1 LCD Display 20x4 Blue + i2c
La idea se basa, en un sistema de control de usuarios
Mediante un Telcado o Tarjetas RFID.
Cuando el empleado pase la tarjeta o ingrese su clave , en el display muestra Su nombre y asi mismo deberia guardar fecha , hora , y nombre de empleado en una tabla de una base de datos.
Si la hora es de 7 Am a 2 PM Los datos se guardan en la tabla "INGRESO"
Si la hora es de 2 PM a 9 PM Los datos se guardan en la tabla "EGRESO"
(Las funciones de la HORA todavia no estan ECHAS)
Tengo Varias dudas.
En el caso de que la luz se corte , el Codigo quedara intacto ?
En caso de que la luz se corte , el reloj guardara la hora ya que cuenta con una bateria.
Problemas:
1. El RFID que compre 1ro, Usa pins (MOSI , MISO , SDA , SCK , RST) los cuales no son compatibles o no puedo usarlos debidamente ya que me tira muchos errores (POST DONDE HICE EL RECLAMO) PROBLEMA RESUELTO - SOLCION EN COMENTARIO
-
El codigo no esta muy hay que optimizarlo mucho
-
No me esta guardando los DATOS.
-
El Selector de tablas por horario lo hago por php o por arduino ?
Paso a mostrar las cosas como las tengo armadas.
Codigos , Librerias, Imagenes entre otras cosas.
Codigo Usuado Actualmente en el Arduino:
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // Ethernet Shield MAC
byte ip[] = { 192,168,0,254 }; // Ethernet Shield IP
byte server[] = { 192,168,0,7 }; // Server IP
EthernetClient client;
String location = "http://192.168.0.7/arduino_sensor.php HTTP/1.0";
char* empleado;
const byte ledind=13; //Rele del Abrepuertas
unsigned long clearlcd;
boolean er;
const int timetoclean=3000; //msecs en quitar información display
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
RTC_DS1307 RTC;
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] =
{
{
'1','2','3','A' }
,
{
'4','5','6','B' }
,
{
'7','8','9','C' }
,
{
'*','0','#','D' }
};
byte rowPins[ROWS] = {
33, 34, 35, 36};
byte colPins[COLS] = {
37, 38, 39, 40};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
const byte ncodigos=10; //Nº de codigos que queremos usar
//Detallamos los codigos que darán paso
char* Codkeypad[ncodigos]={
"123451",
"123452",
"123453",
"123454",
"123455",
"123456",
"123457",
"123458",
"123459",
"123460"};
//Detallamos los saludos correspondientes a cada código
char* nombreskeypad[ncodigos]={
"Marcos Silva",
"Empleado2",
"Empleado3",
"Empleado4",
"Empleado5",
"Empleado6",
"Empleado7",
"Empleado8",
"Empleado9",
"Empleado10"};
String pass;
byte pos= 0;
void setup () {
Wire.begin();
RTC.begin();
lcd.begin(20,4);
limpialcd();
lcd.backlight();
RTC.adjust(DateTime(__DATE__, __TIME__));
Ethernet.begin(mac, ip); // Init Ethernet Shield
lcd.backlight();
pinMode(ledind, OUTPUT); //Definimos el pin13 de salida
digitalWrite(ledind, LOW);
}
void loop () {
if (er==true) if (clearlcd+timetoclean<millis()) limpialcd();
char keypadkey = keypad.getKey();
if (keypadkey != NO_KEY) password(keypadkey);
lcd.setCursor(1,0);
fecha();
}
void limpialcd(){
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Ingrese Su clave");
er=false;
pos=0;
pass="";
}
void password(char key) {
pass+= key;
lcd.setCursor(0+pos,5);
lcd.print(key);
if (pos<5)
pos++;
else {
comprueba_codigos();
pos=0;
}
}
void comprueba_codigos() {
boolean encontrada=false;
for (byte a=0; a<ncodigos;a++){
String pwd = String(Codkeypad[a]);
if (pwd==pass) {
lcd.setCursor(0,3);
lcd.print(nombreskeypad[a]);
empleado=nombreskeypad[a];
encontrada=true;
}
}
lcd.setCursor(2,2);
if (encontrada) {
lcd.print("Codigo valido");
digitalWrite(ledind, HIGH);
delay(500); //Activamos el led durante 0,5 seg
digitalWrite(ledind, LOW);
if (client.connect(server, 80)>0) { // Connect to server
client.print("GET /kevin.php?valor="); // Send the DATA with GET
client.print(empleado);
client.println(" HTTP/1.0");
client.println("User-Agent: Arduino 1.0");
client.println();
}
else
{
Serial.println("Connection FAIL");
}
}
else
{
lcd.print("Codigo invalido");
lcd.setCursor(0,3);
lcd.print("Reintenta Nuevamente");
if (client.connected()) {}
else {
Serial.println("Disconnected!");
client.stop();
client.flush();
}
}
er=true;
clearlcd=millis();
}
void fecha(){
DateTime now = RTC.now();
lcd.setCursor(1,1);
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print(' ');
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
delay(100);
}
Codigo php
<?php
$conexion = mysql_connect("localhost", "root", "******");
mysql_select_db("horarios",$conexion);
mysql_query("INSERT INTO `horarios`.`ingreso` (`Empleado`, `Fecha`, `Hora`) VALUES ('" . $_GET['valor'] . "',CURDATE(),CURTIME())", $conexion);
?>
Librerias:
Wire.h
RTClib.h (Link)
LiquidCrystal_I2C.h (Link)
Keypad.h
SPI.h
Ethernet.h
Imagenes:
FALTAN SUBIRLAS
Lo que necesitara que me ayuden es a Resolver el problema del guardado que no lo hace y Optimizar un poco el codigo , se que hay muchas cosas que no sirven pero bueno , quiero tratar de hacerlo lo mejor posible.
Saludos a todos.