RFID + bluetooth deurslot

Hallo,

Ik ben bezig met de deur van mijn slaapkamer te voorzien van een elektronisch deurslot via een servomotor en 3D-geprinte onderdelen voor het slot.
Ik heb een arduino nano met daaraan gekoppeld een HC-05 bluetooth module en een MFRC522 RFID lezer.
Ik heb beide apart getest en ik kan het slot openen en sluiten.
Maar als ik beide codes bij elkaar voeg, lukt het niet.

Kan er iemand naar mijn code kijken wat er fout is en verbeteren? Ik heb al een topic gemaakt in het Engelstalig gedeelte, maar blijkbaar heeft niemand zin daar om er naar te kijken.

Dit is mijn code:

#include <SPI.h>
#include <SoftwareSerial.h>
#include <MFRC522.h>
#include <Servo.h> 
#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

String read_rfid;
String ok_rfid_1="909987ab"; //add as many as you need.
String ok_rfid_2="85aaba5";
String ok_rfid_3="13d4b228";
String ok_rfid_4="9ab7b97f";
String ok_rfid_5="33578aa7";
String ok_rfid_6="b2bc71d";


Servo myservo;  // create servo object to control a servo 
int posClosed = 0;    // variable to store the servo position for locked
int posOpen = 360;    //same for open...
int bluetoothTx = 0; 
int bluetoothRx = 1; 
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);

/*
 * Initialize.
 */
void setup() {
    Serial.begin(9600);         // Initialize serial communications with the PC
  bluetooth.begin(9600);
    while (!Serial);            // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();                // Init SPI bus
    mfrc522.PCD_Init();         // Init MFRC522 card

    myservo.attach(3);  // attaches the servo on pin 3 to the servo object 
}

/*
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) {
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) {
        read_rfid=read_rfid + String(buffer[i], HEX);
    }
}

void open_lock() {
 
  
  //Use this routine when working with Servos.
 myservo.write(90); 
 delay(2000);
myservo.write(0);
}

void loop() {


      // Look for new cards

      
    if ( ! mfrc522.PICC_IsNewCardPresent()){
            //Read from bluetooth and write to usb serial
 if(bluetooth.available()> 0 ) // receive number from bluetooth
 {
  int servopos = bluetooth.read(); // save the received number to servopos
  Serial.println(servopos); // serial print servopos current number received from bluetooth
  myservo.write(servopos); // roate the servo the angle received from the android app
   
  }}

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial())
return;

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println(read_rfid);
    
    if ((read_rfid==ok_rfid_1)||(read_rfid==ok_rfid_2)||(read_rfid==ok_rfid_3)||(read_rfid==ok_rfid_4)||(read_rfid==ok_rfid_5)||(read_rfid==ok_rfid_6))  {
   
    
  open_lock();
        }}

Mijn tweede versie:

#include <SPI.h>
#include <SoftwareSerial.h>
#include <MFRC522.h>
#include <Servo.h> 
#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

String read_rfid;
String ok_rfid_1="909987ab"; //add as many as you need.
String ok_rfid_2="85aaba5";
String ok_rfid_3="13d4b228";
String ok_rfid_4="9ab7b97f";
String ok_rfid_5="33578aa7";
String ok_rfid_6="b2bc71d";


Servo myservo;  // create servo object to control a servo 
int posClosed = 0;    // variable to store the servo position for locked
int posOpen = 360;    //same for open...
int bluetoothTx = 0; // bluetooth tx to 0 pin
int bluetoothRx = 1; // bluetooth rx to 1 pin
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);

/*
 * Initialize.
 */
void setup() {
    Serial.begin(9600);         // Initialize serial communications with the PC
  bluetooth.begin(9600);
    while (!Serial);            // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();                // Init SPI bus
    mfrc522.PCD_Init();         // Init MFRC522 card

    myservo.attach(3);  // attaches the servo on pin 3 to the servo object 
}

