You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
2.6 KiB
C++
121 lines
2.6 KiB
C++
#include <ESP8266WiFi.h>
|
|
#include <ESP8266WiFiMulti.h>
|
|
#include <ESP8266WebServer.h>
|
|
#include <FS.h>
|
|
|
|
#include <EEPROM.h>
|
|
|
|
#include <ESP8266mDNS.h>
|
|
#include <WiFiUdp.h>
|
|
#include <ArduinoOTA.h>
|
|
|
|
#include <TFT_eSPI.h> // Hardware-specific library
|
|
#include <SPI.h>
|
|
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
|
|
|
|
|
|
ADC_MODE(ADC_VCC);
|
|
|
|
#define RF_PIN 5
|
|
#define ACTIVITY_LED 2
|
|
|
|
static inline int32_t asm_ccount(void) {
|
|
int32_t r; asm volatile ("rsr %0, ccount" : "=r"(r)); return r; }
|
|
|
|
static inline void asm_nop() {
|
|
asm volatile ("nop"); }
|
|
|
|
// Variables used for temporary storage
|
|
static uint8_t data[64];
|
|
static uint8_t value[10];
|
|
|
|
uint32_t uid;
|
|
uint32_t vendor;
|
|
|
|
|
|
void prepare_data(uint32_t ID, uint32_t VENDOR){
|
|
value[0] = (VENDOR>>4) & 0XF;
|
|
value[1] = VENDOR & 0XF;
|
|
for (int i=1; i<8; i++){
|
|
value[i+2] = (ID>>(28-i*4)) &0xF;
|
|
}
|
|
|
|
for (int i=0; i<9; i++) data[i]=1; //header
|
|
for (int i=0; i<10; i++) { //data
|
|
for (int j=0; j<4; j++) {
|
|
data[9 + i*5 +j] = value[i] >> (3-j) & 1;
|
|
}
|
|
data[9 + i*5 + 4] = ( data[9 + i*5 + 0]
|
|
+ data[9 + i*5 + 1]
|
|
+ data[9 + i*5 + 2]
|
|
+ data[9 + i*5 + 3]) % 2;
|
|
}
|
|
for (int i=0; i<4; i++) { //checksum
|
|
int checksum=0;
|
|
for (int j=0; j<10; j++) {
|
|
checksum += data[9 + i + j*5];
|
|
}
|
|
data[i+59] = checksum%2;
|
|
}
|
|
data[63] = 0; //footer
|
|
|
|
/*
|
|
delay(10);
|
|
Serial.println();
|
|
for (int i=0; i<64; i++) {
|
|
Serial.printf("%d", data[i]);
|
|
if (i>=8 && (i+2)%5==0) Serial.printf("\r\n ");
|
|
}
|
|
Serial.println();
|
|
delay(10);
|
|
*/
|
|
}
|
|
|
|
void sendkey(){
|
|
int i=0, j=0;
|
|
for (i=0; i<15; i++){
|
|
for (j=0; j<64; j++){
|
|
data[j]? (GPE |= (1<<RF_PIN)):(GPE &= ~(1<<RF_PIN));
|
|
delayMicroseconds(255);
|
|
for (int k=0; k<14; k++) asm_nop(); //fine tuning
|
|
data[j]? (GPE &= ~(1<<RF_PIN)):(GPE |= (1<<RF_PIN));
|
|
delayMicroseconds(255);
|
|
for (int k=0; k<13; k++) asm_nop(); //fine tuning
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void setup() {
|
|
|
|
tft.init();
|
|
tft.setRotation(1);
|
|
tft.fillScreen(TFT_BLACK);
|
|
|
|
pinMode(RF_PIN, INPUT);
|
|
pinMode(ACTIVITY_LED, OUTPUT);
|
|
digitalWrite(ACTIVITY_LED, LOW);
|
|
}
|
|
|
|
void loop() {
|
|
|
|
|
|
tft.setTextSize(2);
|
|
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
|
tft.drawString("123", 0, 0, 2);
|
|
delay(10000);
|
|
uid=1964417;
|
|
vendor=0;
|
|
|
|
prepare_data(uid, vendor);
|
|
|
|
digitalWrite (ACTIVITY_LED, LOW);
|
|
delay(10);
|
|
sendkey();
|
|
digitalWrite (ACTIVITY_LED, HIGH);
|
|
|
|
} |