/* Skrivit och ihopklippt av: Markus Jakobsson www.Automatiserar.se Lösningen möjliggör RFID till Vera Lite på ett mycket enkelt sätt. I nuvarande version så hårdkodas taggarna i Arduinon, senare så ska detta flyttas direkt till RFID läsaren eller till Veran. För att lägga till egna taggar så skicka på firmwaren och kontrollera vad din tagg rapporterar under loopen "Ogiltig tag hittad" 12312123 följande placerar du sedan under korrekt tagg. Ethernet RFID Knapp Dioder Tänk på att ändra följande: KorrektaTaggar Mac address IP Address server - IP till din vera controller. Ändra båda länkar nedan så att ID stämmer med id inne i din vera. dvs DeviceNum="Ditt ID" MyWebRequest1 = "GET /data_request?id=variableset&DeviceNum=43&serviceId=urn:upnp-org:serviceId:VSwitch1&Variable=Status&Value=1 HTTP/1.1"; MyWebRequest1 = "GET /data_request?id=variableset&DeviceNum=43&serviceId=urn:upnp-org:serviceId:VSwitch1&Variable=Status&Value=0 HTTP/1.1"; */ #include #include #include SoftwareSerial mySerial(2, 3); //pin2 Rx, pin3 Tx const int ledRedPin = 4; // röd diod const int ledGreenPin = 5; // grön diod const int buttonPin = 6; // tryckknapp. int ledRedState = LOW; // startar dioderna stängda int ledGreenState = LOW; // startar dioderna stängda int buttonState; // dvs om knappen är nertryckt för larmning. String MyCurrentMode; // sätter vilket läge knappen ska ha boolean lastAlarmMode = false; // sätter vilket läge alarmet senast hade int CMD[64]; // Here the Max command length is set as 64 bytes. For example, Command “AB 02 01” is 3 bytes int comlen =0; int out_flag =0; String korrektaTaggar0 = "1234567891"; // Tagg1 String korrektaTaggar1 = "1234567891"; // Tagg2 String korrektaTaggar2 = "1234567891"; // Tagg3 String korrektaTaggar3 = "1234567891"; // Tagg4 String korrektaTaggar4 = "1234567891"; // Tagg5 String MyWebRequest0 = ""; // connection strängen String MyWebRequest1 = ""; // connection strängen boolean KorrektTaggHittad = false; // körs för att verifiera att man enbart kan köra riktiga taggar. // Newer Ethernet shields have a MAC address printed on a sticker on the shield byte mac[] = { 0xDE, 0xAD, 0xBE, 0xBB, 0x10, 0xAA }; // Byt till en egen mac eller använd samma (0x00 - 0xFF är giltiga) char server[] = "10.10.10.11"; // Verans IP // Set the static IP address to use if the DHCP fails to assign IPAddress ip(10,10,10,10); EthernetClient client; void setup() { pinMode(buttonPin, INPUT); pinMode(ledRedPin, OUTPUT); pinMode(ledGreenPin, OUTPUT); digitalWrite(ledRedPin, ledRedState); digitalWrite(ledGreenPin, ledGreenState); // Open serial communications and wait for port to open: Serial.begin(9600); mySerial.listen(); Serial.println("Open rfid Reader:\n"); mySerial.begin(9600); delay(40); mySerial.write(0x02); // sätter rfid läsaren i read mode, dvs alla taggar skickas vidare. if (mySerial.available()) Serial.println("RFID Reader Ready"); // start the Ethernet connection: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); // no point in carrying on, so do nothing forevermore: // try to congifure using IP address instead of DHCP: Ethernet.begin(mac, ip); } // give the Ethernet shield a second to initialize: delay(1000); Serial.println("Setup Done!... Hoppar vidare"); } void loop() { int a = SerialReadHexDigit(); if(a>=0){ CMD[comlen] = a; comlen++; } delay(10); //} for(int i=0; i0) { // Testar att skicka till taggen if (client.connect(server, 3480)) { Serial.println(""); Serial.println("connected"); //String MyCurrentMode; buttonState = digitalRead(buttonPin); Serial.println(buttonState); // skickar ut status på knappen... // om knappen är nertryckt if (buttonState == HIGH){ // här är knappen nertryckt, dvs URL:en ska här registreras som Larm PÅ (dvs 1) Serial.println("buttonState Borde vara HIGH: " + buttonState); MyCurrentMode = "1"; MyWebRequest1 = "GET /data_request?id=variableset&DeviceNum=43&serviceId=urn:upnp-org:serviceId:VSwitch1&Variable=Status&Value=1 HTTP/1.1"; } else { // här är knappen inte nertryckt, dvs URL:en ska här registreras som Larm AV (dvs 0) Serial.println("buttonState Borde vara LOW: " + buttonState); MyCurrentMode = "0"; MyWebRequest1 = "GET /data_request?id=variableset&DeviceNum=43&serviceId=urn:upnp-org:serviceId:VSwitch1&Variable=Status&Value=0 HTTP/1.1"; } // Kollar om någon av de 5 taggarna är ok. if (korrektaTaggar0 == MyTagg){KorrektTaggHittad = true;} if (korrektaTaggar1 == MyTagg){KorrektTaggHittad = true;} if (korrektaTaggar2 == MyTagg){KorrektTaggHittad = true;} if (korrektaTaggar3 == MyTagg){KorrektTaggHittad = true;} if (korrektaTaggar4 == MyTagg){KorrektTaggHittad = true;} if (KorrektTaggHittad){ // Adderar här Led styrningen: if (MyCurrentMode == "1"){ int ledGreenState = HIGH; // adderades i nya koden int ledRedState = LOW; // adderades i nya koden Serial.println("KorrektTagg Larm ON - Aktiverar Dioder"); digitalWrite(ledGreenPin, ledGreenState); digitalWrite(ledRedPin, ledRedState); lastAlarmMode = true; } else { int ledGreenState = LOW; // adderades i nya koden int ledRedState = HIGH; // adderades i nya koden Serial.println("KorrektTagg Larm OFF - Deaktiverar Dioder "); digitalWrite(ledRedPin, ledRedState); digitalWrite(ledGreenPin, ledGreenState); lastAlarmMode = false; } // detta körs bara om en tagg som finns med i listan hittas. Serial.print("skickade data "); Serial.println(MyWebRequest1); client.println(MyWebRequest1); client.println("Host: mastern"); client.println("Connection: close"); client.println(); client.stop(); delay(1000); // lägger en delay så att taggen inte ska läsas flera gånger. } else { // här måste man spara ut hur dioderna såg ut innan man visade taggen. int TempStateRed = ledRedState; // sparar ut diodernas nuvarande läge int TempStateGreen = ledGreenState; // sparar ut diodernas nuvarande läge digitalWrite(ledRedPin, LOW); // Nollar dioder digitalWrite(ledGreenPin, LOW); // Nollar dioder Serial.println("Ogiltig tag hittad: " + MyTagg); ledRedState = LOW; // adderades i nya koden digitalWrite(ledRedPin, ledRedState); delay(500); ledRedState = HIGH; // adderades i nya koden digitalWrite(ledRedPin, ledRedState); delay(500); ledRedState = LOW; // adderades i nya koden digitalWrite(ledRedPin, ledRedState); delay(500); ledRedState = HIGH; // adderades i nya koden digitalWrite(ledRedPin, ledRedState); delay(500); ledRedState = LOW; // adderades i nya koden digitalWrite(ledRedPin, ledRedState); delay(500); ledRedState = HIGH; // adderades i nya koden digitalWrite(ledRedPin, ledRedState); delay(500); ledRedState = LOW; // adderades i nya koden digitalWrite(ledRedPin, ledRedState); if (lastAlarmMode){ int ledGreenState = HIGH; // adderades i nya koden int ledRedState = LOW; // adderades i nya koden Serial.println("FelTagg - Senaste Larm va ON - Aktiverar Dioder Igen"); digitalWrite(ledGreenPin, ledGreenState); digitalWrite(ledRedPin, ledRedState); } else { // har en tagg aktiverat larmet eller stängt så dioderna åter tändas till röd. int ledGreenState = LOW; // adderades i nya koden int ledRedState = HIGH; // adderades i nya koden Serial.println("FelTagg - Senaste Larm va OFF - Deaktiverar Dioder"); digitalWrite(ledRedPin, ledRedState); digitalWrite(ledGreenPin, ledGreenState); } client.println("Host: mastern"); client.println("Connection: close"); client.println(); client.stop(); } } else { Serial.println("Kunde EJ KOPPLA UPP!!!"); client.println("Connection: close"); client.println(); client.stop(); } // Slut taggen MyTagg = ""; KorrektTaggHittad = false; // sätter värdet till false så att andra taggar inte fungerar. Serial.println(); out_flag = 0; } } // slut på loopen int SerialReadHexDigit() { byte c = (byte) Serial.read(); if (c >= '0' && c <= '9') { return c - '0'; } else if (c >= 'a' && c <= 'f') { return c - 'a' + 10; } else if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } else { return -1; // getting here is bad: it means the character was invalid } }