collapse

* Posts Recentes

Autor Tópico: Relógio de Picagens  (Lida 839 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.739
Relógio de Picagens
« em: 07 de Abril de 2018, 15:41 »
Viva,

Como prometido deixo aqui um tutorial da demonstração que fiz para o Relógio de Picagens, o tempo não tem sido muito e não consegui colocar o código muito "bonito".
Não vou abranger a parte de Hosting e Dominio porque não é esse o intuito, mas dou umas dicas.
Serve de demonstração e é apenas um "Hello World" para conseguirem fazer um Relógio de Picagens.

Ora então o que é preciso:
- Arduino Mega
- Placa Ethernet Para o Arduino
- RTC
- RFID RC522 (Funduino)
- LCD 16x2
- Buzzer
- Alimentação (Transformador 5v -1A ou 2A).
- 2 resistências (220Ohms e 100Ohms).
- Potenciômetro 10k.

Hosting/Dominio
- Host com Mysql ou um servidor local com XAMP por exemplo.

-------------------------------
Começando então, primeiro temos que ter uma Base de dados e um domínio.
- Para hosting podem usar o PTISP/OVH/AMEN algo do género registam o webhost e dominio e instalam um wordpress no cPanel, depois terão que configurar no cPanel o RemoteMySQL com uma WildCard para o vosso ip para verem o ip existe o site (omeuip.pt), após isto abrem o phpMyAdmin e criam uma base de dados de teste.
- Para local, basta verem no site do XAMP como instalar o wordpress por exemplo e depois é configurar uma BD local.

Após isto temos que montar a parte electronica toda para isso aconselho que testem componentes primeiro individualmente e depois vão adicionando uns aos outros.
Deixo no Zip em anexo as Libs que precisam para o Arduino que já trazem exemplos.






As pilhas neste caso foi usado um transformador 5v com 2A de output.

Após ter tudo montado no Servidor temos que aceder via FTP e colocar na pasta public_html os 3 ficheiros abaixo:
- db.ini
- scheduleRegister.php
- c_table.php

Explicando cada um deles:
 - scheduleRegister.php é o php que irá ler os dados enviados pelo Arduino e depois irá escrever na base de dados esses dados.
 - db.ini é o que tem os dados de acesso da base de dados e idealmente deverá estar fora da "root" folder do vosso dominio, isto para prevenir que ataques ao servidor consigam ter acesso as vossas credenciais da base de dados. (A não ser que sejam ataques via FTP).
- c_table.php é o ficheiro que irá ler a BD e mostra uma simples tabela no vosso browser com os dados.

Para colocarem a escrita e leitura na db a funcionar, destes 3 ficheiros basta alterarem ficheiro db.ini com os vossos dados.

Código: [Seleccione]
dbusername=usernameDummy
 dbpassword=passwordDummy
 server=localhost
 dbschema=testDatabase
 auth=bf98c3bf08764d1583c29b2863c875e7 #Necessita fazer match com o do arduino para segurança.

Depois de terem a parte de base de dados e hosting funcional vamos ao Arduino.

Código: [Seleccione]
#include <SPI.h>
#include <Ethernet.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <DS3231.h>


/* START RFID */
#define RST_PIN 48
#define SS_PIN  53

String read_rfid;
String userName;
String ok_rfid_1 = "268743"; //adicionar os "UID" das tags RFID(cartões, porta-chaves, etc).
String ok_rfid_2 = "364a2311"; //podemos adicionar quantos quisermos
String ok_rfid_3 = "b6e22011";
String ok_rfid_4 = "86f61c11";
String ok_rfid_5 = "013dda1";
String ok_rfid_6 = "86951911";
String ok_rfid_7 = "2692f11";
String ok_rfid_8 = "d0aedda1";
String ok_rfid_9 = "16c81a11";
String ok_rfid_10 = "36172a11";
String ok_rfid_11 = "6491311";

MFRC522 mfrc522(SS_PIN, RST_PIN);  //instanciar o MFRC522
/*END RFID*/


/* Inicializar o LCD */
LiquidCrystal lcd(22, 23, 26, 27, 28, 29);
/* LCD */

/* START Ethernet */
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 177); //coloque o Ip para o Arduino, cuidado não usar o ponto (".") e sim a virgula (",").
char server[] = "www.o_vosso_site.pt"; //Importante, se usarem o XAMP localmente teem que colocar o IP do vosso computador, se for online coloquem o vosso site "www.exemplo.pt"
EthernetClient client;
/*END Ethernet */