/*
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) {
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) {
        read_rfid=read_rfid + String(buffer[i], HEX);
    }
}

void open_lock() {
 
  
  //Use this routine when working with Servos.
 myservo.write(90); 
 delay(2000);
myservo.write(0);
}

void loop() {

// Look for new cards
bool flag = false;
 if (mfrc522.PICC_IsNewCardPresent())
{
						

// Select one of the cards
if (mfrc522.PICC_ReadCardSerial())
{

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println(read_rfid);
    
    if ((read_rfid==ok_rfid_1)||(read_rfid==ok_rfid_2)||(read_rfid==ok_rfid_3)||(read_rfid==ok_rfid_4)||(read_rfid==ok_rfid_5)||(read_rfid==ok_rfid_6))  {
    flag=true;

}

if (!flag)

     //Read from bluetooth and write to usb serial
 if(bluetooth.available()> 0 ) // receive number from bluetooth
 {
  int servopos = bluetooth.read(); // save the received number to servopos
  Serial.println(servopos); // serial print servopos current number received from bluetooth
  myservo.write(servopos); // roate the servo the angle received from the android app
   
  }}

Wil er iemand aub naar kijken en mij helpen dit op te lossen.
Het is erg frustrerend aangezien ik al alle hardware klaar liggen heb en het zelfs afzonderlijk werkt. Het is nu al paar weken dat ik ermee zit.

Ik heb zelf een aantal weken voor school moeten werken met een RFID scanner en Bluetooth, nou ben ik niet de beste met Arduino, maar ik snap van geen kant hoe je ervoor zorgt dat de RFID scanner jouw pasjes leest.
Ik zou deze gebruiken om je pasjes te lezen, waarschijnlijk werkt die van jou ook gewoon maar toch.

  for (int i = 0; i < 4; i++) {  // 
    leesKaart[i] = mfrc522.uid.uidByte[i];
    Serial.print("Kaart gevonden, ID: ");
    Serial.print(leesKaart[i], HEX);

Ook snap ik niet helemaal waar deze loop vandaan komt… kun je iets meer uitleggen.

if ( ! mfrc522.PICC_IsNewCardPresent()){
            //Read from bluetooth and write to usb serial
 if(bluetooth.available()> 0 ) // receive number from bluetooth
 {
  int servopos = bluetooth.read(); // save the received number to servopos
  Serial.println(servopos); // serial print servopos current number received from bluetooth
  myservo.write(servopos); // roate the servo the angle received from the android app
   
  }}

Ik heb de voorbeeld libraries gebruikt voor de rfid mfrc522. In de examples doen ze het ook zo en het werkt bij mij. Maar niet als ik er bluetooth aan toevoeg.

Dit zijn mijn programma’s:

My code voor bluetooth die werkt:

#include <Servo.h> 
 
Servo servo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
const int servoPin = 3;
int pos = 0;    // variable to store the servo position 

 
void setup() 
{   
  servo.attach(servoPin);
  Serial.begin(9600);  // initialize serial:  
 
  
  Serial.print("Arduino control Servo Motor Connected OK");
  Serial.print("\n");
} 
 
void loop() 
{  
  // if there's any serial available, read it:
  while (Serial.available() > 0) {
   
    // look for the next valid integer in the incoming serial stream: 
    
    pos = Serial.parseInt(); 
   
    // look for the newline. That's the end of your  sentence:
    if (Serial.read() == '\n') {
               
       servo.write(pos);              // tell servo to go to position in variable 'pos' 
       delay(15);                       // waits 15ms for the servo to reach the position
      
 

       
    }
  }
}

RFID code die werkt:

#include <SPI.h>

#include <MFRC522.h>
#include <Servo.h> 
#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

String read_rfid;
String ok_rfid_1="909987ab"; //add as many as you need.
String ok_rfid_2="85aaba5";
String ok_rfid_3="13d4b228";
String ok_rfid_4="9ab7b97f";
String ok_rfid_5="33578aa7";
String ok_rfid_6="b2bc71d";


Servo myservo;  // create servo object to control a servo 
int posClosed = 0;    // variable to store the servo position for locked
int posOpen = 360;    //same for open...


/*
 * Initialize.
 */
