diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/Logigramme.dia b/Logigramme.dia old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/code/.gitkeep b/code/.gitkeep old mode 100644 new mode 100755 diff --git a/code/cat_on_diet_feeder/cat_on_diet_feeder.ino b/code/cat_on_diet_feeder/cat_on_diet_feeder.ino new file mode 100644 index 0000000..6eca6e4 --- /dev/null +++ b/code/cat_on_diet_feeder/cat_on_diet_feeder.ino @@ -0,0 +1,300 @@ +// Source : http://tronixstuff.com/2013/11/19/arduino-tutorials-chapter-15-rfid/ +// with just a mod to print the tag nb before "Accepted"/"Rejected" + +#include +#include +#include + +//Pin definitions +#define RED_LED 12 +#define GREEN_LED 13 +#define RFID_RX 2 +#define RFID_TX 3 +#define PROG_BUTTON 4 +#define SERVO_CTRL 5 + +// Others parameters +#define SERVO_SPEED 2 +#define SERVO_PWR_TIME 500 //time to stop powering servomotor after the end of move +#define DOOR_OPENED_TIME 3000 +#define EMPTY_TAG {0,0,0,0,0,0,0,0,0,0,0,0,0,0} +#define UNWRITTEN_TAG {255,255,255,255,255,255,255,255,255,255,255,255,255,255} + +//Globals declarations + +SoftwareSerial RFID(RFID_RX, RFID_TX); // RX and TX +Servo door_servo; + +int data1 = 0; +int tag_ok = -1; +byte servo_pos = 180; +bool door_state = 0; // door opened ? +bool door_move = false; // door moving ? +long door_timer = 0; // timer to close the door +long servo_timer = 0; //timer to stop powering servomotor +long red_led_timer = 0; + +byte tag1[14] = {2,52,54,48,48,57,49,48,57,56,48,53,69,3}; +byte newtag[14] = EMPTY_TAG; // used for read comparisons +const byte emptytag[14] = EMPTY_TAG; +const byte unwrittentag[14] = UNWRITTEN_TAG; + +byte * readeepromtag(short tagnb=0) { + // Read the n-th RFID tag in EEPROM + + //First check if the # of tag is out of the capacity of EEPROM + //Return an null tag if so. + if ((tagnb+1)*14 > EEPROM.length()) { + Serial.print(F("Error: Tag Nb to high : ")); + Serial.println(tagnb); + byte tag[14] = EMPTY_TAG; + return tag; + } + byte tag[14] = EMPTY_TAG; + for (int i=0; i<14; i++) + { + tag[i]=EEPROM.read(i + tagnb*14); + delay(2); //small delay to avoid misreading + } + return tag; +} + +int maxeepromtags() { + // Return maximum number of tag that can be stored in EEPROM + return EEPROM.length() / 14; +} + +boolean comparetag(byte taga[14], byte tagb[14]) { + // Compare two RFID tag + int x = 0; + for (int i = 0 ; i < 14 ; i++) + { + if (taga[i] == tagb[i]) x++; + } + return (x == 14); +} + +int findtag(byte searchtag[14]) { + //Find a given tag in EEPROM + + byte *tag; + + for (int i=0; i < maxeepromtags(); i++) + { + tag = readeepromtag(i); + if (comparetag(tag, searchtag)) return i; + } + return -1; +} + +void setup() { +// start serial to PC + Serial.begin(115200); + + // start serial to RFID reader + RFID.begin(9600); + // empty the data cache + while (RFID.available()) { + RFID.read(); + } + + //attaches servo + door_servo.attach(SERVO_CTRL); + + // for status LEDs + pinMode(GREEN_LED, OUTPUT); + pinMode(RED_LED, OUTPUT); + + //Mode for button and end-stop + pinMode(PROG_BUTTON, INPUT_PULLUP); + + Serial.print(F("EEPROM length : ")); + Serial.print(EEPROM.length()); + Serial.print(F(" bytes (")); + Serial.print(maxeepromtags()); + Serial.println(F(" tags)")); + Serial.println(findtag(newtag)); + Serial.println(findtag(unwrittentag)); + + for(byte n=0; n0) break; + } + + // now do something based on tag type + if (tag_ok > 0) tagOK(); + else tagNoOK(); + + // empty the data cache + while (RFID.available()) { + RFID.read(); + } +} + +void disableServo() { + //Disable servomotor once they stop moving + if (!door_move and servo_timer < millis() and door_servo.attached()) { + door_servo.detach(); + Serial.println(F("Servo disabled")); + } +} + +void updateDoor() { + //Check if the need to move and move it + + //Apply door status + if (door_state) { + digitalWrite(GREEN_LED, HIGH); + digitalWrite(RED_LED, LOW); + if (servo_pos >= 180) { + //if door has to be open and already open, disable servomotor + disableServo(); + if (door_move) { + Serial.println(F("Door : opened")); + door_timer = millis() + DOOR_OPENED_TIME; + servo_timer = millis() + SERVO_PWR_TIME; + door_move = false; + } + } + else { + //Keep opening the door + door_move = true; + servo_pos += SERVO_SPEED; + door_servo.attach(SERVO_CTRL); + door_servo.write(servo_pos); + Serial.print(F("Door : opening ")); + Serial.println(servo_pos); + } + //Check opened-door timer + if (millis() < door_timer) + { + Serial.print(F("Door timer :")); + Serial.println(door_timer - millis()); + } + else if (!door_move) + { + door_state = 0; + } + } + else { + digitalWrite(GREEN_LED, LOW); + if (servo_pos <= 0) { + //if door has to be open and already open, disable servomotor + disableServo(); + if (door_move) { + Serial.println(F("Door : closed")); + digitalWrite(RED_LED, LOW); + servo_timer = millis() + SERVO_PWR_TIME; + door_move = false; + } + } + else { + //Keep closing the door + door_move = true; + servo_pos -= SERVO_SPEED; + door_servo.attach(SERVO_CTRL); + door_servo.write(servo_pos); + Serial.print(F("Door : closing ")); + Serial.println(servo_pos); + } + } +} + +void updateRedLED() { + //Check the redLED timer and turn ON or OFF the LED + if (millis() < red_led_timer) { + digitalWrite(RED_LED, HIGH); + Serial.print(F("Red LED timer : ")); + Serial.println(red_led_timer - millis()); + } + else digitalWrite(RED_LED, LOW); +} + +void addNewTag(byte tag[14]) { + Serial.print(F("Adding new tag to EEPROM : ")); + for (int z = 0; z < 14 ; z++) Serial.print(tag[z]); +} + +void delTag(byte tag[14]) { + Serial.print(F("Deleting tag from EEPROM : ")); + for (int z = 0; z < 14 ; z++) Serial.print(tag[z]); +} + +void loop() { + tag_ok = -1; + + if (RFID.available() > 0 and !door_state ) readRFID(); + + updateDoor(); + + updateRedLED(); + + delay(10); +} diff --git a/images/.gitkeep b/images/.gitkeep old mode 100644 new mode 100755 diff --git a/images/schema_synoptique.png b/images/schema_synoptique.png old mode 100644 new mode 100755 diff --git a/plans/boitier-concept.fcstd b/plans/boitier-concept.fcstd old mode 100644 new mode 100755 diff --git a/plans/boitier-proto.fcstd b/plans/boitier-proto.fcstd old mode 100644 new mode 100755