Pages: [1]   Go Down
Author Topic: Datalog RFID +Webserver+SD  (Read 1139 times)
0 Members and 1 Guest are viewing this topic.
Algeciras
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas, ando liado con un invento para registrar datos de lectura de tarjetas rfid con un arduino mega y la ethernet shield, la lectura rfid la hago por rs232 con un coversor de niveles y tambien tengo un rtc para la hora.
Cogiendo codigo de alli y de aca he conseguido que la cosa medio funcione, el problema lo estoy teniendo con la lectura del serial1 con rfid, me explico, en el loop llamo a una rutina que manda una cadena udp a un servidor externo que monitoriza el arduino, despues tengo otra rutina que comprueba el serial1 y despues otra rutina para el servidor web, la cuestión es que cuando todo funciona bien, pero en el momento que hago una lectura por serial1 el servidor web parece que se atasca, y solo vuelve a funcionar cuando vuelvo a pasar una tarjeta por el lector en serial1, por otra parte el envio de la cadena udp cada 30 segundos deja de funcionar desde que leo por primera vez serial1, ando algo despistado supongo algo me debo de dejar abierto en la lectura de serial1 pero estoy algo atascado, alguien tiene alguna pista del tema??? gracias.

He tenido que quitar codigo porque no mer permitia, pero  creo que se ve claro.

Code:
#include <SPI.h>
#include <Client.h>
#include <Ethernet.h>
#include <Server.h>
#include <Udp.h>
#include <Wire.h>
#include "RTClib.h"
#include <SdFat.h>
#include <SdFatUtil.h>
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 177 };
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };
byte server[] = { 62, x, x, x};
unsigned int remotePort = 8888;
Server portserver(88);
int time = 5000;
int wait = 1000;
char StrTest[] = "[99]Pruebas -> Test";
char StrInicio[] = "[99]Pruebas -> Inicio Sistema";
int enviado1=0;
int enviado30=0;
 
int  val = 0;
char code[10];
int bytesread = 0;
const int chipSelect = 4;
const int Centro=9;

RTC_DS1307 RTC;
uint8_t today;

Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
char filename[13];  // filename to store data on SD card - format YYYYMMDD.csv\0

#define error(s) error_P(PSTR(s))
void error_P(const char* str) {
  PgmPrint("error: ");
  SerialPrintln_P(str);
  if (card.errorCode()) {
    PgmPrint("Error detect.: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
  while(1);
}

#define BUFSIZ 100

void setup()

  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
      error_P("RTC is NOT running!");
  }
  DateTime now = RTC.now();
  today = now.day(); // store todays day
  Ethernet.begin(mac, ip, gateway, subnet);
  Udp.begin(remotePort);
  Serial.begin(57600);
  Serial1.begin(9600);
  PgmPrint("Free RAM.....: ");
  Serial.println(FreeRam());
  EscribeHora();
  Serial.println("");
  IniSd();
  Udp.sendPacket( StrInicio, server, remotePort);
}

void loop()
{
  Enviatest();
  CompruebaLector();
  WebServe();
}

void IniSd()
{
 char *fn; // filename
 Serial.print("SD Card Init.: ");

 pinMode(10, OUTPUT);   
 digitalWrite(10, HIGH); 
 if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");
 if (!volume.init(&card)) error("vol.init failed!");  //Inicializo volumen FAT
 PgmPrint("Volume FAT initialized OK");
 Serial.println(volume.fatType(),DEC);
 Serial.println();
 if (!root.openRoot(&volume)) error("openRoot failed");
  DateTime now = RTC.now();
  today = now.day(); // store todays day
  fn = create_file(now);
  Serial.print("Fichero Log..: ");
  Serial.println(fn);
  Serial.println();
  Serial.println("Ficheros encontrados en raiz");
  root.ls(LS_DATE | LS_SIZE);
  Serial.println();
  Serial.println("Ficheros encontrados en todos los directorios");
  root.ls(LS_R);
  Serial.println();
  PgmPrintln("Done");
}

void Enviatest()
{
  DateTime now = RTC.now();
  if(now.second()  == 1 && enviado1==0)
    {
    Udp.sendPacket( StrTest, server, remotePort);
    enviado1=1;
    enviado30=0;
    }
  if(now.second()  == 30 && enviado30==0)
    {
    Udp.sendPacket( StrTest, server, remotePort);
    enviado1=0;
    enviado30=1;
    } 
}