void setup() {
    Serial.begin(9600);         // Initialize serial communications with the PC

    while (!Serial);            // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();                // Init SPI bus
    mfrc522.PCD_Init();         // Init MFRC522 card

    myservo.attach(3);  // attaches the servo on pin 3 to the servo object 
}

/*
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) {
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) {
        read_rfid=read_rfid + String(buffer[i], HEX);
    }
}

void open_lock() {
 
  
  //Use this routine when working with Servos.
 myservo.write(90); 
 delay(2000);
myservo.write(0);
}

void loop() {

   
      // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println(read_rfid);
    
    if ((read_rfid==ok_rfid_1)||(read_rfid==ok_rfid_2)||(read_rfid==ok_rfid_3)||(read_rfid==ok_rfid_4)||(read_rfid==ok_rfid_5)||(read_rfid==ok_rfid_6))  {
    open_lock();
  
  }}

De loop die jij vraagt om uit te leggen, daar zit het probleem volgens mij.

In mijn engelstalig topic zeiden ze mij dat die returns in de rfid code voor problemen zorgt want dan gaat hij gwn niet verder en daar kan ik inkomen.
Het probleem zit dat ik niet weet waar ik in mijn main loop de code voor de bluetooth moet inzetten.
Ik heb de returns verwijderd en “else” gebruikt, maar werkt ook niet.
Ook met een flag werkt het ook niet.

Hoi.

"Het werkt niet" is een bijzonder slechte omschrijving van een probleem, of eigenlijk helemaal geen beschrijving. In plaats daarvan zou je veel beter beschrijven wat je verwachtte, en wat je in plaats daarvoor krijgt.

Weet je überhaupt wat een return doet ? Want dat is schijnbaar je probleem. Dus zoek eens uit wat return doet.

Met werkt niet bedoel ik de servomotor roteren zodat de slot open of toe gaat. Beiden afzonderlijk doen de servomotor draaien. Dus via een bluetotoh terminal app geef ik een bepaalde hoek door en de bluetooth module leest dat en geeft het door aan de arduino zodat die de servomotor doet draaien in de gewenste positie.
Idem met de rfid tag: Als er een juiste tag gelezen wordt, gaat de servomotor naar een bepaalde positie draaien om het slot te openen.
Dus beide codes werken perfect afzonderlijk, maar niet als ik ze samenvoeg. Het doet de servomotor dan niet draaien.
Bijgevoegd is een afbeelding van hoe mijn opstelling is, enkel de bluetooth module staat er niet op. ik gebruik een HC-05 module en de Rx van de module is verbonden met de Tx vd arduino nano en Tx van de module met de Rx van de arduino nano.

Ik heb opgezocht wat een return doet en het geeft een waarde terug naar de functie die het oproept of het eindigt een functie.
Dus volgens mij zorgen die returns ervoor dat het bluetooth gedeelte geen kans krijgt om iets te doen, want die return zorgt ervoor dat de functie beëindigd wordt als er geen rfid tag is.

Maar ik snap wel niet waarom die returns dan wel mogen als er geen bluetooth gedeelte is, dus als er enkel een rfid module is, dan werkt die code wel perfect met die returns.

Dus in dit stukje als hij GEEN kaart detecteert, wordt de functie beëindigd en gaat hij niet voort, dus tot zover goed.

 // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
    return;

Ik snap dit gedeelte niet:
Er staat: “if not mfrc522.PICC_ReadCardSerial())”. Waarom die “not” (uitroepteken)? Moet dat gewoon
" if (mfrc522.PICC_ReadCardSerial())" niet zijn?

 // Select one of the cards
       if ( ! mfrc522.PICC_ReadCardSerial())
       {
        dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
        Serial.println(read_rfid);
        }

Dit is mijn poging tot verbetering van de code: de returns zijn eruit en na de “ifs” heb ik een else erachter gezet zodat hij de bluetooth info leest als er geen rfid tags te lezen zijn.

#include <SPI.h>

#include <MFRC522.h>
#include <Servo.h> 
#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

String read_rfid;
String ok_rfid_1="909987ab"; //add as many as you need.
String ok_rfid_2="85aaba5";
String ok_rfid_3="13d4b228";
String ok_rfid_4="9ab7b97f";
String ok_rfid_5="33578aa7";
String ok_rfid_6="b2bc71d";

const int servoPin = 3;
int pos = 0;    // variable to store the servo position 

Servo myservo;  // create servo object to control a servo 
int posClosed = 0;    // variable to store the servo position for locked
int posOpen = 360;    //same for open...


/*
 * Initialize.
 */
