Arduino Mega2560 ENC28J60 和 RFID 不工作

Arduino Mega2560 ENC28J60 and RFID not working

我是新来的,所以请不要为我的愚蠢而生气。我有一个项目,我必须读取 RFID UID 代码(这部分就像一个魅力),然后将它发送到连接到 C# 应用程序的数据库,然后接收响应(0 或 1)。我的问题(目前)是arduino不发送任何数据。也许有人可以帮助我?

这是我的arduino代码:

#include <EtherCard.h>

#include <SPI.h>      // RC522 Module uses SPI protocol
#include <MFRC522.h>   // Library for Mifare RC522 Devices
#include <DS1302RTC.h>
#include <Time.h>

static byte mymac[] = {0x74,0xDD,0xDD,0x00,0x00,0x01};
static byte server_IP[] = {192,168,0,102};
static int server_Port = 7745;
byte Ethernet::buffer[600];


// Init the DS1302 (external RTC)
// Set pins:  CE, IO,CLK
DS1302RTC RTC(45, 43, 41);

// Optional connection for RTC module
#define DS1302_GND_PIN 39
#define DS1302_VCC_PIN 37

#define COMMON_ANODE
#define LED_ON HIGH
#define LED_OFF LOW

#define redLed 3
#define greenLed 5
#define blueLed 7
#define relay 4


int successRead; // Variable integer to keep if we have Successful Read from Reader

byte readCard[4];           // Stores scanned ID read from RFID Module


/* We need to define MFRC522's pins and create instance
 * Pin layout should be as follows (on Arduino Mega 2560):
 * MOSI: Pin 51 / ICSP-4
 * MISO: Pin 50 / ICSP-1
 * SCK : Pin 52 / ICSP-3
 * SS : Pin 46 (Configurable)
 * RST : Pin 34 (Configurable)
 * look MFRC522 Library for
 * pin configuration for other Arduinos.
 */

#define SS_PIN1 46
#define RST_PIN1 34
MFRC522 mfrc522(SS_PIN1, RST_PIN1); // Create MFRC522 instance.


///////////////////////////////////////// Setup ///////////////////////////////////
void setup() {
  Serial.begin(9600);  // Initialize serial communications with PC
    Serial.print("MAC: ");
  for (byte i = 0; i < 6; ++i) {
    Serial.print(mymac[i], HEX);
    if (i < 5)
      Serial.print(':');
  }
  Serial.println();
  if (ether.begin(sizeof Ethernet::buffer, mymac, 53)==0) {
    Serial.println( "Failed to access Ethernet controller");
    //while(1); 
  } else Serial.println("Ethernet controller initialized");
 
  if (!ether.dhcpSetup()) {
    Serial.println("Failed to get configuration from DHCP");
    //while(1);
  } else Serial.println("DHCP configuration done:"); 
 
  ether.printIp("My IP: ", ether.myip);
  ether.printIp("Netmask: ", ether.netmask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);
  Serial.println();
  
  ether.copyIp(ether.hisip, server_IP);
  ether.hisport = server_Port;
  
  //Arduino Pin Configuration
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);
  pinMode(relay, OUTPUT);
  digitalWrite(relay, LOW); // Make sure door is locked
  digitalWrite(redLed, LED_OFF); // Make sure led is off
  digitalWrite(greenLed, LED_OFF); // Make sure led is off
  digitalWrite(blueLed, LED_OFF); // Make sure led is off

  //Protocol Configuration
  SPI.begin();           // MFRC522 Hardware uses SPI protocol
  mfrc522.PCD_Init();    // Initialize MFRC522 Hardware
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); //Set Antenna Gain to Max- this will increase reading distance

  // Activate RTC module
  digitalWrite(DS1302_GND_PIN, LOW);
  pinMode(DS1302_GND_PIN, OUTPUT);

  digitalWrite(DS1302_VCC_PIN, HIGH);
  pinMode(DS1302_VCC_PIN, OUTPUT);


  RTC.haltRTC(1); //clock enable (1), clock disable (0)
  RTC.writeEN(0); //Write protection OFF (1), write protection ON (0)

  //Time set
  //setTime(1,19,0,16,12,2014);
  //time_t t = now();
  //RTC.set(t);

  delay(200);
}

///////////////////////////////////////// Main Loop ///////////////////////////////////
void loop () {
  ether.packetLoop(ether.packetReceive());
  do {
    successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0

      normalModeOn(); // Normal mode, blue Power LED is on, all others are off
    
  }
  while (!successRead); //the program will not go further while you not get a successful read
  
  openDoor();

}

///////////////////////////////////////// Get PICC's UID ///////////////////////////////////
int getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
    return 0;
  }
  //Serial.println("Scanned PICC's UID:");
  for (int i = 0; i < 4; i++) {  //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
  }
  Serial.println(readCard[4],HEX);
  char string_temp[7];
  dtostrf (readCard[2], 4, 2, string_temp);
  Stash stash;
  byte sd = stash.create();
  stash.print(string_temp);
  stash.print('\r');
  stash.save();     
  Stash::prepare(PSTR("$H"), sd);
  ether.tcpSend();
    
  Serial.println("Packet sent!");
  
  Serial.println("");
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}

//////////////////////////////////////// Normal Mode Leds  ///////////////////////////////////
void normalModeOn () {
  digitalWrite(blueLed, LED_ON); // Blue LED ON and ready to read card
  digitalWrite(redLed, LED_OFF); // Make sure Red LED is off
  digitalWrite(greenLed, LED_OFF); // Make sure Green LED is off
  digitalWrite(relay, LOW); // Make sure Door is Locked
}


///////////////////////////////////////// Unlock Door   ///////////////////////////////////
void openDoor() {
  digitalWrite(blueLed, LED_OFF); // Turn off blue LED
  digitalWrite(redLed, LED_OFF); // Turn off red LED
  digitalWrite(greenLed, LED_ON); // Turn on green LED
  digitalWrite(relay, HIGH); // Unlock door!
  delay(1000); // Hold door lock open for given seconds
  digitalWrite(relay, LOW); // Relock door
  delay(1000); // Hold green LED on for 2 more seconds
}

///////////////////////////////////////// Failed Access  ///////////////////////////////////
void failed() {
  digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
  digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
  digitalWrite(redLed, LED_ON); // Turn on red LED
  delay(2000);

}

我为 arduino 使用 EtherCard.h 库和 ENC28J60 以太网模块。

ENC28J60 与 Arduino UNO 不兼容,在与其他 SPI 设备一起使用时很可能与 MEGA2560 兼容。

您应该改用使用 W5100 的默认 Arduino Ethernet Shield。

我 运行 遇到了与 ENC28J60 相同的问题,尝试了很多设置并最终得到了 W5100,它可以直接使用默认以太网库。