void CompruebaLector()
{
  if(Serial1.available() > 0) {         
    if((val = Serial1.read()) == 10) {   
      bytesread = 0;
      while(bytesread<10) {             
        if( Serial1.available() > 0) {
          val = Serial1.read();
       //     Serial.print(val);
          if((val == 10)||(val == 13)) {
            break;                       
          }
          code[bytesread] = val;         
          bytesread++;                   
        }
      }
      if(bytesread == 10) {             
        // Escribo en la sd       
        if (now.day() != today) { 
            file.close();
            create_file(now);
        }
        writeNumber(file, now.unixtime());
        writeString(file, "  ");
        writeString(file, code);
        file.sync();
        Serial.print(" TAG code is: ");   
        Serial.println(code);           
        Udp.sendPacket( code, server, remotePort);
      }
      bytesread = 0;
    }
  }   
}


void WebServe()
{
 char clientline[BUFSIZ];
 int index = 0; 
 Client client = portserver.available();
if (client) {
  // an http request ends with a blank line
  boolean current_line_is_blank = true;
 
  // reset the input buffer
  index = 0;
 
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
     
      // If it isn't a new line, add the character to the buffer
      if (c != '\n' && c != '\r') {
        clientline[index] = c;
        index++;
        // are we too big for the buffer? start tossing out data
        if (index >= BUFSIZ)
          index = BUFSIZ -1;
       
        // continue to read more data!
        continue;
      }
     

      clientline[index] = 0;
     

      Serial.println(clientline);
     

      if (strstr(clientline, "GET / ") != 0) {
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.print("Free RAM.....: ");
        client.print(FreeRam());
        client.print("<br>");
        client.print("<br>");
        client.print("Logs<br>");
       
        ListFiles(client, LS_SIZE);
      } else if (strstr(clientline, "GET /") != 0) {
        char *filename;
        filename = clientline + 5;

        (strstr(clientline, " HTTP"))[0] = 0;
       

        Serial.println(filename);

        if (! file.open(&root, filename, O_READ)) {
          client.println("HTTP/1.1 404 Not Found");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<h2>File Not Found!</h2>");
          break;
        }
       
        Serial.println("Opened!");
                 
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/plain");
        client.println();
       
        int16_t c;
        while ((c = file.read()) > 0) {

            client.print((char)c);
        }
        file.close();
      } else {

        client.println("HTTP/1.1 404 Not Found");
        client.println("Content-Type: text/html");
        client.println();
        client.println("<h2>File Not Found!</h2>");
      }
      break;
    }
  }

  delay(1);
  client.stop();
}
}

char * create_file(DateTime d)
{
    uint8_t month, day;
    uint16_t year;
    uint32_t all = 0;
    char *name;
    uint8_t i = 5;
 

    year = d.year();
    month = d.month();
    day = d.day();
    all = (uint32_t)year * 10000;
    all += (uint32_t)month * 100;
    all += (uint32_t)day;
 
    filename[sizeof(filename) - 1] = '\0';
    filename[sizeof(filename) - 2] = 'S';
    filename[sizeof(filename) - 3] = 'R';
    filename[sizeof(filename) - 4] = 'P';
    filename[sizeof(filename) - 5] = '.';
    do {
        i++;
        filename[sizeof(filename) - i] = all%10 + '0';
        all /= 10;
    } while (all);
 
    name = &filename[sizeof(filename) - i];
 

    file.open(&root, name, O_CREAT | O_WRITE | O_APPEND);
    if (!file.isOpen()) error ("file.create");
 
    return name;
}

void writeString(SdFile& f, char *str) {
    uint8_t n;
    for (n = 0; str[n]; n++);
    f.write((uint8_t *)str, n);
}

Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola comuner,

Yo he estado haciendo algo bastante similar, sólo que mi arduino actuaba como cliente. Mi consejo es que vayas realizando trazas en el código para ver en qué punto se queda cuando lees la targeta, prueba a cambiar de puerto serie en la mega. Luego he leído que utilizas el protocolo udp. ¿Has probado a usar tcp? Igual te deja de hacer el problema de esa primera lectura, pero vaya que no sé si te interesa hacerlo así, dependiendo de lo que requiera tu proyecto.

