//sketch 16.08.2023
//РЕЛЕ 3 секунды RFID 125кГц светодиод на 45 секунд кнопка открытия (Arduino 1.8.10 nano, OLD ATmega328P)
#include <SoftwareSerial.h>
const int ledPin = 6;
unsigned long next_time; // время переключения первого света
int timeout = 45000; // сколько гореть лампе
int led_state = 0; //свет 1-вкл/0-выключен
int timewait = 3000; //3 сек =3000
int pin07 = 7; // для реле
int pin08 = 8; // для реле
String s = ""; //
int shex = 0;
int none = 0;
String namefio = "";
int input;
boolean onerun = true;
const char tag_0[] PROGMEM = {"7B00436AE6B4"};
const char tag_1[] PROGMEM = {"2F003D7CABC5"};
const char tag_2[] PROGMEM = {"0700CDA20C64"};
const char tag_3[] PROGMEM = {"2F004530114B"};
const char tag_4[] PROGMEM = {"2F003BCBD20D"};
const char tag_5[] PROGMEM = {"2F0044A1AF65"};
const char tag_6[] PROGMEM = {"3E009D78B56E"};
const char tag_7[] PROGMEM = {"3E009D965366"};
const char* const tag_table[] PROGMEM ={tag_0,tag_1,tag_2,tag_3,tag_4,tag_5,tag_6,tag_7};
const char* const name_table[] PROGMEM ={"Николай","Николай0004029611СинийМал","Николай","ГалинаВ","МОЙ СИНИЙ МАЛ.","ЧЕРНЫЙ","ЧЕРНЫЙ"};
SoftwareSerial SoftSerial(2, 3);
unsigned char buffer[64];
int count=0;
char tagNumber[15];
char Number[15];
boolean receivedTag;
#define _LCD_TYPE 1 // Задаем тип подключения, 1 - I2C, 2 - десятиконтактное
//+#include <LCD_1602_RUS_ALL.h> // Подключаем библиотеку
#include <LCD_1602_RUS.h> // подключаем библиотеку LCD_1602_RUS
//+2+ LCD_1602_RUS LCD(0x27, 16, 2); // Создаем объект класса LCD_1602_RUS 0x3f 0x27
#include "Wire.h" // библиотека для управления устройствами по I2C
#include "LiquidCrystal_I2C.h" // подключаем библиотеку для LCD 1602
//+2+ LiquidCrystal_I2C LCD(0x27,16,2); // присваиваем имя LCD для дисплея
LCD_1602_RUS LCD(0x27,16,2); // присваиваем имя LCD для дисплея
String str = ""; //10 цифр в ряду
void setup(){
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, led_state); // гасим светодиод
next_time = millis() + timeout;
pinMode(pin08, OUTPUT);
digitalWrite(pin08, HIGH); // pin07 отк.выс.уров.
pinMode(pin07, OUTPUT); // реле pin07
digitalWrite(pin07, HIGH);
SoftSerial.begin(9600);// Запуск RDM6300 115200
Serial.begin(9600);//Запуск СОМ-порта 9600
LCD.init();
LCD.backlight(); // Включаем подсветку
LCD.begin(16, 2);// у нас экран 16 столбцов на 2 строки
// lcd.setBacklight(255); //установить яркость подсветки на максимум
LCD.clear(); // очистить экран и установить курсор в позицию 0, 0
LCD.setCursor(1, 0); // 1-й столбец, 0-я строка
LCD.print("Arduino и"); // 1 текст
LCD.setCursor(7, 1);// 7-й столбец, 1-я строка
LCD.print("дисплей"); // 2 строку
}
void(* resetFunc) (void) = 0;
String c2d (byte i){ // convert2digit - добавляю ноль перед числом до 10 и преобразовываю в строку
String str = (String)i;
if (i < 10) str = '0' + str;
return str;
}
unsigned int hexToDec(String hexString) {
unsigned int decValue = 0;
int nextInt;
for (int i = 0; i < hexString.length(); i++) {
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}
String decToHex(byte decValue, byte desiredStringLength) {
String hexString = String(decValue, HEX);
while (hexString.length() < desiredStringLength) hexString = "0" + hexString;
return hexString;
}
// преобразование части строки HEX в число Int
// начиная с символа n, м символов
unsigned int HexToInt ( char buf[], byte n, byte m) {
unsigned int y = 0;
for (int i=0; i<m; i++)
{
if (buf[n+i]-'0' >16) { y = y + ((buf[n+i]-'0' - 7) << 4*(m-1-i)) ;}
if (buf[n+i]-'0' <16) { y = y + ((buf[n+i]-'0') << 4*(m-1-i));}
}
return y;
}
int StrToHex(char str[])
{
return (int) strtol(str, 0, 16);
}
void loop(){ //loop
int now_time = millis();
if( now_time >= next_time )
{
next_time = now_time + timeout;
digitalWrite(ledPin, 0);
}
if (SoftSerial.available() > 0)
{//Если в RDM6300
receivedTag=false;
// Serial.setTimeout(9000);
while(SoftSerial.available())
{
int BytesRead = SoftSerial.readBytesUntil(3, tagNumber, 13);
s = tagNumber;
receivedTag=true;
}
s.trim(); //myString.trim() – удаляет пробелы из начала и конца строки. Действует со строкой, к которой применяется
s = s.substring(1);//myString.substring(from) и myString.substring(from, to) – возвращает подстроку, содержащуюся в myString с позиции from и до конца, либо до позиции to
String id = s;
String ph_number = "";
for (int i = 0; i < id.length(); i++) {
// if (id[i] !="")
{ if (id[i]=='0') {ph_number = ph_number + "0";}
if (id[i]=='1') {ph_number = ph_number + "1";}
if (id[i]=='2') {ph_number = ph_number + "2";}
if (id[i]=='3') {ph_number = ph_number + "3";}
if (id[i]=='4') {ph_number = ph_number + "4";}
if (id[i]=='5') {ph_number = ph_number + "5";}
if (id[i]=='6') {ph_number = ph_number + "6";}
if (id[i]=='7') {ph_number = ph_number + "7";}
if (id[i]=='8') {ph_number = ph_number + "8";}
if (id[i]=='9') {ph_number = ph_number + "9";}
if (id[i]=='A') {ph_number = ph_number + "A";}
if (id[i]=='B') {ph_number = ph_number + "B";}
if (id[i]=='C') {ph_number = ph_number + "C";}
if (id[i]=='D') {ph_number = ph_number + "D";}
if (id[i]=='E') {ph_number = ph_number + "E";}
if (id[i]=='F') {ph_number = ph_number + "F";}
} //else {ph_number = "error";}
}
s = ph_number;
// if (id.length() == 12) {Serial.println(id); }
tone(4, 100, 100);
if (checkTag(tagNumber)) {none = none + 1;}
if (checkTag(tagNumber))
{//есть номер
if ((s.length() >= 12) && (s!="") && (receivedTag == true))
{//26
if (none <= 1)
{
Serial.println(s); // Serial.println("!- Svoy - "+ namefio+" (ID="+s+")");
String idhex = s.substring(4, 10); //вырезаем hex 8бит
unsigned long numberOk = strtoul(idhex.c_str(), NULL, 16); //перевести строку с hex значением в int
//c_str() конвертировать string в char
LCD.init();
LCD.backlight(); // Включаем подсветку
// lcd.setBacklight(255); //установить яркость подсветки на максимум 255
LCD.clear();
LCD.setCursor(1, 0);
LCD.print("RFID125кГцСВОЙ!");
LCD.setCursor(0, 1);
// LCD.print(s);
str = (String)numberOk;
while(str.length() < 10 )
{ // добавляю ноль перед числом до 10 и преобразовываю в строку
if (str.length() < 10) str = '0' + str;
}
LCD.print("Nomer "+str);
Serial.println(str);//DEC
Serial.println(idhex); //"125kH HEX="
s = "";
digitalWrite(ledPin, 1); // свет 6
digitalWrite(pin07, LOW); //реле открытия 7
tone(4, 100, 100);
delay(timewait);// Serial.println("!- пауза " +String(timewait / 1000) + " сек и механизм запирается");
digitalWrite(pin07, HIGH); //отк реле // Serial.println("!- Деактивируем реле на pin07. Закрытие.");
digitalWrite(ledPin, led_state); // гасим светодиод
// lcd.setBacklight(55); //установить яркость подсветки на 55
tone(4, 200, 200); // сигнал на 4 пине, Закрытие
// delay(100);
tagNumber[0] = 0;
none = 0;
s = "";
}
} //26
} //есть номер
else{// чужой
if ((s.length() >= 12) && (s!="") && (receivedTag == true) && (none <= 1) )
{
Serial.println(s); // "!- Chuzhoy ID="
String idhex = s.substring(4, 10); //вырезаем hex 8бит
unsigned long number = strtoul(idhex.c_str(), NULL, 16); //перевести строку с hex значением в int
//c_str() конвертировать string в char
LCD.init();
LCD.backlight(); // Включаем подсветку
LCD.clear();
// LCD.setCursor(1, 0);
// LCD.print("RFID 125кГц ?:");
// LCD.setCursor(0, 1);
// LCD.print(s);
// delay(2000);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("125kH HEX="+idhex);
LCD.setCursor(0, 1);
str = (String)number;
while(str.length() < 10 )
{ // добавляю ноль перед числом до 10 и преобразовываю в строку
if (str.length() < 10) str = '0' + str;
}
LCD.print("Nomer "+str);
Serial.println(str);//DEC
Serial.println(idhex); //"125kH HEX="
// LCD.print(number);
// LCD.printf("a =%010d", number);
digitalWrite(pin07, HIGH); //откл реле
digitalWrite(ledPin, led_state); // гасим свет
for (int i=0; i<3;i++) { tone(4, 300, 200);tone(4, 200, 300); }
s = "";
none = 0;
tagNumber[0] = 0;
}
} //чужой
clearBufferArray();
count = 0;
}
} //loop
boolean checkTag(String tag){
char testTag[14];
for (int i = 0; i < sizeof(tag_table)/2; i++)
{strcpy_P(testTag, (char*)pgm_read_word(&(tag_table[i])));
if(tag.substring(1,13)==testTag){
namefio = (char*)pgm_read_word(&(name_table[i]));
return true;
break;}
}
return false;}
void clearBufferArray(){for (int i=0; i<count;i++) { buffer[i]=NULL;}}