/* Server authentication */
String auth = "bf98c3bf08764d1583c29b2863c875e7"; //variavel para autenticar, pode ser gerada ou então uma palavra qualquer vossa, e tem que fazer match com a que esta no db.ini.
boolean success = false;

// Iniciar o DS3231
DS3231  rtc(SDA, SCL);
String hora, data;
String separador = "-"; //Separador para separar a hora da data na BD

//buzzer
const int buzzer = 49;

void setup() {
  //Start Serial
  Serial.begin(9600);

  rtc.begin();

  // Inicializa SPI bus
  SPI.begin();
  mfrc522.PCD_Init();// Inicializa MFRC522

  //Inicializar o LCD.
  lcd.begin(16, 2);
  lcd.clear();
  lcd.print("A ligar...");
  //Serial.println("A ligar..."); //Debug opcional

  // Start conexão Ethernet
  Ethernet.begin(mac, ip);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // tentar configurar usando um IP address ao inves do DHCP.
    Ethernet.begin(mac, ip);
  }
  //Dar 1 segundo para a placa Ethernet Inicializar.
  pinMode(buzzer, OUTPUT);
  delay(1000);
}

void loop() {
  String timestamp="";
  timestamp = getTime();

  //Rfid
  if (!mfrc522.PICC_IsNewCardPresent())
    return;
  if (!mfrc522.PICC_ReadCardSerial())
    return;

  //corre a função implementada para ler a tag.
  dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);

  Serial.println(read_rfid); //Debug para ver o ID da tag (opcional)
  userName = getUserFromTagId(read_rfid);

  if (userName.length() > 0 && userName != "") {
    if (userName == "notRecognized") {
      makeErrorBip();
      printToLCD("Nao", "Autorizado");
    } else {
      makeBip();
      success = sendToServer(userName, timestamp);
      // se enviou com sucesso
      if (success) {
        printToLCD("Bem vindo", userName);
      } else {
        Serial.println("--> Ligacao Falhada\n");
        printToLCD("Ligacao", "Falhada");
      }
    }
  }
}

void makeBip() {
  tone(buzzer, 4000); // Send 4KHz sound signal...
  delay(300);        // ...for 300 miliSec
  noTone(buzzer);     // Stop sound...
}

void makeErrorBip() {
  for (int i = 0; i < 5; i++) {
    tone(buzzer, 1000); // Send 4KHz sound signal...
    delay(150);        // ...for 150 miliSec
    noTone(buzzer);     // Stop sound...
  }
}

String getTime() {
  hora = rtc.getTimeStr();
  data = rtc.getDateStr();
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print(data);
  lcd.setCursor(4, 1);
  lcd.print(hora);
  delay(1000);
  return data + separador + hora;
}

//Retorna o nome da pessoa de cada Tag
String getUserFromTagId(String rfid) {
  if (read_rfid == ok_rfid_1) {
    return "User 1";
  } else if (read_rfid == ok_rfid_2) {
    return "User 2";
  } else if (read_rfid == ok_rfid_3) {
    return "User 3";
  } else if (read_rfid == ok_rfid_4) {
    return "User 4";
  } else if (read_rfid == ok_rfid_5) {
    return "User 5";
  } else if (read_rfid == ok_rfid_6) {
    return "User 6";
  } else {
    return "notRecognized"; //Tag não reconhecida, é necessario declara-la no inicio
  }
}