Un saludo y suerte!
Logged

Algeciras
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo de las trazas del codigo no se exactamente como hacerlo aun no conozco demasiado el entorno, asumo que todo sigue funcionando bien ya que la grabacion de la lectura en la sd funciona simpre parede que lo que falla es el tema ethernet, en cuando al envio de paquets udp como lo hago a modo de test, no espero a tener respuesta así si no hay comunicación por la causa que sea no se ralentizo nada.
Logged

Algeciras
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno voy averiguando algo mas, en el loop esta esto
Code:
void loop()
{
  Enviatest();
  CompruebaLector();
  WebServe();
}

El problema segun veo es que cuando se hace lectura en comprubalector() a partir de ese momento parece como si el resto del codigo se ejectura solo cuando vuelvo a leer ???

Code:
void CompruebaLector()
{
  if(Serial1.available() > 0) {          // if data available from reader
    if((val = Serial1.read()) == 10) {   // check for header
      bytesread = 0;
      while(bytesread<10) {              // read 10 digit code
        if( Serial1.available() > 0) {
          val = Serial1.read();
       //     Serial.print(val);
          if((val == 10)||(val == 13)) { // if header or stop bytes before the 10 digit reading
            break;                       // stop reading
          }
          code[bytesread] = val;         // add the digit           
          bytesread++;                   // ready to read next digit 
        }
      }
      if(bytesread == 10) {              // if 10 digit read is complete
     
        //Fecha y hora evento
        DateTime now = RTC.now();
          if (now.year() < 10) Serial.print("0");
        Serial.print(now.year(), DEC);
        Serial.print("/");
          if (now.month() < 10) Serial.print("0");
        Serial.print(now.month(), DEC); 
        Serial.print("/");   
          if (now.day() < 10) Serial.print("0");
        Serial.print(now.day(), DEC);
        Serial.print("  ");
          if (now.hour() < 10) Serial.print("0");
        Serial.print(now.hour(), DEC);
        Serial.print(":"); 
          if (now.minute() < 10) Serial.print("0");
        Serial.print(now.minute(), DEC);
        Serial.print(":");
          if (now.second() < 10) Serial.print("0");
        Serial.print(now.second(), DEC); 
        // Escribo en la sd       
        Serial.print(" TAG code is: ");   // possibly a good TAG
        Serial.println(code);            // print the TAG code
      }
      bytesread = 0;
    }
  }   
}
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¿y si condicionas todo el loop a if(serial.available>0)? Ten en cuenta que la función loop repite secuencialmente todo lo que contenga. Lo de las "trazas" no es más que poner un serial.print("escribir algo"); en la parte del código que desees de manera que sabes si se te repite un bloque del código, si omite alguna linea o se queda parado en algún punto.

Un saludo!
Logged

Algeciras
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

zEtA he probado pero sigue igual, comprobando he visto que la primera vez que leo el codigo dentro del while
Code:
      while(bytesread<10) {              // read 10 digit code
        if( Serial1.available() > 0) {
          val = Serial1.read();
       //     Serial.print(val);
          if((val == 10)||(val == 13)) { // if header or stop bytes before the 10 digit reading
            break;                       // stop reading
          }
          code[bytesread] = val;         // add the digit           
          bytesread++;                   // ready to read next digit 
        }
      }

a la segunda vez sale, por mas vueltas que le doy no se que estoy haciendo mal.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mira, yo en mi caso lo que hice fue establecer una conexión TCP y habilitar el serial en el setup. Luego en el loop, lo que hice fue condicionar todo a la lectura de la tarjeta. Lo que contenía ese if era el ejemplo de playground algo modificado que he visto que también usas tú, y luego la petición GET al servidor (en mi caso mi arduino era el cliente). Cada vez que lee una tarjeta, manda una petición a un servidor y luego vuelve a esperar a leer una nueva tarjeta.

En tu caso, yo intentaría simplificar los bloques de manera que partas de un punto en el que no te dé problema alguno o el programa se ejecute de la manera en la que desees.

A ver si tienes suerte y consigues solucionarlo!
Logged

Pages: [1]   Go Up
Jump to: