Wątek przeniesiony 2020-09-09 17:26 z C/C++ przez kq.

Zlecę wykonanie/modyfikację skryptu dla Arduino Uno

0

Zlecę wykonanie/modyfikację skryptu dla Arduino Uno

Hardware:

Software:

  • Debian 10.5.0
  • MySQL 10.3.23-MariaDB

Działanie skryptu:

  • Odczyt 12-znakowego tagu RFID
  • Porównanie odczytanego tagu z listą tagów w tabeli "uprawnienia" bazy MySQL
  • W przypadku zgodności odczytanego tagu z tagiem, znajdującym się w tabeli "uprawienia" - podanie na jeden z pinów Arduino na X sekund stanu wysokiego, w celu wysterowania przekaźnika 5V zamka elektromagnetycznego
  • Zapis odczytanego tagu bezpośrednio do tabeli "zdarzenia" w bazie MySQL wraz z aktualną datą i godziną

Połączenie pomiędzy Arduino a bazą MySQL musi odbywać się z wykorzystaniem bibliotek MySQL_Connection.h i MySQL_Cursor.h (nie poprzez skrypt PHP).

Dołączam skrypt kod.ino, który do tej pory udało mi się "wdrożyć". Odczyt RFID i zapis tagu do bazy MySQL działa, jednakże na końcu tagu doklejają się jakieś śmieci w stylu 010AC7973863⸮⸮⸮ i taki zapis idzie do bazy. W skrypcie brakuje odczytu z bazy "uprawnienia" i sterowania pinem wyjściowym.

Oferty z ceną i terminem realizacji proszę przesłać na adres: [email protected]

#include <SPI.h>
#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server_addr(192,168,1,14);  // IP of the MySQL *server* here
char user[] = "test";              // MySQL user login username
char password[] = "test";        // MySQL user login password

EthernetClient client;
MySQL_Connection conn((Client *)&client);

void setup() {
  Serial.begin(9600);
  if (Ethernet.begin(mac) == 0) {
     Ethernet.begin(mac);
  }
}

void loop() {
  char tagString[12];
  int index = 0;
  boolean reading = false;

  while (Serial.available()) {
    int readByte = Serial.read(); //read next available byte
    if (readByte == 2) reading = true; //begining of tag
    if (readByte == 3) reading = false; //end of tag
    if (reading && readByte != 2 && readByte != 10 && readByte != 13) {
      //store the tag
      tagString[index] = readByte;
      index ++;
    }
  }
 checkTag(tagString);
 clearTag(tagString);
 delay(500);
}

void checkTag(char tag[]) {
  if (strlen(tag) == 0) return;
  if (conn.connect(server_addr, 3306, user, password)) {
    Serial.println(tag);
    char INSERT_SQL[] = "INSERT INTO rfid.zdarzenia (RFID_odczytany, date, time) VALUES ('%s', curdate(), curtime())";
    char query[255];
    sprintf(query, INSERT_SQL, tag);
    MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
    cur_mem->execute(query);
    delete cur_mem;
    }
}

void clearTag(char one[]) {
  ///////////////////////////////////
  //clear the char array by filling with null - ASCII 0
  //Will think same tag has been read otherwise
  ///////////////////////////////////
  for (int i = 0; i < strlen(one); i++) {
    one[i] = 0;
  }
}
2

Nie wiem jak z ustawianiem pinu na znak wysoki i nie mam pod ręką zestawu z arduino, ale jeśli chodzi o śmieci w zapisie do bazy to nie zostawiasz sobie miejsca na znak kończący stringa:

char tagString[12];

Zmień na

char tagString[13] = {};

To od razu wyzeruje, więc clearTag() będzie zbędna.

Dodatkowo checkTag() wywołuj tylko jak index ≠ 0, wtedy check długości stringa będzie zbędny.

Proszę o dane do faktury :)

0

Dziękuję. Teraz już żadnych śmieci nie ma na końcu i do bazy idzie pełny tag 12-znakowy.

Z ustawieniem pinu w stan wysoki nie będę miał akurat problemu. Czy podejmiesz się napisania fragmentu kodu do porównywania odczytanego RFID z tagami w bazie danych? Z tym mam największy problem. Z FV nie ma problemu :-) Odezwij się do mnie na maila [email protected]

1 użytkowników online, w tym zalogowanych: 0, gości: 1