/*
   *  Função que ajuda a escrever no monitor serie o valor do UID das tags.
   *  NOTA: Não é importante saber como funciona se estás num nivel mais basico.
   */
void dump_byte_array(byte *buffer, byte bufferSize) {
  read_rfid = "";
  for (byte i = 0; i < bufferSize; i++) {
    read_rfid = read_rfid + String(buffer[i], HEX);
  }
}

boolean sendToServer(String userName, String timestamp) {

  if (client.connect(server, 80)) {
    //Serial.println("Ligacao com Sucesso!"); //Debug (opcional)
   
    client.print("GET /scheduleRegister.php?"); // Alterar para o nome do nosso script php na raíz do nosso servidor
    client.print("username="); // variavel com o nosso valor
    client.print(userName); // valor que queremos passar para inserir na BD.
    client.print("&time=");
    client.print(timestamp);
    client.print("&auth=");
    client.print(auth);
    client.println(" HTTP/1.1"); // Parte do HTTP Request
    client.println("Host: www.rascunhofiel.pt"); // IMPORTANT: O vosso site, se usarem XAMP precisam saber o IP do vosso computador.
    client.println("Connection: close"); // Parte do HTTP Request para fechar o pedido.
    client.println(); // Empty line
    client.println(); // Empty line
    client.stop();    // Fecha a ligacao

    return true;
  }
  // Se o arduino nao se conseguir ligar ao servidor retorna false.
  return false;
}

void printToLCD(String firstString, String secondString) {
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print(firstString);
  lcd.setCursor(3, 1);
  lcd.print(secondString);
  delay(2000);
  lcd.clear();
}


Após isto basta testarem e invocarem o vosso ficheiro php para verem a tabela no browser.
localhost:8080/c_table.php ou dominio.pt/c_table.php dependendo o que estão a usar e deverão ter algo do género:



E por fim, o que é um relógio de Picagens sem uma caixa, eu desenhei uma Caixa 3D mas depois de a imprimir vi que não me lembrei do Buzzer nem do Potenciometro, então como a caixa também está com alguns erros não me preocupei com isso e depois futuramente partilho aqui uma caixa "final".

De qualquer forma deixo aqui umas print's e deixo o ficheiro do Fusion360 no Zip em anexo.



Por fim, deixo aqui um pequeno video que foi o teste que fiz, não está nada de especial mas irei trabalhar neste projecto nos meus "tempos livres" e depois coloco cá um video melhor com umas fotos. :)







Algo que não esteja muito bem estão à vontade, mas isto foi um projecto de 2 semanas e não deu para muito mais.  ;D ;D ;D

Espero que gostem,
Obrigado,
André.
« Última modificação: 07 de Abril de 2018, 15:54 por zordlyon »

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.527
Re: Relógio de Picagens
« Responder #1 em: 09 de Abril de 2018, 23:21 »
Boa partilha! Força nisso!  :)
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.396
    • Tróniquices
Re: Relógio de Picagens
« Responder #2 em: 10 de Abril de 2018, 15:42 »
Tá um óptimo protótipo :) Mais uma voltinha e podes introduzir no mercado ;)
Obrigado pelo post :)

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re: Relógio de Picagens
« Responder #3 em: 11 de Abril de 2018, 00:51 »
boa ;)

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.739
Re: Relógio de Picagens
« Responder #4 em: 11 de Abril de 2018, 10:07 »
Obrigado malta.. :)

Isto é um relógio para uma empresa familiar, que ia pagar 300€ anuais para manutenção e updates do aparelho, e assim fica com a mesma coisa por menos :)

Cumps,
André.

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.259
Re: Relógio de Picagens
« Responder #5 em: 11 de Abril de 2018, 12:05 »
ia pagar 300€ anuais para manutenção e updates do aparelho, e assim fica com a mesma coisa por menos :)

Ja agora, seria interessante se podesses partilhar o quanto tempo gastaste no desenvolvimento (concepção, electronica, software, firmware, web, etc), construção, instalação, etc de tudo ;)

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.739
Re: Relógio de Picagens
« Responder #6 em: 11 de Abril de 2018, 17:24 »
ia pagar 300€ anuais para manutenção e updates do aparelho, e assim fica com a mesma coisa por menos :)

Ja agora, seria interessante se podesses partilhar o quanto tempo gastaste no desenvolvimento (concepção, electronica, software, firmware, web, etc), construção, instalação, etc de tudo ;)

Viva, é fácil... :)

Comprar material e esperar por ele foram 2 dias (comprado em PT)..
Ligar tudo e testar com exemplos 1 a 1 - 3h +-
Hosting/BD - 3h
Código PHP - 8-12h (2/3h por dia +-) (nunca tinha programado em PHP).
Código do Arduino - 4h-6h (2/3h por dia +-)
Desenho 3D em Fusion 360 - 2h
Imprimir a caixa em 3D - 10h (5h cada tampa em qualidade "draft").

Total +- 36h.... Digamos 40h por alto, 1 semana de trabalho fora a espera pelos componentes :)


Além disso juntamente com estas horas está aqui uma implementação em Java com GUI em Swing (muito draft) porque é o que vou usar, não irei usar interface web por causa de não ter mais "um php" a aceder a BD, prefiro ter algo local num jar que se liga a BD e tá feito, isto é só mesmo para consulta à BD e impressão para papel todos os meses dos empregados/mês.

[/url]
[/url]
[/url]


Cumps,
André.





« Última modificação: 11 de Abril de 2018, 17:31 por zordlyon »

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.259
Re: Relógio de Picagens
« Responder #7 em: 12 de Abril de 2018, 11:06 »
:O parece-me bastante pouco :) mas se o dizes..

Comprar material e esperar por ele foram 2 dias (comprado em PT)..

Suponho que tenhas tido algumas referencias de projectos?
E quantas horas antes de "investigaçao" para saber que material comprar, etc?
Por exemplo, "Ligar tudo e testar com exemplos 1 a 1 - 3h +-" parece-me pouco tempo ou estar ai a faltar a parte de encontrar os exemplos certos a testar?

Obrigado pela partilha!

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.739
Re: Relógio de Picagens
« Responder #8 em: 12 de Abril de 2018, 11:49 »
:O parece-me bastante pouco :) mas se o dizes..

Comprar material e esperar por ele foram 2 dias (comprado em PT)..

Suponho que tenhas tido algumas referencias de projectos?
E quantas horas antes de "investigaçao" para saber que material comprar, etc?
Por exemplo, "Ligar tudo e testar com exemplos 1 a 1 - 3h +-" parece-me pouco tempo ou estar ai a faltar a parte de encontrar os exemplos certos a testar?

Obrigado pela partilha!


Viva, para terem uma noção ao todo foram 2,5 semanas todos os dias das 21h/21h30-00h00/1h..

A parte de investigação não está contabilizada é verdade, pode-se acrescentar mais 1 semana de 3h por dia que dá uma média de 15h/20h...
Nesta investigação do material a comprar etc, basicamente foi ir ao Youtube ver uma review, ver se havia em loja PT, e depois ir ver exemplos para ver se se adequava ao meu projecto, depois disso já guardava links com montagens/exemplos.

Quando chegou o material todo, numa noite testei isso tudo daí ser 3h, basicamente é ligar um LCD e testar o helloworld, desligar tudo, ligar o RFID e testar a leitura das tags, desliga tudo e assim sucessivamente.

Como as libs de arduino já trazem exemplos e eu na investigação (semana anterior) tinha tirado exemplos e bocados de código, já tinha organizado o código +- e ainda nao tinha o hardware.

;)