void setup() 
{
    Serial.begin(9600);         // Initialize serial communications with the PC
    Serial.print("Arduino control Servo Motor Connected OK");
     Serial.print("\n");
  
    while (!Serial);            // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();                // Init SPI bus
    mfrc522.PCD_Init();         // Init MFRC522 card

    myservo.attach(3);  // attaches the servo on pin 3 to the servo object 
}

/*
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) 
{
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) 
    {
        read_rfid=read_rfid + String(buffer[i], HEX);
    }
}

void open_lock() 
{
  
  //Use this routine when working with Servos.
  myservo.write(90); 
  delay(2000);
  myservo.write(0);
}

void loop() 
{

 
   
      // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
    {
      

      // Select one of the cards
       if ( ! mfrc522.PICC_ReadCardSerial())
       {
        dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
        Serial.println(read_rfid);
        }

          if ((read_rfid==ok_rfid_1)||(read_rfid==ok_rfid_2)||(read_rfid==ok_rfid_3)||(read_rfid==ok_rfid_4)||(read_rfid==ok_rfid_5)||(read_rfid==ok_rfid_6)) 
          {
            open_lock();
          }
    }
    
    else
    {
      // if there's any serial available, read it:
      if (Serial.available() > 0) 
      {
   
        // look for the next valid integer in the incoming serial stream: 
    
        pos = Serial.parseInt(); 
       }
   
          // look for the newline. That's the end of your  sentence:
         if (Serial.read() == '\n') 
        {
               
           myservo.write(pos);              // tell servo to go to position in variable 'pos' 
           delay(15);                       // waits 15ms for the servo to reach the position
        }
    }
}

Sorry voor deze vraag die off-topic is, maar met welk programma heb je die foto gemaakt van je bijlage ‘RFID.jpg’?

Dat is FRITZING daarmee kun je heel handig dit soort schema’s maken.

Ik heb na lang zoeken het werkend gekregen met volgende stukje code. (Ik kan zowel bluetooth als rfid gebruiken om de servomotor te doen roteren)

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h> 
#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

String read_rfid;
String ok_rfid_1="909987ab"; //add as many as you need.
String ok_rfid_2="85aaba5";
String ok_rfid_3="13d4b228";
String ok_rfid_4="9ab7b97f";
String ok_rfid_5="33578aa7";
String ok_rfid_6="b2bc71d";

const int servoPin = 3;
int pos = 0;    // variable to store the servo position 
Servo myservo;  // create servo object to control a servo 
int posClosed = 0;    // variable to store the servo position for locked
int posOpen = 360;    //same for open...

void setup() 
{
    Serial.begin(9600);         // Initialize serial communications with the PC
    Serial.print("Arduino control Servo Motor Connected OK");
    Serial.print("\n");
    while (!Serial);            // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();                // Init SPI bus
    mfrc522.PCD_Init();         // Init MFRC522 card
    myservo.attach(3);  // attaches the servo on pin 3 to the servo object 
}

/*
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) 
{
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) 
    {
        read_rfid=read_rfid + String(buffer[i], HEX);
    }
}

void open_lock() 
{
  //Use this routine when working with Servos.
  myservo.write(0); 
  delay(2000);
}

void loop() 
{
      // Look for new cards
    if (mfrc522.PICC_IsNewCardPresent())
    {
    // Select one of the cards
    if (mfrc522.PICC_ReadCardSerial())
     {   
    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println(read_rfid);
    }
    if ((read_rfid==ok_rfid_1)||(read_rfid==ok_rfid_2)||(read_rfid==ok_rfid_3)||(read_rfid==ok_rfid_4)||(read_rfid==ok_rfid_5)||(read_rfid==ok_rfid_6))  
    {
    open_lock();
    }
    } 
      else
    {
      if (!mfrc522.PICC_IsNewCardPresent())
      // if there's any serial available, read it:
      if (Serial.available() > 0) 
      {
        // look for the next valid integer in the incoming serial stream: 
        pos = Serial.parseInt(); 
       }
          // look for the newline. That's the end of your  sentence:
         if (Serial.read() == '\n') 
        {  
           myservo.write(pos);              // tell servo to go to position in variable 'pos' 
           delay(15);                       // waits 15ms for the servo to reach the position
        }
    }  
}

Waarschijnlijk is er een conflict tussen de bibiotheken "Servo" en "SerialSoft".

https://forum.arduino.cc/index.php?topic=358183.30

Hoi.

Je ontwijkt het probleem met return door die simpelweg weg te halen, maar lost het daarmee niet op.
Het is onwaarschijnlijk dat dit nu werkt zoals de bedenker van het voorbeeld heeft bedoeld.

Als je een return doet, dan stap je dus uit de huidige functie.
Wanneer je dat doet terwijl je variabelen specificeert (die in die functie geldig zijn), dan worden die variabelen overhandigd aan de functie die deze functie die nu dus verlaten word werd opgeroepen (maar alleen als je tijdens het oproepen van die nieuwe functie ook hebt opgegeven dat je variabelen verwacht).
Een functie die vooraf gegaan word door het woord void, geeft niets terug (void betekent leegte).

Dus, wat zou er gebeuren als je vanuit void loop() een return geeft ?
Waar ga je dan heen, en wat geef je dan mee ?

Toegegeven, het voorbeeld is wat zwak en een regelrechte val voor dit probleem (voor zover ik kan zien want ik ken de echte bron niet, alleen wat jij hebt laten zien).

Roep vanuit de loop een functie aan die je RFID afhandelt.
Daarmee los je het probleem zeer waarschijnlijk wel op (maar kom je mogelijk wel weer andere uitdagingen tegen).
En kijk gelijk even of je alles wat in dat voorbeeld staat ook nodig hebt.
Een niet aanwezige kaart uitlezen zal vast tot problemen leiden.
En een wel aanwezige kaart die er daarnet ook al was schiet ook niet heel erg op.

Verder heb ik nog best wat aan te merken op je code.
Ik zie ergens een functie staan waar je je servo naar de positie nul stuurt en daar 15 milliseconden op wacht.
En verderop zie ik een stukje in de code staan waar je de servo naar “pos” (nul) stuurt en dan tweeëndertig miljoen keer niets doet.
Mooi, je kunt nu je slot sluiten.
Op twee manieren zelfs.
Het is wel duidelijk dat je nu 2 codes hebt samengevoegd, maar dat je dan ook het slot sluit op 2 verschillende wijzes is wel weer een beetje jammer en niet zo heel efficiënt, dat kan mooier.

Deze code is er voor om een slot te sluiten met je kaarten of via BT en je vertelde dat het nu werkt.
Als het slot gesloten is, dan blijft ie wel tot in de eeuwigheid op slot, maar das vast wat je wilde doen, toch ?

Dit is de informatie die ik uit je code en de commentaren haal.
Ik weet dat er ergens iets niet klopt, maar geen idee wat dat dan moge zijn…

Heel erg bedankt voor je uitgebreide antwoord, stel ik erg op prijs.

Om hierop te antwoorden:

"Dus, wat zou er gebeuren als je vanuit void loop() een return geeft ? Waar ga je dan heen, en wat geef je dan mee ?"

Een return in void loop gaat de functie stoppen. Ik heb gehoord dat dit (return in een void loop zetten) gebruikt wordt om te debuggen. Een functie kan normaal gezien denk ik 1 variabele meegeven, aangezien een void functie niks verwacht, geeft de return ook niks mee.

"En verderop zie ik een stukje in de code staan waar je de servo naar "pos" (nul) stuurt en dan tweeëndertig miljoen keer niets doet." Kun je precies vertellen welk coderegeltje dit doet? Na die "pos=serial.parse(int)" (de positie uitlezen vd bluetooth) gaat hij zorgen dat de servomotor gewoon naar zijn positie gaat na 15ms, of zie ik iets over het hoofd?

"Als het slot gesloten is, dan blijft ie wel tot in de eeuwigheid op slot, maar das vast wat je wilde doen, toch ?" Eigenlijk opent de rfid kaart enkel het slot en met de bluetooth kan ik hem zowel openen als sluiten, en dat is inderdaad wat ik wil. De slot mag gesloten blijven totdat ik een command stuur dat hij moet openen.

Ik ga ook zeker kijken om de code wat mooier te maken met de tips die jij gaf en in de void loop functies oproepen voor de rfid af te handelen. Ik ben momenteel in mijn blok en ik moet toegeven dat ik veel meer ijd aan dit project heb besteed dan ik zou willen. Anyway het is bijna af, en ik zal hier wel een vid posten als het af.

Nogmaals bedankt voor je opmerkingen, ze hebben me op een korte tijd veel inzicht gegeven.

Hoi.

Ik stel mijn antwoorden over het algemeen behoorlijk zorgvuldig samen. Zo ook het voorgaande antwoord. Dat doe ik om de vraagsteller aan het denken te zetten. Zie je die laatste regel in die post ?

Natuurlijk weet ik echt wel wat er niet klopt aan mijn beschrijving van je sketch. Maar de informatie in de sketch, dus code plus commentaren leveren de beschrijving op die in de een na laatste alinea staat. Jouw beschrijvingen van wat je wil stroken daar niet mee. Zulke dingen worden veroorzaakt doordat de commentaren niet (meer) kloppen. In dit geval komt dat doordat je niet 2, maar meerdere codes hebt gemixt. En van 1 daarvan is de aansturing van je slot origineel net iets anders als hoe jij het nu (zowel mechanisch als met de code) hebt gemaakt. Wanneer je commentaren in je code hebt, moet je er voor zorgen dat die kloppen of ze weglaten. Anders heb je er helemaal niets aan.

Je zegt dat je het slot kunt openen en sluiten met je code, maar dat is niet zichtbaar in de code die je hebt gedeeld. Daar word de servo namelijk maar naar 1 positie gestuurd, en wel op 2 verschillende manieren.

In dit stukje gaat je slot in een andere stand staan en doe je 32 000 000 keer niets:

{
  //Use this routine when working with Servos.
  myservo.write(0);
  delay(2000);
}

Daar staat dus niet "pos" bij, maar wel nul en das hetzelfde, toch ?

Na die "pos=serial.parse(int)" (de positie uitlezen vd bluetooth) gaat hij zorgen dat de servomotor gewoon naar zijn positie gaat na 15ms, of zie ik iets over het hoofd?

Dat is niet wat er in de code staat:

{ 
           myservo.write(pos);              // tell servo to go to position in variable 'pos'
           delay(15);                       // waits 15ms for the servo to reach the position
        }

Hier staat dat je servo ergens heen word gestuurd, en vervolgens 240 000 keer niets doet (dat duurt 15 milliseconden). Dus niet andersom. Er staat ook bij waarom er word gewacht, maar dat heb je niet meegenomen in je overwegingen. 15 milliseconden is heel kort, maar een zee van tijd voor je controller. Je moet al tegen je deur drukken als je op tijd wil zijn om binnen 15 milliseconden de deur open te krijgen. Maar je servo wordt helemaal niet terug naar de gesloten positie gestuurd, dus dat probleem heb je helemaal niet. Net zo als twee seconden niets doen in dit geval ook geen zin heeft.

Dat stukje met de 2 seconden kun je er uit slopen. Ga gewoon nog een keer naar die [u]functie[/u] om je slot te bedienen.